1 /* $Header: a2py.c,v 2.0 88/06/05 00:15:41 root Exp $
4 * Revision 2.0 88/06/05 00:15:41 root
5 * Baseline version 2.0.
27 linestr = str_new(80);
28 str = str_new(0); /* first used for -I flags */
29 for (argc--,argv++; argc; argc--,argv++) {
30 if (argv[0][0] != '-' || !argv[0][1])
36 debug = atoi(argv[0]+2);
38 yydebug = (debug & 1);
42 case '0': case '1': case '2': case '3': case '4':
43 case '5': case '6': case '7': case '8': case '9':
44 maxfld = atoi(argv[0]+1);
51 namelist = savestr(argv[0]+2);
59 fatal("Unrecognized switch: %s\n",argv[0]);
66 if (argv[0] == Nullch)
68 filename = savestr(argv[0]);
69 if (strEQ(filename,"-"))
74 rsfp = fopen(argv[0],"r");
76 fatal("Awk script \"%s\" doesn't seem to exist.\n",filename);
80 bufptr = str_get(linestr);
83 /* now parse the report spec */
86 fatal("Translation aborted due to syntax errors.\n");
96 printf("%d\t%d\t%d\t%-10s",i++,type,len,opname[type]);
98 printf("\t\"%s\"\n",ops[i].cval),i++;
101 printf("\t%d",ops[i].ival),i++;
111 /* first pass to look for numeric variables */
113 prewalk(0,0,root,&i);
115 /* second pass to produce new program */
117 tmpstr = walk(0,0,root,&i);
118 str = str_make("#!/usr/bin/perl\neval \"exec /usr/bin/perl -S $0 $*\"\n\
119 if $running_under_some_shell;\n\
120 # this emulates #! processing on NIH machines.\n\
121 # (remove #! line above if indigestible)\n\n");
123 "eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;\n");
125 " # process any FOO=bar switches\n\n");
126 if (do_opens && opens) {
131 str_scat(str,tmpstr);
140 "Please check my work on the %d line%s I've marked with \"#???\".\n",
141 checkers, checkers == 1 ? "" : "s" );
143 "The operation I've selected may be wrong for the operand types.\n");
148 #define RETURN(retval) return (bufptr = s,retval)
149 #define XTERM(retval) return (expectterm = TRUE,bufptr = s,retval)
150 #define XOP(retval) return (expectterm = FALSE,bufptr = s,retval)
151 #define ID(x) return (yylval=string(x,0),expectterm = FALSE,bufptr = s,VAR)
155 register char *s = bufptr;
163 fprintf(stderr,"Tokener at %s",s);
165 fprintf(stderr,"Tokener at %s\n",s);
170 "Unrecognized character %c in file %s line %d--ignoring.\n",
175 s = str_get(linestr);
180 if ((s = str_gets(linestr, rsfp)) == Nullch) {
184 s = str_get(linestr);
195 yylval = string(s,0);
216 for (d = s + 1; isspace(*d); d++) ;
226 yylval = string("~",1);
242 yylval = string(s-1,2);
265 yylval = string("==",2);
269 yylval = string("=",1);
275 yylval = string("!=",2);
279 yylval = string("!~",2);
288 yylval = string("<=",2);
292 yylval = string("<",1);
298 yylval = string(">>",2);
302 yylval = string(">=",2);
306 yylval = string(">",1);
311 while (isalpha(*s) || isdigit(*s) || *s == '_') \
326 for (d = s; isdigit(*s); s++) ;
327 yylval = string(d,s-d);
333 split_to_array = set_array_base = TRUE;
336 case '/': /* may either be division or pattern */
343 yylval = string("/=",2);
349 case '0': case '1': case '2': case '3': case '4':
350 case '5': case '6': case '7': case '8': case '9':
355 s = cpy2(tokenbuf,s,s[-1]);
357 fatal("String not terminated:\n%s",str_get(linestr));
359 yylval = string(tokenbuf,0);
367 if (strEQ(d,"break"))
369 if (strEQ(d,"BEGIN"))
374 if (strEQ(d,"continue"))
386 if (strEQ(d,"exit")) {
390 if (strEQ(d,"exp")) {
399 if (saw_FS == 1 && in_begin) {
400 for (d = s; *d && isspace(*d); d++) ;
402 for (d++; *d && isspace(*d); d++) ;
403 if (*d == '"' && d[2] == '"')
409 if (strEQ(d,"FILENAME"))
416 if (strEQ(d,"getline"))
428 if (strEQ(d,"index")) {
429 set_array_base = TRUE;
432 if (strEQ(d,"int")) {
445 if (strEQ(d,"length")) {
449 if (strEQ(d,"log")) {
460 do_split = split_to_array = set_array_base = TRUE;
461 if (strEQ(d,"next")) {
468 if (strEQ(d,"ORS")) {
472 if (strEQ(d,"OFS")) {
476 if (strEQ(d,"OFMT")) {
482 if (strEQ(d,"print")) {
485 if (strEQ(d,"printf")) {
501 if (strEQ(d,"split")) {
502 set_array_base = TRUE;
505 if (strEQ(d,"substr")) {
506 set_array_base = TRUE;
509 if (strEQ(d,"sprintf"))
511 if (strEQ(d,"sqrt")) {
527 if (strEQ(d,"while"))
552 fatal("Search pattern not found:\n%s",str_get(linestr));
556 for (; *s; s++,d++) {
560 else if (s[1] == '\\')
563 else if (*s == '[') {
566 if (*s == '\\' && s[1])
568 if (*s == '/' || (*s == '-' && s[1] == ']'))
571 } while (*s && *s != ']');
580 fatal("Search pattern not terminated:\n%s",str_get(linestr));
582 yylval = string(tokenbuf,0);
589 fprintf(stderr,"%s in file %s at line %d\n",
600 case '1': case '2': case '3': case '4': case '5':
601 case '6': case '7': case '8': case '9': case '0' : case '.':
603 while (isdigit(*s)) {
606 if (*s == '.' && index("0123456789eE",s[1])) {
608 while (isdigit(*s)) {
612 if (index("eE",*s) && index("+-0123456789",s[1])) {
614 if (*s == '+' || *s == '-')
620 yylval = string(tokenbuf,0);
631 ops[mop++].ival = OSTRING + (1<<8);
634 ops[mop].cval = safemalloc(len+1);
635 strncpy(ops[mop].cval,ptr,len);
636 ops[mop++].cval[len] = '\0';
646 fatal("type > 255 (%d)\n",type);
647 ops[mop++].ival = type;
658 fatal("type > 255 (%d)\n",type);
659 ops[mop++].ival = type + (1<<8);
660 ops[mop++].ival = arg1;
664 oper2(type,arg1,arg2)
672 fatal("type > 255 (%d)\n",type);
673 ops[mop++].ival = type + (2<<8);
674 ops[mop++].ival = arg1;
675 ops[mop++].ival = arg2;
679 oper3(type,arg1,arg2,arg3)
688 fatal("type > 255 (%d)\n",type);
689 ops[mop++].ival = type + (3<<8);
690 ops[mop++].ival = arg1;
691 ops[mop++].ival = arg2;
692 ops[mop++].ival = arg3;
696 oper4(type,arg1,arg2,arg3,arg4)
706 fatal("type > 255 (%d)\n",type);
707 ops[mop++].ival = type + (4<<8);
708 ops[mop++].ival = arg1;
709 ops[mop++].ival = arg2;
710 ops[mop++].ival = arg3;
711 ops[mop++].ival = arg4;
715 oper5(type,arg1,arg2,arg3,arg4,arg5)
726 fatal("type > 255 (%d)\n",type);
727 ops[mop++].ival = type + (5<<8);
728 ops[mop++].ival = arg1;
729 ops[mop++].ival = arg2;
730 ops[mop++].ival = arg3;
731 ops[mop++].ival = arg4;
732 ops[mop++].ival = arg5;
745 type = ops[branch].ival;
748 for (i=depth; i; i--)
750 if (type == OSTRING) {
751 printf("%-5d\"%s\"\n",branch,ops[branch+1].cval);
754 printf("(%-5d%s %d\n",branch,opname[type],len);
756 for (i=1; i<=len; i++)
757 dump(ops[branch+i].ival);
759 for (i=depth; i; i--)
771 else if ((ops[arg].ival & 255) != OBLOCK)
772 return oper2(OBLOCK,arg,maybe);
773 else if ((ops[arg].ival >> 8) < 2)
774 return oper2(OBLOCK,ops[arg+1].ival,maybe);
785 for (s = str->str_ptr; *s; s++) {
786 if (*s == ';' && s[1] == ' ' && s[2] == '\n') {
790 else if (*s == '\n') {
791 for (t = s+1; isspace(*t & 127); t++) ;
793 while (isspace(*t & 127) && *t != '\n') t--;
794 if (*t == '\n' && t-s > 1) {
807 register char *d, *s, *t, *e;
808 register int pos, newpos;
812 for (s = str->str_ptr; *s; s++) {
823 if (pos > 78) { /* split a long line? */
826 for (t = tokenbuf; isspace(*t & 127); t++) {
833 while (d > tokenbuf && (*d != ' ' || d[-1] != ';'))
837 while (d > tokenbuf &&
838 (*d != ' ' || d[-1] != '|' || d[-2] != '|') )
843 while (d > tokenbuf &&
844 (*d != ' ' || d[-1] != '&' || d[-2] != '&') )
849 while (d > tokenbuf && (*d != ' ' || d[-1] != ','))
854 while (d > tokenbuf && *d != ' ')
861 if (d[-1] != ';' && !(newpos % 4)) {
881 for (t = tokenbuf; *t; t++) {
885 strcpy(t+strlen(t)-1, "\t#???\n");
891 if (strnEQ(t,"#!/bin/awk",10) || strnEQ(t,"#! /bin/awk",11))
893 if (strnEQ(t,"#!/usr/bin/awk",14) || strnEQ(t,"#! /usr/bin/awk",15))
896 fputs(tokenbuf,stdout);
905 key = walk(0,0,arg,&dummy);
907 hstore(symtab,key->str_ptr,str_make("1"));
909 set_array_base = TRUE;