#include #include "mjp.h" #include "csget.h" struct csget { int maxlen; unsigned int flags; #define CSGF_DIGIT 0x00000001 #define CSGF_COLON 0x00000002 #define CSGF_ERROR 0x00000004 int len; int cnt; char *buf; } ; void csget_abort(CSGET *g) { free(g->buf); free(g); } int csget_input(CSGET *g, unsigned char c) { if (g->flags & CSGF_COLON) { g->buf[g->cnt++] = c; return(g->cnt>=g->len); } else { int dv; switch (c) { case '0': dv = 0; break; case '1': dv = 1; break; case '2': dv = 2; break; case '3': dv = 3; break; case '4': dv = 4; break; case '5': dv = 5; break; case '6': dv = 6; break; case '7': dv = 7; break; case '8': dv = 8; break; case '9': dv = 9; break; case ':': g->flags |= CSGF_COLON; g->buf = malloc(g->len+1); g->cnt = 0; return(0); break; case ' ': case '\t': case '\n': case '\r': if (g->flags & CSGF_DIGIT) { g->flags |= CSGF_ERROR; return(1); } return(0); break; default: g->flags |= CSGF_ERROR; return(1); break; } g->flags |= CSGF_DIGIT; g->len = (g->len * 10) + dv; g->cnt ++; if ((g->len > g->maxlen) || (g->cnt > MJP_MAXCSLENLEN)) { g->flags |= CSGF_ERROR; return(1); } return(0); } } int csget_error(CSGET *g) { return(g->flags&CSGF_ERROR); } char *csget_result_nul(CSGET *g) { char *s; s = g->buf; s[g->cnt] = '\0'; free(g); return(s); } char *csget_result_len(CSGET *g, int *lenp) { char *s; s = g->buf; *lenp = g->cnt; free(g); return(s); } CSGET *csget_start(int maxlen) { CSGET *g; g = malloc(sizeof(CSGET)); g->maxlen = maxlen; g->flags = 0; g->len = 0; g->cnt = 0; g->buf = 0; return(g); }