/** * A mini-scanner for tokenizing a query string */ static int get_next_token(char *s, int *cursor, char **r) { int i= *cursor; while(s[*cursor]) { if(s[*cursor+1]=='=') { *cursor+= 1; *r= Str_ndup(&s[i], (*cursor-i)); return KEY; } if(s[*cursor]=='=') { while(s[*cursor] && s[*cursor]!='&') *cursor+= 1; if(s[*cursor]=='&') { *r= Str_ndup(&s[i+1], (*cursor-i)-1); *cursor+= 1; } else *r= Str_ndup(&s[i+1], (*cursor-i)); return VALUE; } *cursor+= 1; } return FALSE; }
int main(void) { Bootstrap(); // Need to initialize library printf("============> Start Str Tests\n\n"); printf("=> Test1: copy\n"); { char s3[STRLEN]; printf("\tResult: %s\n", Str_copy(s3, "The abc house", 7)); assert(Str_isEqual(s3, "The abc")); printf("\tTesting for NULL argument\n"); assert(!Str_copy(NULL, NULL, 7)); } printf("=> Test1: OK\n\n"); printf("=> Test2: dup\n"); { char *s4 = Str_dup("abc123"); printf("\tResult: %s\n", s4); assert(Str_isEqual(s4, "abc123")); printf("\tTesting for NULL argument\n"); assert(!Str_dup(NULL)); FREE(s4); } printf("=> Test2: OK\n\n"); printf("=> Test3: ndup\n"); { char *s5 = Str_ndup("abc123", 3); printf("\tResult: %s\n", s5); assert(Str_isEqual(s5, "abc")); printf("\tTesting for NULL argument\n"); assert(!Str_ndup(NULL, 3)); FREE(s5); } printf("=> Test3: OK\n\n"); printf("=> Test4: Str_cat & Str_vcat\n"); { char *s6; s6 = Str_cat("%s://%s%s?%s", "https", "foo.bar", "/uri", "abc=123"); printf("\tResult: %s\n", s6); assert(Str_isEqual(s6, "https://foo.bar/uri?abc=123")); FREE(s6); printf("\tTesting for NULL arguments\n"); s6 = Str_cat(NULL); assert(s6==NULL); FREE(s6); } printf("=> Test4: OK\n\n"); printf("=> Test5: chomp\n"); { char s3[] = "abc\r\n123"; printf("\tResult: %s\n", Str_chomp(s3)); assert(Str_isEqual(s3, "abc")); printf("\tTesting for NULL argument\n"); assert(!Str_chomp(NULL)); } printf("=> Test5: OK\n\n"); printf("=> Test6: trim\n"); { char e[] = " "; char o[] = " a "; char s[] = " abcdef"; char s4[] = " \t abc \r\n\t "; assert(Str_isEqual(Str_ltrim(s), "abcdef")); printf("\tResult: %s\n", Str_trim(s4)); assert(Str_isEqual(s4, "abc")); printf("\tTesting for NULL argument\n"); assert(!Str_trim(NULL)); assert(Str_isEqual(Str_ltrim(e), "")); memcpy(e, " ", sizeof(" ") - 1); assert(Str_isEqual(Str_rtrim(e), "")); memcpy(e, " ", sizeof(" ") - 1); assert(Str_isEqual(Str_trim(e), "")); assert(Str_isEqual(Str_ltrim(o), "a ")); memcpy(o, " a ", sizeof(" a ") - 1); assert(Str_isEqual(Str_rtrim(o), " a")); memcpy(o, " a ", sizeof(" a ") - 1); assert(Str_isEqual(Str_trim(o), "a")); assert(Str_isEqual(Str_trim(o), "a")); } printf("=> Test6: OK\n\n"); printf("=> Test7: trim quotes\n"); { char s5[] = "\"'abc'\""; char s5a[] = "\"'abc"; char s5b[] = "abc'\""; char s5c[] = "'\""; char s5d[] = " \t abc def '\" "; printf("\tResult: %s\n", Str_unquote(s5)); assert(Str_isEqual(s5, "abc")); printf("\tResult: %s\n", Str_unquote(s5a)); assert(Str_isEqual(s5, "abc")); printf("\tResult: %s\n", Str_unquote(s5b)); assert(Str_isEqual(s5, "abc")); printf("\tResult: %s\n", Str_unquote(s5b)); assert(Str_isEqual(s5, "abc")); printf("\tTesting for NULL argument\n"); assert(!Str_unquote(NULL)); printf("\tTesting for quotes-only argument\n"); assert(Str_isEqual("", Str_unquote(s5c))); printf("\tTesting for quotes and white-space removal\n"); assert(Str_isEqual("abc def", Str_unquote(s5d))); } printf("=> Test7: OK\n\n"); printf("=> Test8: toLowerCase\n"); { char s6[] = "AbC"; printf("\tResult: %s\n", Str_toLower(s6)); assert(Str_isEqual(s6, "abc")); printf("\tTesting for NULL argument\n"); assert(!Str_toLower(NULL)); } printf("=> Test8: OK\n\n"); printf("=> Test9: toUpperCase\n"); { char s7[] = "aBc"; printf("\tResult: %s\n", Str_toUpper(s7)); assert(Str_isEqual(s7, "ABC")); printf("\tTesting for NULL argument\n"); assert(!Str_toUpper(NULL)); } printf("=> Test9: OK\n\n"); printf("=> Test10: parseInt, parseLLong, parseDouble\n"); { char i[STRLEN] = " -2812 bla"; char ll[STRLEN] = " 2147483642 blabla"; char d[STRLEN] = " 2.718281828 this is e"; char de[STRLEN] = "1.495E+08 kilometer = An Astronomical Unit"; char ie[STRLEN] = " 9999999999999999999999999999999999999999"; printf("\tResult:\n"); printf("\tParsed int = %d\n", Str_parseInt(i)); assert(Str_parseInt(i)==-2812); printf("\tParsed long long = %lld\n", Str_parseLLong(ll)); assert(Str_parseLLong(ll)==2147483642); printf("\tParsed double = %.9f\n", Str_parseDouble(d)); assert(Str_parseDouble(d)==2.718281828); printf("\tParsed double exp = %.3e\n", Str_parseDouble(de)); assert(Str_parseDouble(de)==1.495e+08); TRY Str_parseInt(ie); assert(false); CATCH(NumberFormatException) printf("=> Test11: OK\n\n"); END_TRY; } printf("=> Test10: OK\n\n"); printf("=> Test11: replace\n"); { char s9[] = "abccba"; printf("\tResult: %s\n", Str_replaceChar(s9, 'b', 'X')); assert(Str_isEqual(s9, "aXccXa")); printf("\tTesting for NULL argument\n"); assert(!Str_replaceChar(NULL, 'b', 'X')); } printf("=> Test11: OK\n\n"); printf("=> Test12: startsWith\n"); { char *a = "mysql://*****:*****@ ]+@([-a-zA-Z0-9]+\\.)+[a-zA-Z]{2,}$"; char *valid_phone1 = "+4797141255"; char *valid_phone2 = "(47)-97-14-12-55"; char *invalid_phone1 = "141255"; char *invalid_phone2 = "(47)971412551234567890123456789012345678901234567890"; char *invalid_phone3 = ""; char *invalid_phone4 = "abc123"; char *valid_email1 = "*****@*****.**"; char *valid_email2 = "*****@*****.**"; char *invalid_email1 = "hauktildeslash.com"; char *invalid_email2 = ""; char *invalid_email3 = "hauk@tildeslashcom"; char *invalid_email4 = "hauk@æøåtildeslash.com"; // phone printf("\tResult: match(%s, %s)\n", phone_pattern, valid_phone1); assert(Str_match(phone_pattern, valid_phone1)); printf("\tResult: match(%s, %s)\n", phone_pattern, valid_phone2); assert(Str_match(phone_pattern, valid_phone2)); printf("\tResult: match(%s, %s)\n", phone_pattern, invalid_phone1); assert(! Str_match(phone_pattern, invalid_phone1)); printf("\tResult: match(%s, %s)\n", phone_pattern, invalid_phone2); assert(! Str_match(phone_pattern, invalid_phone2)); printf("\tResult: match(%s, %s)\n", phone_pattern, invalid_phone3); assert(! Str_match(phone_pattern, invalid_phone3)); printf("\tResult: match(%s, %s)\n", phone_pattern, invalid_phone4); assert(! Str_match(phone_pattern, invalid_phone4)); // email printf("\tResult: match(%s, %s)\n", email_pattern, valid_email1); assert(Str_match(email_pattern, valid_email1)); printf("\tResult: match(%s, %s)\n", email_pattern, valid_email2); assert(Str_match(email_pattern, valid_email2)); printf("\tResult: match(%s, %s)\n", email_pattern, invalid_email1); assert(! Str_match(email_pattern, invalid_email1)); printf("\tResult: match(%s, %s)\n", email_pattern, invalid_email2); assert(! Str_match(email_pattern, invalid_email2)); printf("\tResult: match(%s, %s)\n", email_pattern, invalid_email3); assert(! Str_match(email_pattern, invalid_email3)); printf("\tResult: match(%s, %s)\n", email_pattern, invalid_email4); assert(! Str_match(email_pattern, invalid_email4)); } printf("=> Test17: OK\n\n"); printf("=> Test18: lim\n"); { char *zero = ""; char *two = "12"; char *ten = "1234567890"; assert(! Str_lim(zero, 0)); assert(!Str_lim(zero, 1)); assert(Str_lim(two, 0)); assert(Str_lim(two, 1)); assert(!Str_lim(two, 2)); assert(Str_lim(ten, 0)); assert(Str_lim(ten, 5)); assert(Str_lim(ten, 9)); assert(!Str_lim(ten, 10)); assert(! Str_lim(ten, 100)); } printf("=> Test18: OK\n\n"); printf("=> Test19: substring\n"); { assert(Str_sub("foo bar baz", "bar")); assert(! Str_sub("foo bar baz", "barx")); assert(Str_isEqual(Str_sub("foo bar baz", "baz"), "baz")); assert(Str_sub("foo bar baz", "foo bar baz")); assert(Str_sub("a", "a")); assert(! Str_sub("a", "b")); assert(! Str_sub("", "")); assert(! Str_sub("foo", "")); assert(! Str_sub("abc", "abcdef")); assert(! Str_sub("foo", "foo bar")); assert(Str_isEqual(Str_sub("foo foo bar", "foo bar"), "foo bar")); assert(Str_sub("foo foo bar foo bar baz fuu", "foo bar baz")); assert(Str_isEqual(Str_sub("abcd abcc", "abcc"), "abcc")); } printf("=> Test19: OK\n\n"); printf("=> Test20: Str_join\n"); { char *p = NULL; char dest[10+1] = "xxxxxxxxx"; char a[] = "abc"; char *b = "def"; char *c = "xxx123"; assert(Str_isEqual(Str_join(dest, 10, a, b, "ghi"), "abcdefghi")); assert(Str_isEqual(Str_join(dest, 10, p), "")); assert(Str_isEqual(Str_join(dest, 10), "")); assert(Str_isEqual(Str_join(dest, 10, "012", "3456789", "0123456789"), "0123456789")); assert(Str_isEqual(Str_join(dest, 4, "a", "b", "cd", "ghi", "jklmnopq"), "abcd")); assert(Str_isEqual(Str_join(dest, 10, a, c + 3), "abc123")); Str_join(dest, 0); assert(dest[0]==0); } printf("=> Test20: OK\n\n"); printf("=> Test21: Str_has\n"); { char *foo = "'bar' (baz)"; assert(Str_has("(')", foo)); assert(! Str_has(",;", foo)); } printf("=> Test21: OK\n\n"); printf("=> Test22: Str_curtail\n"); { char s[] = "<text>Hello World</text>"; assert(Str_isByteEqual(Str_curtail(s, "</text>"), "<text>Hello World")); assert(Str_isByteEqual(Str_curtail(s, ">"), "<text")); assert(Str_isByteEqual(Str_curtail(s, "@"), "<text")); } printf("=> Test22: OK\n\n"); printf("=> Test23: Str_ton\n"); { char str[43]; long l1 = 42, l2 = 0, l3 = -42, l4 = LONG_MAX, l5 = LONG_MIN; assert(Str_isByteEqual("42", Str_ton(42, (char[43]){0}))); assert(Str_isByteEqual("42", Str_ton(l1, str))); assert(Str_isByteEqual("0", Str_ton(l2, str))); assert(Str_isByteEqual("-42", Str_ton(l3, str))); assert(l4 == Str_parseLLong(Str_ton(l4, str))); assert(l5 == Str_parseLLong(Str_ton(l5, str))); }
static int parseURL(T U) { param_t param = NULL; #line 116 /*109*/ "src/net/URL.re" proto: if (YYCURSOR >= YYLIMIT) return false; YYTOKEN = YYCURSOR; #line 121 "<stdout>" { YYCTYPE yych; static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; if ((YYLIMIT - YYCURSOR) < 13) YYFILL(13); yych = *YYCURSOR; if (yych <= '@') { if (yych <= '\r') { if (yych <= 0x08) goto yy9; if (yych <= '\n') goto yy2; if (yych <= '\f') goto yy9; } else { if (yych <= ' ') { if (yych <= 0x1F) goto yy9; } else { if (yych <= '/') goto yy9; if (yych <= '9') goto yy8; goto yy9; } } } else { if (yych <= 'm') { if (yych <= 'Z') goto yy8; if (yych <= '`') goto yy9; if (yych <= 'l') goto yy8; goto yy4; } else { if (yych <= 'o') { if (yych <= 'n') goto yy8; goto yy7; } else { if (yych <= 'p') goto yy6; if (yych <= 'z') goto yy8; goto yy9; } } } yy2: ++YYCURSOR; #line 133 "src/net/URL.re" { goto proto; } #line 198 "<stdout>" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Z') { if (yych <= '/') goto yy5; if (yych <= ':') goto yy13; if (yych >= 'A') goto yy13; } else { if (yych <= 'x') { if (yych >= 'a') goto yy13; } else { if (yych <= 'y') goto yy39; if (yych <= 'z') goto yy13; } } yy5: #line 153 "src/net/URL.re" { goto proto; } #line 218 "<stdout>" yy6: yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Z') { if (yych <= '/') goto yy5; if (yych <= ':') goto yy13; if (yych <= '@') goto yy5; goto yy13; } else { if (yych <= 'n') { if (yych <= '`') goto yy5; goto yy13; } else { if (yych <= 'o') goto yy26; if (yych <= 'z') goto yy13; goto yy5; } } yy7: yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Z') { if (yych <= '/') goto yy5; if (yych <= ':') goto yy13; if (yych <= '@') goto yy5; goto yy13; } else { if (yych <= 'q') { if (yych <= '`') goto yy5; goto yy13; } else { if (yych <= 'r') goto yy17; if (yych <= 'z') goto yy13; goto yy5; } } yy8: yych = *(YYMARKER = ++YYCURSOR); if (yych <= '@') { if (yych <= '/') goto yy5; if (yych <= ':') goto yy13; goto yy5; } else { if (yych <= 'Z') goto yy13; if (yych <= '`') goto yy5; if (yych <= 'z') goto yy13; goto yy5; } yy9: yych = *++YYCURSOR; goto yy5; yy10: yych = *++YYCURSOR; if (yych == '/') goto yy14; yy11: YYCURSOR = YYMARKER; goto yy5; yy12: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; yy13: if (yybm[0+yych] & 128) { goto yy12; } if (yych == ':') goto yy10; goto yy11; yy14: yych = *++YYCURSOR; if (yych != '/') goto yy11; ++YYCURSOR; #line 149 "src/net/URL.re" { SET_PROTOCOL(UNKNOWN_PORT); } #line 292 "<stdout>" yy17: yych = *++YYCURSOR; if (yych != 'a') goto yy13; yych = *++YYCURSOR; if (yych != 'c') goto yy13; yych = *++YYCURSOR; if (yych != 'l') goto yy13; yych = *++YYCURSOR; if (yych != 'e') goto yy13; yych = *++YYCURSOR; if (yych != ':') goto yy13; yych = *++YYCURSOR; if (yych != '/') goto yy11; yych = *++YYCURSOR; if (yych != '/') goto yy11; ++YYCURSOR; #line 145 "src/net/URL.re" { SET_PROTOCOL(ORACLE_DEFAULT_PORT); } #line 313 "<stdout>" yy26: yych = *++YYCURSOR; if (yych != 's') goto yy13; yych = *++YYCURSOR; if (yych != 't') goto yy13; yych = *++YYCURSOR; if (yych != 'g') goto yy13; yych = *++YYCURSOR; if (yych != 'r') goto yy13; yych = *++YYCURSOR; if (yych != 'e') goto yy13; yych = *++YYCURSOR; if (yych != 's') goto yy13; yych = *++YYCURSOR; if (yych != 'q') goto yy13; yych = *++YYCURSOR; if (yych != 'l') goto yy13; yych = *++YYCURSOR; if (yych != ':') goto yy13; yych = *++YYCURSOR; if (yych != '/') goto yy11; yych = *++YYCURSOR; if (yych != '/') goto yy11; ++YYCURSOR; #line 141 "src/net/URL.re" { SET_PROTOCOL(POSTGRESQL_DEFAULT_PORT); } #line 342 "<stdout>" yy39: yych = *++YYCURSOR; if (yych != 's') goto yy13; yych = *++YYCURSOR; if (yych != 'q') goto yy13; yych = *++YYCURSOR; if (yych != 'l') goto yy13; yych = *++YYCURSOR; if (yych != ':') goto yy13; yych = *++YYCURSOR; if (yych != '/') goto yy11; yych = *++YYCURSOR; if (yych != '/') goto yy11; ++YYCURSOR; #line 137 "src/net/URL.re" { SET_PROTOCOL(MYSQL_DEFAULT_PORT); } #line 361 "<stdout>" } #line 157 "src/net/URL.re" authority: if (YYCURSOR >= YYLIMIT) return true; YYTOKEN = YYCURSOR; #line 370 "<stdout>" { YYCTYPE yych; unsigned int yyaccept = 0; static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 112, 112, 16, 112, 112, 112, 112, 112, 112, 112, 112, 112, 240, 112, 112, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 112, 16, 112, 112, 112, 16, 64, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 112, 112, 112, 112, 112, 112, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, }; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; if (yych <= '.') { if (yych <= '\r') { if (yych <= 0x08) goto yy59; if (yych <= '\n') goto yy49; if (yych <= '\f') goto yy59; } else { if (yych <= ' ') { if (yych <= 0x1F) goto yy59; goto yy51; } else { if (yych == '-') goto yy54; goto yy52; } } } else { if (yych <= '?') { if (yych <= '/') goto yy56; if (yych <= '9') goto yy54; if (yych <= ':') goto yy58; goto yy52; } else { if (yych <= 'Z') { if (yych <= '@') goto yy59; goto yy54; } else { if (yych <= '`') goto yy52; if (yych <= 'z') goto yy54; goto yy52; } } } yy49: ++YYCURSOR; yy50: #line 163 "src/net/URL.re" { goto authority; } #line 448 "<stdout>" yy51: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x1F) goto yy50; goto yy66; yy52: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych >= ' ') goto yy66; yy53: #line 208 "src/net/URL.re" { return true; } #line 463 "<stdout>" yy54: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 128) { goto yy77; } if (yych <= 0x1F) goto yy55; if (yych == '.') goto yy76; goto yy66; yy55: #line 185 "src/net/URL.re" { U->host = Str_ndup(YYTOKEN, (int)(YYCURSOR - YYTOKEN)); goto authority; } #line 479 "<stdout>" yy56: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 32) { goto yy68; } if (yych <= 0x1F) goto yy57; if (yych <= '>') goto yy65; if (yych <= '?') goto yy71; goto yy70; yy57: #line 196 "src/net/URL.re" { *YYCURSOR = 0; U->path = URL_unescape(YYTOKEN); return true; } #line 497 "<stdout>" yy58: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yybm[0+yych] & 8) { goto yy60; } if (yych <= 0x1F) goto yy53; goto yy66; yy59: yych = *++YYCURSOR; goto yy53; yy60: yyaccept = 4; YYMARKER = ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 8) { goto yy60; } if (yych <= 0x1F) goto yy62; if (yych == '@') goto yy63; goto yy65; yy62: #line 190 "src/net/URL.re" { U->port = Str_parseInt(YYTOKEN + 1); // read past ':' goto authority; } #line 526 "<stdout>" yy63: ++YYCURSOR; yy64: #line 167 "src/net/URL.re" { *(YYCURSOR - 1) = 0; U->user = YYTOKEN; char *p = strchr(U->user, ':'); if (p) { *(p++) = 0; U->password = URL_unescape(p); } URL_unescape(U->user); goto authority; } #line 542 "<stdout>" yy65: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy66: if (yybm[0+yych] & 16) { goto yy65; } if (yych >= '@') goto yy63; yy67: YYCURSOR = YYMARKER; if (yyaccept <= 2) { if (yyaccept <= 1) { if (yyaccept <= 0) { goto yy50; } else { goto yy53; } } else { goto yy55; } } else { if (yyaccept <= 4) { if (yyaccept <= 3) { goto yy57; } else { goto yy62; } } else { goto yy72; } } yy68: yyaccept = 3; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yybm[0+yych] & 32) { goto yy68; } if (yych <= 0x1F) goto yy57; if (yych <= '>') goto yy65; if (yych <= '?') goto yy71; yy70: yych = *++YYCURSOR; if (yych <= '#') { if (yych <= ' ') goto yy64; if (yych <= '"') goto yy74; goto yy64; } else { if (yych == ';') goto yy64; goto yy74; } yy71: yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych >= ' ') goto yy66; yy72: #line 202 "src/net/URL.re" { *(YYCURSOR-1) = 0; U->path = URL_unescape(YYTOKEN); goto query; } #line 607 "<stdout>" yy73: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy74: if (yybm[0+yych] & 64) { goto yy73; } if (yych <= '>') goto yy57; yych = *++YYCURSOR; goto yy72; yy76: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yych <= '9') { if (yych <= ',') { if (yych <= 0x1F) goto yy67; goto yy65; } else { if (yych <= '-') goto yy79; if (yych <= '/') goto yy65; goto yy79; } } else { if (yych <= 'Z') { if (yych <= '?') goto yy65; if (yych <= '@') goto yy63; goto yy79; } else { if (yych <= '`') goto yy65; if (yych <= 'z') goto yy79; goto yy65; } } yy77: yyaccept = 2; YYMARKER = ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yybm[0+yych] & 128) { goto yy77; } if (yych <= '.') { if (yych <= 0x1F) goto yy55; if (yych <= '-') goto yy65; goto yy76; } else { if (yych == '@') goto yy63; goto yy65; } yy79: yyaccept = 2; YYMARKER = ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yych <= '9') { if (yych <= '-') { if (yych <= 0x1F) goto yy55; if (yych <= ',') goto yy65; goto yy79; } else { if (yych <= '.') goto yy76; if (yych <= '/') goto yy65; goto yy79; } } else { if (yych <= 'Z') { if (yych <= '?') goto yy65; if (yych <= '@') goto yy63; goto yy79; } else { if (yych <= '`') goto yy65; if (yych <= 'z') goto yy79; goto yy65; } } } #line 212 "src/net/URL.re" query: if (YYCURSOR >= YYLIMIT) return true; YYTOKEN = YYCURSOR; #line 693 "<stdout>" { YYCTYPE yych; static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= 0x1F) goto yy85; if (yych == '#') goto yy85; goto yy84; yy83: #line 218 "src/net/URL.re" { *YYCURSOR = 0; U->query = Str_ndup(YYTOKEN, (int)(YYCURSOR - YYTOKEN)); YYCURSOR = YYTOKEN; // backtrack to start of query string after terminating it and goto params; } #line 743 "<stdout>" yy84: yych = *++YYCURSOR; goto yy88; yy85: ++YYCURSOR; #line 225 "src/net/URL.re" { return true; } #line 753 "<stdout>" yy87: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy88: if (yybm[0+yych] & 128) { goto yy87; } goto yy83; } #line 229 "src/net/URL.re" params: if (YYCURSOR >= YYLIMIT) return true; YYTOKEN = YYCURSOR; #line 771 "<stdout>" { YYCTYPE yych; static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 192, 192, 192, 192, 192, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 64, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= ' ') goto yy95; if (yych == '=') goto yy93; YYCTXMARKER = YYCURSOR + 1; ++YYCURSOR; yych = *YYCURSOR; goto yy103; yy92: #line 235 "src/net/URL.re" { /* No parameters in querystring */ return true; } #line 822 "<stdout>" yy93: ++YYCURSOR; yych = *YYCURSOR; goto yy98; yy94: #line 243 "src/net/URL.re" { *YYTOKEN++ = 0; if (*(YYCURSOR - 1) == '&') *(YYCURSOR - 1) = 0; if (! param) /* format error */ return true; param->value = URL_unescape(YYTOKEN); goto params; } #line 838 "<stdout>" yy95: ++YYCURSOR; #line 253 "src/net/URL.re" { return true; } #line 845 "<stdout>" yy97: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy98: if (yybm[0+yych] & 64) { goto yy97; } if (yych <= '%') goto yy94; yych = *++YYCURSOR; goto yy94; yy100: ++YYCURSOR; YYCURSOR = YYCTXMARKER; #line 235 "src/net/URL.re" { NEW(param); param->name = YYTOKEN; param->next = U->params; U->params = param; goto params; } #line 868 "<stdout>" yy102: YYCTXMARKER = YYCURSOR + 1; ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy103: if (yybm[0+yych] & 128) { goto yy102; } if (yych <= '<') goto yy92; goto yy100; } #line 257 "src/net/URL.re" return false; }