With re2c, you can specify a regex and have it turned into C.
bool verify(char const *YYCURSOR)
{
char const*YYMARKER;
/*!re2c
re2c:define:YYCTYPE = char;
re2c:yyfill:enable = 0;
D = [0-9];
'('D{3}')'D{3}'-'D{4} | D{10} | D{3}'-'D{3}'-'D{4} '\x00' { return 1; }
* { return 0; }
*/
}
int main(int argc, char **argv) //test it on main arguments
{
for(int i=1;i<argc;i++)
printf("%s\t%d\n", argv[i], verify(argv[i]));
}
Re2c will compile it into a well-oiled finite state machine (by oil, I mean goto
s, many goto
s):
/* Generated by re2c 0.16 on Wed Mar 22 00:08:21 2017 */
#line 1 "verify.c.re"
bool verify(char const *YYCURSOR)
{
char const*YYMARKER;
#line 8 "verify.c"
{
char yych;
yych = *YYCURSOR;
switch (yych) {
case '(': goto yy4;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy5;
default: goto yy2;
}
yy2:
++YYCURSOR;
yy3:
#line 10 "verify.c.re"
{ return 0; }
#line 31 "verify.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy6;
default: goto yy3;
}
yy5:
yych = *(YYMARKER = ++YYCURSOR);
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy8;
default: goto yy3;
}
yy6:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy9;
default: goto yy7;
}
yy7:
YYCURSOR = YYMARKER;
goto yy3;
yy8:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy10;
default: goto yy7;
}
yy9:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy11;
default: goto yy7;
}
yy10:
yych = *++YYCURSOR;
switch (yych) {
case '-': goto yy12;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy13;
default: goto yy7;
}
yy11:
yych = *++YYCURSOR;
switch (yych) {
case ')': goto yy14;
default: goto yy7;
}
yy12:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy15;
default: goto yy7;
}
yy13:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy16;
default: goto yy7;
}
yy14:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy17;
default: goto yy7;
}
yy15:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy18;
default: goto yy7;
}
yy16:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy19;
default: goto yy7;
}
yy17:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy20;
default: goto yy7;
}
yy18:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy21;
default: goto yy7;
}
yy19:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy22;
default: goto yy7;
}
yy20:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy23;
default: goto yy7;
}
yy21:
yych = *++YYCURSOR;
switch (yych) {
case '-': goto yy24;
default: goto yy7;
}
yy22:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy25;
default: goto yy7;
}
yy23:
yych = *++YYCURSOR;
switch (yych) {
case '-': goto yy19;
default: goto yy7;
}
yy24:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy26;
default: goto yy7;
}
yy25:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy27;
default: goto yy7;
}
yy26:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy28;
default: goto yy7;
}
yy27:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy29;
default: goto yy7;
}
yy28:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy31;
default: goto yy7;
}
yy29:
++YYCURSOR;
#line 9 "verify.c.re"
{ return 1; }
#line 373 "verify.c"
yy31:
yych = *++YYCURSOR;
switch (yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy32;
default: goto yy7;
}
yy32:
++YYCURSOR;
if ((yych = *YYCURSOR) <= 0x00) goto yy29;
goto yy7;
}
#line 12 "verify.c.re"