1 /* $Header: a2py.c,v 1.0 87/12/18 17:50:33 root Exp $
4 * Revision 1.0 87/12/18 17:50:33 root
25 linestr = str_new(80);
26 str = str_new(0); /* first used for -I flags */
27 for (argc--,argv++; argc; argc--,argv++) {
28 if (argv[0][0] != '-' || !argv[0][1])
34 debug = atoi(argv[0]+2);
36 yydebug = (debug & 1);
40 case '0': case '1': case '2': case '3': case '4':
41 case '5': case '6': case '7': case '8': case '9':
42 maxfld = atoi(argv[0]+1);
49 namelist = savestr(argv[0]+2);
57 fatal("Unrecognized switch: %s\n",argv[0]);
64 if (argv[0] == Nullch)
66 filename = savestr(argv[0]);
67 if (strEQ(filename,"-"))
72 rsfp = fopen(argv[0],"r");
74 fatal("Awk script \"%s\" doesn't seem to exist.\n",filename);
78 bufptr = str_get(linestr);
81 /* now parse the report spec */
84 fatal("Translation aborted due to syntax errors.\n");
94 printf("%d\t%d\t%d\t%-10s",i++,type,len,opname[type]);
96 printf("\t\"%s\"\n",ops[i].cval),i++;
99 printf("\t%d",ops[i].ival),i++;
109 /* first pass to look for numeric variables */
111 prewalk(0,0,root,&i);
113 /* second pass to produce new program */
115 tmpstr = walk(0,0,root,&i);
116 str = str_make("#!/bin/perl\n\n");
117 if (do_opens && opens) {
122 str_scat(str,tmpstr);
132 #define RETURN(retval) return (bufptr = s,retval)
133 #define XTERM(retval) return (expectterm = TRUE,bufptr = s,retval)
134 #define XOP(retval) return (expectterm = FALSE,bufptr = s,retval)
135 #define ID(x) return (yylval=string(x,0),expectterm = FALSE,bufptr = s,VAR)
139 register char *s = bufptr;
147 fprintf(stderr,"Tokener at %s",s);
149 fprintf(stderr,"Tokener at %s\n",s);
154 "Unrecognized character %c in file %s line %d--ignoring.\n",
159 s = str_get(linestr);
164 if ((s = str_gets(linestr, rsfp)) == Nullch) {
168 s = str_get(linestr);
179 yylval = string(s,0);
200 for (d = s + 1; isspace(*d); d++) ;
225 yylval = string(s-1,2);
248 yylval = string("==",2);
252 yylval = string("=",1);
258 yylval = string("!=",2);
262 yylval = string("!~",2);
271 yylval = string("<=",2);
275 yylval = string("<",1);
281 yylval = string(">=",2);
285 yylval = string(">",1);
290 while (isalpha(*s) || isdigit(*s) || *s == '_') \
305 for (d = s; isdigit(*s); s++) ;
306 yylval = string(d,s-d);
312 split_to_array = set_array_base = TRUE;
315 case '/': /* may either be division or pattern */
322 yylval = string("/=",2);
328 case '0': case '1': case '2': case '3': case '4':
329 case '5': case '6': case '7': case '8': case '9':
334 s = cpy2(tokenbuf,s,s[-1]);
336 fatal("String not terminated:\n%s",str_get(linestr));
338 yylval = string(tokenbuf,0);
346 if (strEQ(d,"break"))
348 if (strEQ(d,"BEGIN"))
353 if (strEQ(d,"continue"))
365 if (strEQ(d,"exit")) {
369 if (strEQ(d,"exp")) {
378 if (saw_FS == 1 && in_begin) {
379 for (d = s; *d && isspace(*d); d++) ;
381 for (d++; *d && isspace(*d); d++) ;
382 if (*d == '"' && d[2] == '"')
388 if (strEQ(d,"FILENAME"))
395 if (strEQ(d,"getline"))
407 if (strEQ(d,"index")) {
408 set_array_base = TRUE;
411 if (strEQ(d,"int")) {
424 if (strEQ(d,"length")) {
428 if (strEQ(d,"log")) {
439 do_split = split_to_array = set_array_base = TRUE;
440 if (strEQ(d,"next")) {
447 if (strEQ(d,"ORS")) {
451 if (strEQ(d,"OFS")) {
455 if (strEQ(d,"OFMT")) {
461 if (strEQ(d,"print")) {
464 if (strEQ(d,"printf")) {
480 if (strEQ(d,"split")) {
481 set_array_base = TRUE;
484 if (strEQ(d,"substr")) {
485 set_array_base = TRUE;
488 if (strEQ(d,"sprintf"))
490 if (strEQ(d,"sqrt")) {
506 if (strEQ(d,"while"))
531 fatal("Search pattern not found:\n%s",str_get(linestr));
533 s = cpytill(tokenbuf,s,s[-1]);
535 fatal("Search pattern not terminated:\n%s",str_get(linestr));
537 yylval = string(tokenbuf,0);
544 fprintf(stderr,"%s in file %s at line %d\n",
555 case '1': case '2': case '3': case '4': case '5':
556 case '6': case '7': case '8': case '9': case '0' : case '.':
558 while (isdigit(*s) || *s == '_')
560 if (*s == '.' && index("0123456789eE",s[1]))
562 while (isdigit(*s) || *s == '_')
564 if (index("eE",*s) && index("+-0123456789",s[1]))
566 if (*s == '+' || *s == '-')
571 yylval = string(tokenbuf,0);
582 ops[mop++].ival = OSTRING + (1<<8);
585 ops[mop].cval = safemalloc(len+1);
586 strncpy(ops[mop].cval,ptr,len);
587 ops[mop++].cval[len] = '\0';
597 fatal("type > 255 (%d)\n",type);
598 ops[mop++].ival = type;
609 fatal("type > 255 (%d)\n",type);
610 ops[mop++].ival = type + (1<<8);
611 ops[mop++].ival = arg1;
615 oper2(type,arg1,arg2)
623 fatal("type > 255 (%d)\n",type);
624 ops[mop++].ival = type + (2<<8);
625 ops[mop++].ival = arg1;
626 ops[mop++].ival = arg2;
630 oper3(type,arg1,arg2,arg3)
639 fatal("type > 255 (%d)\n",type);
640 ops[mop++].ival = type + (3<<8);
641 ops[mop++].ival = arg1;
642 ops[mop++].ival = arg2;
643 ops[mop++].ival = arg3;
647 oper4(type,arg1,arg2,arg3,arg4)
657 fatal("type > 255 (%d)\n",type);
658 ops[mop++].ival = type + (4<<8);
659 ops[mop++].ival = arg1;
660 ops[mop++].ival = arg2;
661 ops[mop++].ival = arg3;
662 ops[mop++].ival = arg4;
666 oper5(type,arg1,arg2,arg3,arg4,arg5)
677 fatal("type > 255 (%d)\n",type);
678 ops[mop++].ival = type + (5<<8);
679 ops[mop++].ival = arg1;
680 ops[mop++].ival = arg2;
681 ops[mop++].ival = arg3;
682 ops[mop++].ival = arg4;
683 ops[mop++].ival = arg5;
696 type = ops[branch].ival;
699 for (i=depth; i; i--)
701 if (type == OSTRING) {
702 printf("%-5d\"%s\"\n",branch,ops[branch+1].cval);
705 printf("(%-5d%s %d\n",branch,opname[type],len);
707 for (i=1; i<=len; i++)
708 dump(ops[branch+i].ival);
710 for (i=depth; i; i--)
722 else if ((ops[arg].ival & 255) != OBLOCK)
723 return oper2(OBLOCK,arg,maybe);
724 else if ((ops[arg].ival >> 8) != 2)
725 return oper2(OBLOCK,ops[arg+1].ival,maybe);
736 for (s = str->str_ptr; *s; s++) {
737 if (*s == ';' && s[1] == ' ' && s[2] == '\n') {
741 else if (*s == '\n') {
742 for (t = s+1; isspace(*t & 127); t++) ;
744 while (isspace(*t & 127) && *t != '\n') t--;
745 if (*t == '\n' && t-s > 1) {
758 register char *d, *s, *t, *e;
759 register int pos, newpos;
763 for (s = str->str_ptr; *s; s++) {
774 if (pos > 78) { /* split a long line? */
777 for (t = tokenbuf; isspace(*t & 127); t++) {
784 while (d > tokenbuf && (*d != ' ' || d[-1] != ';'))
788 while (d > tokenbuf &&
789 (*d != ' ' || d[-1] != '|' || d[-2] != '|') )
794 while (d > tokenbuf &&
795 (*d != ' ' || d[-1] != '&' || d[-2] != '&') )
800 while (d > tokenbuf && (*d != ' ' || d[-1] != ','))
805 while (d > tokenbuf && *d != ' ')
812 if (d[-1] != ';' && !(newpos % 4)) {
832 for (t = tokenbuf; *t; t++) {
836 strcpy(t+strlen(t)-1, "\t#???\n");
841 if (strnEQ(t,"#!/bin/awk",10) || strnEQ(t,"#! /bin/awk",11))
844 fputs(tokenbuf,stdout);
853 key = walk(0,0,arg,&dummy);
855 hstore(symtab,key->str_ptr,str_make("1"));
857 set_array_base = TRUE;