forked from Telodendria/Telodendria
[MOD/FIX] Make the Parser API usable
It should now be good enough for parsing simple grammars(user IDs for example)
This commit is contained in:
parent
20a44a0664
commit
b378d443c0
2 changed files with 59 additions and 5 deletions
43
src/Parser.c
43
src/Parser.c
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include <Cytoplasm/Memory.h>
|
||||
#include <Cytoplasm/Str.h>
|
||||
#include <Cytoplasm/Log.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
@ -72,7 +73,7 @@ ParserEndCopy(Parser * p)
|
|||
{
|
||||
char *ret;
|
||||
size_t len;
|
||||
if (!p || p->mark >= 0)
|
||||
if (!p || p->mark < 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
@ -118,7 +119,44 @@ ParserExceptOneOf(Parser * p, const char * str)
|
|||
p->eof = 1;
|
||||
p->idx--; /* Avoid overflows */
|
||||
}
|
||||
return !!strchr(str, strc);
|
||||
if (strchr(str, strc))
|
||||
{
|
||||
return strc;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ParserGetc(Parser * p)
|
||||
{
|
||||
int c;
|
||||
if (!p || p->eof)
|
||||
{
|
||||
return EOF;
|
||||
}
|
||||
c = p->string[p->idx++];
|
||||
if (!c)
|
||||
{
|
||||
p->eof = 1;
|
||||
p->idx--; /* Avoid overflows */
|
||||
c = EOF;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
void
|
||||
ParserUndo(Parser * p)
|
||||
{
|
||||
if (!p)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!p->idx)
|
||||
{
|
||||
return;
|
||||
}
|
||||
p->eof = 0;
|
||||
p->idx--;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -131,3 +169,4 @@ ParserEnd(Parser * p)
|
|||
Free(p->string);
|
||||
Free(p);
|
||||
}
|
||||
|
||||
|
|
|
@ -53,9 +53,23 @@ extern Parser * ParserCreate(char *);
|
|||
extern int ParserExcept(Parser *, char);
|
||||
|
||||
/**
|
||||
* Returns true if the character at the current position in
|
||||
* the parsing process is one of the characters in the inputted
|
||||
* Gets the currently pointed at character in the parser, then
|
||||
* advances it by one, unless if hit by an EOF.
|
||||
*/
|
||||
extern int ParserGetc(Parser *);
|
||||
|
||||
/**
|
||||
* Rolls back the currently pointed character by one(unless already
|
||||
* at the start.)
|
||||
*/
|
||||
extern void ParserUndo(Parser *);
|
||||
|
||||
/**
|
||||
* Returns a non-zero value if the character at the current position
|
||||
* in the parsing process is one of the characters in the inputted
|
||||
* string, and advances by one character eitherway.
|
||||
*
|
||||
* If non-zero, the return value is the actual character.
|
||||
*/
|
||||
extern int ParserExceptOneOf(Parser *, const char *);
|
||||
|
||||
|
@ -80,4 +94,5 @@ extern char * ParserEndCopy(Parser *);
|
|||
* .Fn ParserCreate .
|
||||
*/
|
||||
extern void ParserEnd(Parser *);
|
||||
|
||||
#endif /* TELODENDRIA_PARSER_H */
|
||||
|
|
Loading…
Reference in a new issue