getchar()/gets() implemented
git-svn-id: http://picoc.googlecode.com/svn/trunk@205 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
70d48e75d7
commit
a414de85e5
1
TODO
1
TODO
|
@ -27,6 +27,7 @@ Improvements:
|
|||
|
||||
Need test/debug:
|
||||
* all break/continue variations
|
||||
* getchar()/gets() tests
|
||||
|
||||
Also:
|
||||
* Remove Var parameter from HeapPopStack() once we're certain it all works
|
||||
|
|
20
clibrary.c
20
clibrary.c
|
@ -161,12 +161,30 @@ void LibPrintf(struct ParseState *Parser, struct Value *ReturnValue, struct Valu
|
|||
}
|
||||
}
|
||||
|
||||
/* get a line of input. protected from buffer overrun */
|
||||
void LibGets(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
||||
{
|
||||
struct Value *CharArray = Param[0]->Val->Pointer.Segment;
|
||||
char *ReadBuffer = CharArray->Val->Array.Data + Param[0]->Val->Pointer.Offset;
|
||||
int MaxLength = CharArray->Val->Array.Size - Param[0]->Val->Pointer.Offset;
|
||||
char *Result;
|
||||
|
||||
ReturnValue->Val->Pointer.Segment = 0;
|
||||
ReturnValue->Val->Pointer.Offset = 0;
|
||||
|
||||
if (Param[0]->Val->Pointer.Offset < 0 || MaxLength < 0)
|
||||
return; /* no room for data */
|
||||
|
||||
Result = PlatformGetLine(ReadBuffer, MaxLength);
|
||||
if (Result == NULL)
|
||||
return;
|
||||
|
||||
ReturnValue->Val->Pointer = Param[0]->Val->Pointer;
|
||||
}
|
||||
|
||||
void LibGetc(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
||||
{
|
||||
ReturnValue->Val->Integer = PlatformGetCharacter();
|
||||
}
|
||||
|
||||
/* list of all library functions and their prototypes */
|
||||
|
@ -174,6 +192,6 @@ struct LibraryFunction CLibrary[] =
|
|||
{
|
||||
{ LibPrintf, "void printf(char *, ...)" },
|
||||
{ LibGets, "void gets(char *, int)" },
|
||||
{ LibGetc, "int getc()" },
|
||||
{ LibGetc, "int getchar()" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
|
1
picoc.h
1
picoc.h
|
@ -326,6 +326,7 @@ void LexFail(struct LexState *Lexer, const char *Message, ...);
|
|||
void PlatformCleanup();
|
||||
void PlatformScanFile(const char *FileName);
|
||||
char *PlatformGetLine(char *Buf, int MaxLen);
|
||||
int PlatformGetCharacter();
|
||||
void PlatformPutc(unsigned char OutCh);
|
||||
void PlatformPrintf(const char *Format, ...);
|
||||
void PlatformVPrintf(const char *Format, va_list Args);
|
||||
|
|
|
@ -37,8 +37,8 @@ void PlatformPutc(unsigned char OutCh)
|
|||
putchar(OutCh);
|
||||
}
|
||||
|
||||
/* write a character to the console */
|
||||
int PlatformGetc()
|
||||
/* read a character */
|
||||
int PlatformGetCharacter()
|
||||
{
|
||||
return getch();
|
||||
}
|
||||
|
|
|
@ -17,6 +17,13 @@ char *PlatformGetLine(char *Buf, int MaxLen)
|
|||
return fgets(Buf, MaxLen, stdin);
|
||||
}
|
||||
|
||||
/* get a character of interactive input */
|
||||
int PlatformGetCharacter()
|
||||
{
|
||||
fflush(stdout);
|
||||
return getchar();
|
||||
}
|
||||
|
||||
/* write a character to the console */
|
||||
void PlatformPutc(unsigned char OutCh)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue