GEN fetch_var_value(long v, GEN t) { entree *ep = varentries[v]; if (!ep) return NULL; if (t) { long vn = localvars_find(t,ep); if (vn) return get_lex(vn); } return (GEN)ep->value; }
/* Returns: * 1, if new lex has been got; * 0, otherwise. */ int parser_get_lex(parser_info *pinfo) { if (pinfo->cur_lex != NULL) destroy_lex(pinfo->cur_lex, ! pinfo->cur_lex_data_used); pinfo->cur_lex_data_used = 0; pinfo->cur_lex = get_lex(&(pinfo->linfo)); if (pinfo->cur_lex == NULL) { return 0; /* Request for new data */ } return 1; }
int main() { lexer_info linfo; init_lexer(&linfo); do { lexeme *lex = get_lex(&linfo); print_lex(stdout, lex); if (lex->type == LEX_EOFILE) return 0; destroy_lex(lex); if (linfo.state == ST_ERROR) { fprintf(stderr, "(>_<)\n"); continue; } } while (1); }
void parser_get_lex(parser_info *pinfo) { if (pinfo->cur_lex != NULL) { if (pinfo->save_str) free(pinfo->cur_lex); else destroy_lex(pinfo->cur_lex); } pinfo->save_str = 0; pinfo->cur_lex = get_lex(pinfo->linfo); #ifdef PARSER_DEBUG fprintf(stderr, "Get lex: "); print_lex(stderr, pinfo->cur_lex); #endif if (pinfo->cur_lex->type == LEX_ERROR) /* Error 1 */ pinfo->error = 1; else pinfo->error = 0; /* Error 0: all right */ }
/* * Parse a "value" from the remainder of the expression in infoPtr. * * Results: * Normally TCL_OK is returned. The value of the expression is * returned in *valuePtr. If an error occurred, then interp->result * contains an error message and TCL_ERROR is returned. * InfoPtr->token will be left pointing to the token AFTER the * expression, and infoPtr->expr will point to the character just * after the terminating token. * * Side effects: * None. */ static unsigned char get_value (Tcl_Interp *interp, /* Interpreter to use for error reporting. */ Expr_info_t *infoPtr, /* Describes the state of the parse just * before the value (i.e. get_lex will be * called to get first token of value). */ int prec, /* Treat any un-parenthesized operator * with precedence <= this as the end * of the expression. */ Value_t *valuePtr) /* Where to store the value of the * expression. Caller must have * initialized pv field. */ { Interp *iPtr = (Interp *) interp; Value_t value2; /* Second operand for current * operator. */ int operator; /* Current operator (either unary * or binary). */ int badType; /* Type of offending argument; used * for error messages. */ int gotOp; /* Non-zero means already lexed the * operator (while picking up value * for unary operator). Don't lex * again. */ unsigned char result; /* * There are two phases to this procedure. First, pick off an initial * value. Then, parse (binary operator, value) pairs until done. */ gotOp = 0; value2.pv.buffer = value2.pv.next = value2.static_space; value2.pv.end = value2.pv.buffer + STATIC_STRING_SPACE - 1; value2.pv.expandProc = TclExpandParseValue; value2.pv.clientData = (void*) 0; result = get_lex(interp, infoPtr, valuePtr); if (result != TCL_OK) { goto done; } if (infoPtr->token == OPEN_PAREN) { /* * Parenthesized sub-expression. */ result = get_value(interp, infoPtr, -1, valuePtr); if (result != TCL_OK) { goto done; } if (infoPtr->token != CLOSE_PAREN) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "unmatched parentheses in expression \"", infoPtr->original_expr, "\"", 0); result = TCL_ERROR; goto done; } } else { if (infoPtr->token == MINUS) { infoPtr->token = UNARY_MINUS; } if (infoPtr->token >= UNARY_MINUS) { /* * Process unary operators. */ operator = infoPtr->token; result = get_value(interp, infoPtr, prec_table[infoPtr->token], valuePtr); if (result != TCL_OK) { goto done; } switch (operator) { case UNARY_MINUS: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = -valuePtr->int_value; } else { badType = valuePtr->type; goto illegalType; } break; case NOT: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = !valuePtr->int_value; } else { badType = valuePtr->type; goto illegalType; } break; case BIT_NOT: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = ~valuePtr->int_value; } else { badType = valuePtr->type; goto illegalType; } break; } gotOp = 1; } else if (infoPtr->token != VALUE) { goto syntaxError; } } /* * Got the first operand. Now fetch (operator, operand) pairs. */ if (!gotOp) { result = get_lex(interp, infoPtr, &value2); if (result != TCL_OK) { goto done; } } while (1) { operator = infoPtr->token; value2.pv.next = value2.pv.buffer; if ((operator < MULT) || (operator >= UNARY_MINUS)) { if ((operator == END) || (operator == CLOSE_PAREN)) { result = TCL_OK; goto done; } else { goto syntaxError; } } if (prec_table[operator] <= prec) { result = TCL_OK; goto done; } /* * If we're doing an AND or OR and the first operand already * determines the result, don't execute anything in the * second operand: just parse. Same style for ?: pairs. */ if ((operator == AND) || (operator == OR) || (operator == QUESTY)) { if (valuePtr->type == TYPE_STRING) { badType = TYPE_STRING; goto illegalType; } if (((operator == AND) && !valuePtr->int_value) || ((operator == OR) && valuePtr->int_value)) { iPtr->noEval++; result = get_value(interp, infoPtr, prec_table[operator], &value2); iPtr->noEval--; } else if (operator == QUESTY) { if (valuePtr->int_value != 0) { valuePtr->pv.next = valuePtr->pv.buffer; result = get_value(interp, infoPtr, prec_table[operator], valuePtr); if (result != TCL_OK) { goto done; } if (infoPtr->token != COLON) { goto syntaxError; } value2.pv.next = value2.pv.buffer; iPtr->noEval++; result = get_value(interp, infoPtr, prec_table[operator], &value2); iPtr->noEval--; } else { iPtr->noEval++; result = get_value(interp, infoPtr, prec_table[operator], &value2); iPtr->noEval--; if (result != TCL_OK) { goto done; } if (infoPtr->token != COLON) { goto syntaxError; } valuePtr->pv.next = valuePtr->pv.buffer; result = get_value(interp, infoPtr, prec_table[operator], valuePtr); } } else { result = get_value(interp, infoPtr, prec_table[operator], &value2); } } else { result = get_value(interp, infoPtr, prec_table[operator], &value2); } if (result != TCL_OK) { goto done; } if ((infoPtr->token < MULT) && (infoPtr->token != VALUE) && (infoPtr->token != END) && (infoPtr->token != CLOSE_PAREN)) { goto syntaxError; } /* * At this point we've got two values and an operator. Check * to make sure that the particular data types are appropriate * for the particular operator, and perform type conversion * if necessary. */ switch (operator) { /* * For the operators below, no strings are allowed and * ints get converted to floats if necessary. */ case MULT: case DIVIDE: case PLUS: case MINUS: if ((valuePtr->type == TYPE_STRING) || (value2.type == TYPE_STRING)) { badType = TYPE_STRING; goto illegalType; } break; /* * For the operators below, only integers are allowed. */ case MOD: case LEFT_SHIFT: case RIGHT_SHIFT: case BIT_AND: case BIT_XOR: case BIT_OR: if (valuePtr->type != TYPE_INT) { badType = valuePtr->type; goto illegalType; } else if (value2.type != TYPE_INT) { badType = value2.type; goto illegalType; } break; /* * For the operators below, any type is allowed but the * two operands must have the same type. Convert integers * to floats and either to strings, if necessary. */ case LESS: case GREATER: case LEQ: case GEQ: case EQUAL: case NEQ: if (valuePtr->type == TYPE_STRING) { if (value2.type != TYPE_STRING) { make_string (interp->pool, &value2); } } else if (value2.type == TYPE_STRING) { if (valuePtr->type != TYPE_STRING) { make_string (interp->pool, valuePtr); } } break; /* * For the operators below, no strings are allowed. */ case AND: case OR: if (valuePtr->type == TYPE_STRING) { badType = valuePtr->type; goto illegalType; } if (value2.type == TYPE_STRING) { badType = value2.type; goto illegalType; } break; /* * For the operators below, type and conversions are * irrelevant: they're handled elsewhere. */ case QUESTY: case COLON: break; /* * Any other operator is an error. */ default: interp->result = (unsigned char*) "unknown operator in expression"; result = TCL_ERROR; goto done; } /* * If necessary, convert one of the operands to the type * of the other. If the operands are incompatible with * the operator (e.g. "+" on strings) then return an * error. */ switch (operator) { case MULT: if (valuePtr->type == TYPE_INT) { valuePtr->int_value *= value2.int_value; } break; case DIVIDE: if (valuePtr->type == TYPE_INT) { if (value2.int_value == 0) { divideByZero: interp->result = (unsigned char*) "divide by zero"; result = TCL_ERROR; goto done; } valuePtr->int_value /= value2.int_value; } break; case MOD: if (value2.int_value == 0) { goto divideByZero; } valuePtr->int_value %= value2.int_value; break; case PLUS: if (valuePtr->type == TYPE_INT) { valuePtr->int_value += value2.int_value; } break; case MINUS: if (valuePtr->type == TYPE_INT) { valuePtr->int_value -= value2.int_value; } break; case LEFT_SHIFT: valuePtr->int_value <<= value2.int_value; break; case RIGHT_SHIFT: /* * The following code is a bit tricky: it ensures that * right shifts propagate the sign bit even on machines * where ">>" won't do it by default. */ if (valuePtr->int_value < 0) { valuePtr->int_value = ~((~valuePtr->int_value) >> value2.int_value); } else { valuePtr->int_value >>= value2.int_value; } break; case LESS: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = valuePtr->int_value < value2.int_value; } else { valuePtr->int_value = strcmp(valuePtr->pv.buffer, value2.pv.buffer) < 0; } valuePtr->type = TYPE_INT; break; case GREATER: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = valuePtr->int_value > value2.int_value; } else { valuePtr->int_value = strcmp(valuePtr->pv.buffer, value2.pv.buffer) > 0; } valuePtr->type = TYPE_INT; break; case LEQ: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = valuePtr->int_value <= value2.int_value; } else { valuePtr->int_value = strcmp(valuePtr->pv.buffer, value2.pv.buffer) <= 0; } valuePtr->type = TYPE_INT; break; case GEQ: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = valuePtr->int_value >= value2.int_value; } else { valuePtr->int_value = strcmp(valuePtr->pv.buffer, value2.pv.buffer) >= 0; } valuePtr->type = TYPE_INT; break; case EQUAL: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = valuePtr->int_value == value2.int_value; } else { valuePtr->int_value = strcmp(valuePtr->pv.buffer, value2.pv.buffer) == 0; } valuePtr->type = TYPE_INT; break; case NEQ: if (valuePtr->type == TYPE_INT) { valuePtr->int_value = valuePtr->int_value != value2.int_value; } else { valuePtr->int_value = strcmp(valuePtr->pv.buffer, value2.pv.buffer) != 0; } valuePtr->type = TYPE_INT; break; case BIT_AND: valuePtr->int_value &= value2.int_value; break; case BIT_XOR: valuePtr->int_value ^= value2.int_value; break; case BIT_OR: valuePtr->int_value |= value2.int_value; break; case AND: valuePtr->int_value = valuePtr->int_value && value2.int_value; break; case OR: valuePtr->int_value = valuePtr->int_value || value2.int_value; break; case COLON: interp->result = (unsigned char*) "can't have : operator without ? first"; result = TCL_ERROR; goto done; }
int url_parse (const char *url_str, URL *url) { const char *marker; const char *ctxmarker; const char *src = url_str; int pos = 0; #line 15 "url_parser.c" { unsigned char yych; yych = *url_str; switch (yych) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy4; default: goto yy2; } yy2: ++url_str; yy3: #line 48 "url_parser.re" { return 0; } #line 79 "url_parser.c" yy4: yych = *(marker = ++url_str); switch (yych) { case '+': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy6; default: goto yy3; } yy5: ++url_str; yych = *url_str; yy6: switch (yych) { case '+': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy5; case ':': goto yy8; default: goto yy7; } yy7: url_str = marker; goto yy3; yy8: ++url_str; #line 50 "url_parser.re" { int len = url_str - src - 1; url->scheme = get_lex(src, &pos, len); pos++; // add ":" goto hier_part; } #line 236 "url_parser.c" } #line 56 "url_parser.re" hier_part: #line 243 "url_parser.c" { unsigned char yych; yych = *url_str; switch (yych) { case 0x00: goto yy12; case '/': goto yy16; default: goto yy14; } yy12: ++url_str; #line 61 "url_parser.re" { return 0;} #line 256 "url_parser.c" yy14: ++url_str; yy15: #line 60 "url_parser.re" { goto hier_part_path; } #line 262 "url_parser.c" yy16: yych = *++url_str; switch (yych) { case '/': goto yy17; default: goto yy15; } yy17: ++url_str; #line 62 "url_parser.re" { pos +=2; goto hier_part_authority; } #line 273 "url_parser.c" } #line 63 "url_parser.re" hier_part_authority: #line 280 "url_parser.c" { unsigned char yych; yych = *url_str; switch (yych) { case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy23; case '%': goto yy24; default: goto yy21; } yy21: ++url_str; yy22: #line 67 "url_parser.re" { url_str--; goto hier_part_host; } #line 371 "url_parser.c" yy23: yych = *(marker = ++url_str); switch (yych) { case '!': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '=': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy26; default: goto yy22; } yy24: yych = *(marker = ++url_str); switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy31; default: goto yy22; } yy25: ++url_str; yych = *url_str; yy26: switch (yych) { case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy25; case '%': goto yy28; case '@': goto yy29; default: goto yy27; } yy27: url_str = marker; goto yy22; yy28: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy31; default: goto yy27; } yy29: ++url_str; #line 69 "url_parser.re" { int len = url_str - src - pos - 1; // unshift 1 char for "@" url->userinfo = get_lex(src, &pos, len); pos++; // shift for "@" char goto hier_part_host; } #line 611 "url_parser.c" yy31: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy25; default: goto yy27; } } #line 75 "url_parser.re" hier_part_host: #line 646 "url_parser.c" { unsigned char yych; unsigned int yyaccept = 0; yych = *url_str; ctxmarker = url_str; switch (yych) { case 0x00: goto yy34; case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy38; case '%': goto yy41; case '/': goto yy42; case '0': goto yy44; case '1': goto yy45; case '2': goto yy46; case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy47; case '[': goto yy48; default: goto yy36; } yy34: ++url_str; #line 79 "url_parser.re" { return 0;} #line 740 "url_parser.c" yy36: ++url_str; yy37: #line 80 "url_parser.re" { return 0; } #line 746 "url_parser.c" yy38: yyaccept = 0; marker = ++url_str; yych = *url_str; yy39: switch (yych) { case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy38; case '%': goto yy49; default: goto yy40; } yy40: #line 113 "url_parser.re" { int len = url_str - src - pos; url->host->type = REGNAME; char *name = get_lex(src, &pos, len); strncpy (url->host->name, name, HOST_MAX_LEN < len + 1 ? HOST_MAX_LEN : len + 1); free (name); goto hier_part_port; } #line 843 "url_parser.c" yy41: yyaccept = 1; yych = *(marker = ++url_str); switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy51; default: goto yy37; } yy42: ++url_str; url_str = ctxmarker; #line 81 "url_parser.re" { url->host->type = UNKNOWN; goto hier_part_path; } #line 880 "url_parser.c" yy44: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy52; default: goto yy39; } yy45: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy52; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy47; default: goto yy39; } yy46: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy52; case '0': case '1': case '2': case '3': case '4': goto yy47; case '5': goto yy53; case '6': case '7': case '8': case '9': goto yy44; default: goto yy39; } yy47: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy52; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy44; default: goto yy39; } yy48: yyaccept = 1; yych = *(marker = ++url_str); switch (yych) { case ']': goto yy37; case 'v': goto yy56; default: goto yy54; } yy49: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy51; default: goto yy50; } yy50: url_str = marker; switch (yyaccept) { case 0: goto yy40; case 1: goto yy37; default: goto yy76; } yy51: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy38; default: goto yy50; } yy52: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '0': goto yy57; case '1': goto yy58; case '2': goto yy59; case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy60; default: goto yy39; } yy53: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy52; case '0': case '1': case '2': case '3': case '4': case '5': goto yy44; default: goto yy39; } yy54: ++url_str; yych = *url_str; switch (yych) { case ']': goto yy61; default: goto yy54; } yy56: yych = *++url_str; switch (yych) { case ']': goto yy61; default: goto yy63; } yy57: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy65; default: goto yy39; } yy58: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy65; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy60; default: goto yy39; } yy59: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy65; case '0': case '1': case '2': case '3': case '4': goto yy60; case '5': goto yy66; case '6': case '7': case '8': case '9': goto yy57; default: goto yy39; } yy60: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy65; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy57; default: goto yy39; } yy61: ++url_str; #line 103 "url_parser.re" { pos++; // shift "[" int len = url_str - src - pos - 1; // skip "]" url->host->type = IPV6ADDR; char *name = get_lex(src, &pos, len); pos++; strncpy (url->host->name, name, HOST_MAX_LEN < len + 1 ? HOST_MAX_LEN : len + 1); free (name); goto hier_part_port; } #line 1123 "url_parser.c" yy63: ++url_str; yych = *url_str; switch (yych) { case ']': goto yy67; default: goto yy63; } yy65: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '0': goto yy69; case '1': goto yy70; case '2': goto yy71; case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy72; default: goto yy39; } yy66: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy65; case '0': case '1': case '2': case '3': case '4': case '5': goto yy57; default: goto yy39; } yy67: ++url_str; #line 93 "url_parser.re" { pos++; // shift "[" int len = url_str - src - pos - 1; url->host->type = IPVFUTUR; char *name = get_lex(src, &pos, len); pos++; strncpy (url->host->name, name, HOST_MAX_LEN < len + 1 ? HOST_MAX_LEN : len + 1); free (name); goto hier_part_port; } #line 1173 "url_parser.c" yy69: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy73; default: goto yy39; } yy70: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy73; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy72; default: goto yy39; } yy71: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy73; case '0': case '1': case '2': case '3': case '4': goto yy72; case '5': goto yy74; case '6': case '7': case '8': case '9': goto yy69; default: goto yy39; } yy72: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy73; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy69; default: goto yy39; } yy73: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '0': goto yy75; case '1': goto yy77; case '2': goto yy78; case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy79; default: goto yy39; } yy74: yyaccept = 0; yych = *(marker = ++url_str); switch (yych) { case '.': goto yy73; case '0': case '1': case '2': case '3': case '4': case '5': goto yy69; default: goto yy39; } yy75: yyaccept = 2; yych = *(marker = ++url_str); switch (yych) { case '!': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy39; default: goto yy76; } yy76: #line 85 "url_parser.re" { int len = url_str - src - pos; url->host->type = IPV4ADDR; char *name = get_lex(src, &pos, len); strncpy (url->host->name, name, HOST_MAX_LEN < len + 1 ? HOST_MAX_LEN : len + 1); free (name); goto hier_part_port; } #line 1355 "url_parser.c" yy77: yyaccept = 2; yych = *(marker = ++url_str); switch (yych) { case '!': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy39; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy79; default: goto yy76; } yy78: yyaccept = 2; yych = *(marker = ++url_str); switch (yych) { case '!': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy39; case '0': case '1': case '2': case '3': case '4': goto yy79; case '5': goto yy80; case '6': case '7': case '8': case '9': goto yy75; default: goto yy76; } yy79: yyaccept = 2; yych = *(marker = ++url_str); switch (yych) { case '!': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy39; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy75; default: goto yy76; } yy80: yyaccept = 2; yych = *(marker = ++url_str); switch (yych) { case '!': case '$': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '6': case '7': case '8': case '9': case ';': case '=': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy39; case '0': case '1': case '2': case '3': case '4': case '5': goto yy75; default: goto yy76; } } #line 121 "url_parser.re" hier_part_port: #line 1698 "url_parser.c" { unsigned char yych; yych = *url_str; switch (yych) { case 0x00: goto yy84; case ':': goto yy86; default: goto yy83; } yy83: #line 129 "url_parser.re" { goto hier_part_path; } #line 1710 "url_parser.c" yy84: ++url_str; #line 125 "url_parser.re" { url->valid = 1; return 1; } #line 1718 "url_parser.c" yy86: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy86; default: goto yy88; } yy88: #line 130 "url_parser.re" { pos++; // shift ":" int len = url_str - src - pos; char *port = get_lex(src, &pos, len); url->port = atoi (port); free (port); goto hier_part_path; } #line 1745 "url_parser.c" } #line 138 "url_parser.re" hier_part_path: #line 1752 "url_parser.c" { unsigned char yych; yych = *url_str; switch (yych) { case 0x00: goto yy91; case '/': goto yy95; default: goto yy93; } yy91: ++url_str; #line 142 "url_parser.re" { url->valid = 1; return 1; } #line 1768 "url_parser.c" yy93: ++url_str; #line 146 "url_parser.re" {goto query_frag;} #line 1773 "url_parser.c" yy95: marker = ++url_str; yych = *url_str; switch (yych) { case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '=': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy95; case '%': goto yy98; default: goto yy97; } yy97: #line 147 "url_parser.re" { int len = url_str - src - pos; url->path = get_lex(src, &pos, len); goto query_frag; } #line 1868 "url_parser.c" yy98: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy100; default: goto yy99; } yy99: url_str = marker; goto yy97; yy100: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy95; default: goto yy99; } } #line 152 "url_parser.re" query_frag: #line 1934 "url_parser.c" { unsigned char yych; unsigned int yyaccept = 0; yych = *url_str; switch (yych) { case 0x00: goto yy103; case '#': goto yy107; case '?': goto yy110; default: goto yy105; } yy103: ++url_str; #line 157 "url_parser.re" { url->valid = 1; return 1; } #line 1952 "url_parser.c" yy105: ++url_str; #line 156 "url_parser.re" { return 0; } #line 1957 "url_parser.c" yy107: yyaccept = 0; marker = ++url_str; yych = *url_str; switch (yych) { case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '=': case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy107; case '%': goto yy113; default: goto yy109; } yy109: #line 167 "url_parser.re" { pos++; // shift "#" int len = url_str - src - pos; url->fragment = get_lex(src, &pos, len); return 1; } #line 2055 "url_parser.c" yy110: yyaccept = 1; marker = ++url_str; yych = *url_str; switch (yych) { case '!': case '$': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '=': case '?': case '@': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '~': goto yy110; case '%': goto yy115; default: goto yy112; } yy112: #line 161 "url_parser.re" { pos++; // shift "?" int len = url_str - src - pos; url->query = get_lex(src, &pos, len); goto query_frag; } #line 2153 "url_parser.c" yy113: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy116; default: goto yy114; } yy114: url_str = marker; if (yyaccept == 0) { goto yy109; } else { goto yy112; } yy115: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy117; default: goto yy114; } yy116: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy107; default: goto yy114; } yy117: ++url_str; yych = *url_str; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy110; default: goto yy114; } } #line 173 "url_parser.re" return 0; }