struct scanner_token * get_scanner_token_debug(struct scanner *scanner) { if (!scanner_has_tokens(scanner)) return NULL; dump_scanner(scanner); /* Make sure we do not return invalid tokens */ assert(!scanner_has_tokens(scanner) || scanner->current->type != 0); return get_scanner_token(scanner); }
int css_parse_background_value(struct css_property_info *propinfo, union css_property_value *value, struct scanner *scanner) { int success = 0; assert(propinfo->value_type == CSS_VT_COLOR); /* This is pretty naive, we just jump space by space, trying to parse * each token as a color. */ while (scanner_has_tokens(scanner)) { struct scanner_token *token = get_scanner_token(scanner); if (!check_css_precedence(token->type, ';')) break; if (token->type == ',' || !css_parse_color_value(propinfo, value, scanner)) { skip_scanner_token(scanner); continue; } success++; } return success; }
void dump_scanner(struct scanner *scanner) { unsigned char buffer[MAX_STR_LEN]; struct scanner_token *token = scanner->current; struct scanner_token *table_end = scanner->table + scanner->tokens; unsigned char *srcpos = token->string, *bufpos = buffer; int src_lookahead = 50; int token_lookahead = 4; int srclen; if (!scanner_has_tokens(scanner)) return; memset(buffer, 0, MAX_STR_LEN); for (; token_lookahead > 0 && token < table_end; token++, token_lookahead--) { int buflen = MAX_STR_LEN - (bufpos - buffer); int added = snprintf(bufpos, buflen, "[%.*s] ", token->length, token->string); bufpos += added; } if (scanner->tokens > token_lookahead) { memcpy(bufpos, "... ", 4); bufpos += 4; } srclen = strlen(srcpos); int_upper_bound(&src_lookahead, srclen); *bufpos++ = '['; /* Compress the lookahead string */ for (; src_lookahead > 0; src_lookahead--, srcpos++, bufpos++) { if (*srcpos == '\n' || *srcpos == '\r' || *srcpos == '\t') { *bufpos++ = '\\'; *bufpos = *srcpos == '\n' ? 'n' : (*srcpos == '\r' ? 'r' : 't'); } else { *bufpos = *srcpos; } } if (srclen > src_lookahead) memcpy(bufpos, "...]", 4); else memcpy(bufpos, "]", 2); errfile = scanner->file, errline = scanner->line; elinks_wdebug("%s", buffer); }