/* * File: wsu2tipa.l * * (c) Peter Kleiweg 2000 * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2, * or (at your option) any later version. * * Compile: * * flex -B -8 wsu2tipa.l * gcc -s -Wall -o wsu2tipa lex.yy.c -lfl * rm lex.yy.c */ %{ #ifdef __MSDOS__ # include # include # include #else # include #endif #include #include #include #include int line = 1; long count = 0; char *filename, *programname; void out (char const *s), warn (void), get_programname (char const *argv0), syntax (void), errit (char const *format, ...); #define YY_NO_UNPUT #define YY_SKIP_YYWRAP #ifdef yywrap # undef yywrap #endif int yywrap() { return 1; } %} S ([^a-zA-Z]) %Start _dia _open %% \\inva/{S} { out ("\\textturna"); } \\scripta/{S} { out ("\\textscripta"); } \\nialpha/{S} { warn (); } \\invscripta/{S} { out ("\\textturnscripta"); } \\invv/{S} { out ("\\textturnv"); } \\crossb/{S} { out ("\\textcrb"); } \\barb/{S} { out ("\\textbarb"); } \\slashb/{S} { out ("\\ipaclap{b}{/}"); } \\hookb/{S} { out ("\\texthtb"); } \\nibeta/{S} { out ("\\textbeta"); } \\slashc/{S} { out ("\\ipaclap{c}{/}"); } \\curlyc/{S} { out ("\\textctc"); } \\clickc/{S} { out ("\\textstretchc"); } \\crossd/{S} { out ("\\textcrd"); } \\bard/{S} { out ("\\textbard"); } \\slashd/{S} { out ("\\ipaclap{d}{/}"); } \\hookd/{S} { out ("\\texthtd"); } \\taild/{S} { out ("\\textrtaild"); } \\dz/{S} { out ("\\textdyoghlig"); } \\eth/{S} { out ("\\dh"); } \\scd/{S} { warn (); } \\schwa/{S} { out ("\\textschwa"); } \\er/{S} { out ("\\textrhookschwa"); } \\reve/{S} { out ("\\textreve"); } \\niepsilon/{S} { out ("\\textepsilon"); } \\revepsilon/{S} { out ("\\textrevepsilon"); } \\hookrevepsilon/{S} { out ("\\textrhookrevepsilon"); } \\closedrevepsilon/{S} { out ("\\textcloserevepsilon"); } \\scriptg/{S} { out ("\\textipa{g}"); } \\hookg/{S} { out ("\\texthtg"); } \\scg/{S} { out ("\\textscg"); } \\nigamma/{S} { out ("\\textramshorns"); } \\ipagamma/{S} { out ("\\textgamma"); } \\babygamma/{S} { out ("\\textbabygamma"); } \\hv/{S} { out ("\\texthvlig"); } \\crossh/{S} { out ("\\textcrh"); } \\hookh/{S} { out ("\\texthth"); } \\hookheng/{S} { out ("\\texththeng"); } \\invh/{S} { out ("\\textturnh"); } \\bari/{S} { out ("\\textbari"); } \\dlbari/{S} { out ("\\ipabar{\\i}{.5ex}{1.1}{}{}"); } \\niiota/{S} { out ("\\textiota"); } \\sci/{S} { out ("\\textsci"); } \\barsci/{S} { out ("\\ipabar{\\textsci}{.5ex}{1.1}{}{}"); } \\invf/{S} { out ("\\textObardotlessj"); } \\tildel/{S} { out ("\\textltilde"); } \\barl/{S} { out ("\\textbarl"); } \\latfric/{S} { out ("\\textbeltl"); } \\taill/{S} { out ("\\textrtaill"); } \\lz/{S} { out ("\\textlyoghlig"); } \\nilambda/{S} { out ("\\textlambda"); } \\crossnilambda/{S} { out ("\\textcrlambda"); } \\labdentalnas/{S} { out ("\\textltailm"); } \\invm/{S} { out ("\\textturnm"); } \\legm/{S} { out ("\\textturnmrleg"); } \\nj/{S} { out ("\\textltailn"); } \\eng/{S} { out ("\\ng"); } \\tailn/{S} { out ("\\textrtailn"); } \\scn/{S} { out ("\\textscn"); } \\clickb/{S} { out ("\\textbullseye"); } \\baro/{S} { out ("\\textbaro"); } \\openo/{S} { out ("\\textopeno"); } \\niomega/{S} { out ("\\textomega"); } \\closedniomega/{S} { out ("\\textcloseomega"); } \\oo/{S} { warn (); } \\barp/{S} { out ("\\ipabar{p}{.5ex}{1.1}{}{}"); } \\thorn/{S} { out ("\\textthorn"); } \\niphi/{S} { out ("\\textphi"); } \\flapr/{S} { out ("\\textfishhookr"); } \\legr/{S} { out ("\\textlonglegr"); } \\tailr/{S} { out ("\\textrtailr"); } \\invr/{S} { out ("\\textturnr"); } \\tailinvr/{S} { out ("\\textturnrrtail"); } \\invlegr/{S} { out ("\\textturnlonglegr"); } \\scr/{S} { out ("\\textscr"); } \\invscr/{S} { out ("\\textinvscr"); } \\tails/{S} { out ("\\textrtails"); } \\esh/{S} { out ("\\textesh"); } \\curlyesh/{S} { out ("\\textctesh"); } \\nisigma/{S} { warn (); } \\tailt/{S} { out ("\\textrtailt"); } \\tesh/{S} { out ("\\textteshlig"); } \\clickt/{S} { out ("\\textturnt"); } \\nitheta/{S} { out ("\\texttheta"); } \\baru/{S} { out ("\\textbaru"); } \\slashu/{S} { out ("\\ipaclap{u}{/}"); } \\niupsilon/{S} { out ("\\textupsilon"); } \\scu/{S} { out ("\\textscu"); } \\barscu/{S} { out ("\\ipabar{\\textscu}{.5ex}{1.1}{}{}"); } \\scriptv/{S} { out ("\\textscriptv"); } \\invw/{S} { out ("\\textturnw"); } \\nichi/{S} { out ("\\textchi"); } \\invy/{S} { out ("\\textturny"); } \\scy/{S} { out ("\\textscy"); } \\curlyz/{S} { out ("\\textctz"); } \\tailz/{S} { out ("\\textrtailz"); } \\yogh/{S} { out ("\\textyogh"); } \\curlyyogh/{S} { out ("\\textctyogh"); } \\glotstop/{S} { out ("\\textglotstop"); } \\revglotstop/{S} { out ("\\textrevglotstop"); } \\invglotstop/{S} { out ("\\textinvglotstop"); } \\ejective/{S} { out ("\\textraiseglotstop"); } \\reveject/{S} { warn (); } \\dental/{S} { out ("\\textsubbridge"); } \\stress/{S} { out ("\\textprimstress"); } \\secstress/{S} { out ("\\textsecstress"); } \\syllabic/{S} { out ("\\textsyllabic"); } \\corner/{S} { out ("\\textcorner"); } \\upt/{S} { out ("\\textraising"); } \\downt/{S} { out ("\\textlowering"); } \\leftt/{S} { out ("\\textadvancing"); } \\rightt/{S} { out ("\\textretracting"); } \\halflength/{S} { out ("\\texthalflength"); } \\length/{S} { out ("\\textlengthmark"); } \\underdots/{S} { out ("\\textsubumlaut"); } \\ain/{S} { out ("\\textrevapostrophe"); } \\upp/{S} { out ("\\^"); } \\downp/{S} { out ("\\v"); } \\leftp/{S} { out ("\\textlptr"); } \\rightp/{S} { out ("\\textrptr"); } \\overring/{S} { out ("\\r"); } \\underring/{S} { out ("\\textsubring"); } \\open/{S} { out ("\\textsublhalfring"); } \\midtilde/{S} { out ("\\textsuperimposetilde"); } \\undertilde/{S} { out ("\\textsubtilde"); } \\underwedge/{S} { out ("\\textsubwedge"); } \\polishhook/{S} { out ("\\textpolhook"); } \\underarch/{S} { out ("\\textsubarch"); } \\dia(top|under)/{S} { BEGIN _dia; } \n { line++; fputc ('\n', yyout); } <_dia>"{" { BEGIN _open; } <_open>"|" { fputc ('{', yyout); BEGIN INITIAL; } %% int main (int argc, char *argv []) { get_programname (argv [0]); switch (argc) { case 1: if (isatty (fileno (stdin))) syntax (); yyin = stdin; filename = "(stdin)"; break; case 2: yyin = fopen (argv [1], "r"); if (! yyin) errit ("Opening file \"%s\": %s", argv [1], strerror (errno)); filename = argv [1]; break; default: syntax (); } yylex (); if (yyin != stdin) fclose (yyin); fprintf (stderr, "%li change%s made.\n", count, (count == 1) ? "" : "s"); return 0; } void out (char const *s) { fputs (s, yyout); count++; } void warn () { fputs (yytext, yyout); fprintf (stderr, "%s:%i: UNTRANSLATED: %s\n", filename, line, yytext); } void get_programname (char const *argv0) { #ifdef __MSDOS__ char name [MAXFILE]; fnsplit (argv0, NULL, NULL, name, NULL); programname = strdup (name); #else /* unix */ char *p; p = strrchr (argv0, '/'); if (p) programname = strdup (p + 1); else programname = strdup (argv0); #endif } void errit (char const *format, ...) { va_list list; fprintf (stderr, "\nError %s: ", programname); va_start (list, format); vfprintf (stderr, format, list); fprintf (stderr, "\n\n"); exit (1); } void syntax () { fprintf ( stderr, "\n" "Usage: %s [file.tex]\n" "\n" "This program translates wsuipa font commands into tipa font commands.\n" "\n", programname ); exit (1); }