Ejemplo n.º 1
0
Archivo: anal.c Proyecto: jkeuffer/pari
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;
}
Ejemplo n.º 2
0
/* 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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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 */
}
Ejemplo n.º 5
0
/*
 * 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;
	}
Ejemplo n.º 6
0
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;
}