int mc_parse_line(char **line, char **tokens) { char **tokenp = tokens; while(mc_comment(line)) /* skip comment lines */ ; while(mc_token(tokenp, line)) /* collect ';' delim'd tokens */ if(++tokenp - tokens >= MC_TOKEN_MAX) fatal("Ran out of tokens parsing mailcap file"); /* outch! */ *++tokenp = NULL; /* tie off list */ return(*tokens != NULL); }
int yylex (void) { unichar *start_token; unichar ch; if (! input_stream_pos) { fatal ("Input stream not setuped.\n"); return -1; } if (mclex_want_line) { start_token = input_stream_pos; if (input_stream_pos[0] == '.' && (input_stream_pos[1] == '\n' || (input_stream_pos[1] == '\r' && input_stream_pos[2] == '\n'))) { mclex_want_line = FALSE; while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') ++input_stream_pos; if (input_stream_pos[0] == '\n') ++input_stream_pos; return MCENDLINE; } while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') ++input_stream_pos; if (input_stream_pos[0] == '\n') ++input_stream_pos; yylval.ustr = get_diff (input_stream_pos, start_token); return MCLINE; } while ((ch = input_stream_pos[0]) <= 0x20) { if (ch == 0) return -1; ++input_stream_pos; if (ch == '\n') input_line += 1; if (mclex_want_nl && ch == '\n') { mclex_want_nl = FALSE; return NL; } } start_token = input_stream_pos; ++input_stream_pos; if (mclex_want_filename) { mclex_want_filename = FALSE; if (ch == '"') { start_token++; while ((ch = input_stream_pos[0]) != 0) { if (ch == '"') break; ++input_stream_pos; } yylval.ustr = get_diff (input_stream_pos, start_token); if (ch == '"') ++input_stream_pos; } else { while ((ch = input_stream_pos[0]) != 0) { if (ch <= 0x20 || ch == ')') break; ++input_stream_pos; } yylval.ustr = get_diff (input_stream_pos, start_token); } return MCFILENAME; } switch (ch) { case ';': ++start_token; while (input_stream_pos[0] != '\n' && input_stream_pos[0] != 0) ++input_stream_pos; if (input_stream_pos[0] == '\n') input_stream_pos++; yylval.ustr = get_diff (input_stream_pos, start_token); return MCCOMMENT; case '=': return '='; case '(': return '('; case ')': return ')'; case '+': return '+'; case ':': return ':'; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': yylval.ival = parse_digit (ch); return MCNUMBER; default: if (ch >= 0x40) { int ret; while (input_stream_pos[0] >= 0x40 || (input_stream_pos[0] >= '0' && input_stream_pos[0] <= '9')) ++input_stream_pos; ret = mc_token (start_token, (size_t) (input_stream_pos - start_token)); if (ret != -1) return ret; yylval.ustr = get_diff (input_stream_pos, start_token); return MCIDENT; } yyerror ("illegal character 0x%x.", ch); } return -1; }