void ESISAPI ESIS_Attr(ESIS_Writer pe, const ESIS_Char *name, const ESIS_Char *val, size_t len) { size_t n; n = strlen(name) + 1U; esisStackPush(pe->S, name, n); if (len == ESIS_NTS) { esisStackPush(pe->S, val, strlen(val) + 1U); } else { esisStackPush(pe->S, val, len); PUSH_CHAR('\0'); } ++pe->n_att; }
int tokenize_whitespace(parser_t *self, size_t line_limit) { int i, slen, start_lines; char c; char *stream; char *buf = self->data + self->datapos; start_lines = self->lines; if (make_stream_space(self, self->datalen - self->datapos) < 0) { self->error_msg = "out of memory"; return -1; } stream = self->stream + self->stream_len; slen = self->stream_len; TRACE(("%s\n", buf)); for (i = self->datapos; i < self->datalen; ++i) { // Next character in file c = *buf++; TRACE(("Iter: %d Char: %c Line %d field_count %d, state %d\n", i, c, self->file_lines + 1, self->line_fields[self->lines], self->state)); switch(self->state) { case EAT_WHITESPACE: if (!IS_WHITESPACE(c)) { // END_FIELD(); self->state = START_FIELD; // Fall through to subsequent state } else { // if whitespace char, keep slurping break; } case START_RECORD: // start of record if (c == '\n') { // \n\r possible? END_LINE(); break; } else if (c == '\r') { self->state = EAT_CRNL; break; } else if (IS_WHITESPACE(c)) { END_FIELD(); self->state = EAT_WHITESPACE; break; } else { /* normal character - handle as START_FIELD */ self->state = START_FIELD; } /* fallthru */ case START_FIELD: /* expecting field */ if (c == '\n') { END_FIELD(); END_LINE(); /* self->state = START_RECORD; */ } else if (c == '\r') { END_FIELD(); self->state = EAT_CRNL; } else if (c == self->quotechar && self->quoting != QUOTE_NONE) { /* start quoted field */ self->state = IN_QUOTED_FIELD; } else if (c == self->escapechar) { /* possible escaped character */ self->state = ESCAPED_CHAR; } /* else if (c == ' ' && self->skipinitialspace) */ /* /\* ignore space at start of field *\/ */ /* ; */ else if (IS_WHITESPACE(c)) { self->state = EAT_WHITESPACE; } else if (c == self->commentchar) { END_FIELD(); self->state = EAT_COMMENT; } else { /* begin new unquoted field */ if (self->quoting == QUOTE_NONNUMERIC) self->numeric_field = 1; // TRACE(("pushing %c", c)); PUSH_CHAR(c); self->state = IN_FIELD; } break; case ESCAPED_CHAR: /* if (c == '\0') */ /* c = '\n'; */ PUSH_CHAR(c); self->state = IN_FIELD; break; case IN_FIELD: /* in unquoted field */ if (c == '\n') { END_FIELD(); END_LINE(); /* self->state = START_RECORD; */ } else if (c == '\r') { END_FIELD(); self->state = EAT_CRNL; } else if (c == self->escapechar) { /* possible escaped character */ self->state = ESCAPED_CHAR; } else if (IS_WHITESPACE(c)) { // End of field. End of line not reached yet END_FIELD(); self->state = EAT_WHITESPACE; } else if (c == self->commentchar) { END_FIELD(); self->state = EAT_COMMENT; } else { /* normal character - save in field */ PUSH_CHAR(c); } break; case IN_QUOTED_FIELD: /* in quoted field */ if (c == self->escapechar) { /* Possible escape character */ self->state = ESCAPE_IN_QUOTED_FIELD; } else if (c == self->quotechar && self->quoting != QUOTE_NONE) { if (self->doublequote) { /* doublequote; " represented by "" */ self->state = QUOTE_IN_QUOTED_FIELD; } else { /* end of quote part of field */ self->state = IN_FIELD; } } else { /* normal character - save in field */ PUSH_CHAR(c); } break; case ESCAPE_IN_QUOTED_FIELD: /* if (c == '\0') */ /* c = '\n'; */ PUSH_CHAR(c); self->state = IN_QUOTED_FIELD; break; case QUOTE_IN_QUOTED_FIELD: /* doublequote - seen a quote in an quoted field */ if (self->quoting != QUOTE_NONE && c == self->quotechar) { /* save "" as " */ PUSH_CHAR(c); self->state = IN_QUOTED_FIELD; } else if (IS_WHITESPACE(c)) { // End of field. End of line not reached yet END_FIELD(); self->state = EAT_WHITESPACE; } else if (c == '\n') { END_FIELD(); END_LINE(); /* self->state = START_RECORD; */ } else if (c == '\r') { END_FIELD(); self->state = EAT_CRNL; } else if (!self->strict) { PUSH_CHAR(c); self->state = IN_FIELD; } else { self->error_msg = (char*) malloc(50); sprintf(self->error_msg, "'%c' expected after '%c'", self->delimiter, self->quotechar); goto parsingerror; } break; case EAT_CRNL: if (c == '\n') { END_LINE(); /* self->state = START_RECORD; */ } else if (IS_WHITESPACE(c)){ // Handle \r-delimited files END_LINE_AND_FIELD_STATE(EAT_WHITESPACE); } else { PUSH_CHAR(c); END_LINE_STATE(IN_FIELD); } break; case EAT_COMMENT: if (c == '\n') { END_LINE(); } else if (c == '\r') { self->state = EAT_CRNL; } break; default: break; } } _TOKEN_CLEANUP(); TRACE(("Finished tokenizing input\n")) return 0; parsingerror: i++; _TOKEN_CLEANUP(); return -1; linelimit: i++; _TOKEN_CLEANUP(); return 0; }