1 /* $Header: a2py.c,v 1.0.1.1 88/01/28 11:07:08 root Exp $
4 * Revision 1.0.1.1 88/01/28 11:07:08 root
5 * patch8: added support for FOO=bar switches using eval.
7 * Revision 1.0 87/12/18 17:50:33 root
28 linestr = str_new(80);
29 str = str_new(0); /* first used for -I flags */
30 for (argc--,argv++; argc; argc--,argv++) {
31 if (argv[0][0] != '-' || !argv[0][1])
37 debug = atoi(argv[0]+2);
39 yydebug = (debug & 1);
43 case '0': case '1': case '2': case '3': case '4':
44 case '5': case '6': case '7': case '8': case '9':
45 maxfld = atoi(argv[0]+1);
52 namelist = savestr(argv[0]+2);
60 fatal("Unrecognized switch: %s\n",argv[0]);
67 if (argv[0] == Nullch)
69 filename = savestr(argv[0]);
70 if (strEQ(filename,"-"))
75 rsfp = fopen(argv[0],"r");
77 fatal("Awk script \"%s\" doesn't seem to exist.\n",filename);
81 bufptr = str_get(linestr);
84 /* now parse the report spec */
87 fatal("Translation aborted due to syntax errors.\n");
97 printf("%d\t%d\t%d\t%-10s",i++,type,len,opname[type]);
99 printf("\t\"%s\"\n",ops[i].cval),i++;
102 printf("\t%d",ops[i].ival),i++;
112 /* first pass to look for numeric variables */
114 prewalk(0,0,root,&i);
116 /* second pass to produce new program */
118 tmpstr = walk(0,0,root,&i);
119 str = str_make("#!/bin/perl\n\n");
121 "eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift;\n");
123 " # process any FOO=bar switches\n\n");
124 if (do_opens && opens) {
129 str_scat(str,tmpstr);
139 #define RETURN(retval) return (bufptr = s,retval)
140 #define XTERM(retval) return (expectterm = TRUE,bufptr = s,retval)
141 #define XOP(retval) return (expectterm = FALSE,bufptr = s,retval)
142 #define ID(x) return (yylval=string(x,0),expectterm = FALSE,bufptr = s,VAR)
146 register char *s = bufptr;
154 fprintf(stderr,"Tokener at %s",s);
156 fprintf(stderr,"Tokener at %s\n",s);
161 "Unrecognized character %c in file %s line %d--ignoring.\n",
166 s = str_get(linestr);
171 if ((s = str_gets(linestr, rsfp)) == Nullch) {
175 s = str_get(linestr);
186 yylval = string(s,0);
207 for (d = s + 1; isspace(*d); d++) ;
232 yylval = string(s-1,2);
255 yylval = string("==",2);
259 yylval = string("=",1);
265 yylval = string("!=",2);
269 yylval = string("!~",2);
278 yylval = string("<=",2);
282 yylval = string("<",1);
288 yylval = string(">=",2);
292 yylval = string(">",1);
297 while (isalpha(*s) || isdigit(*s) || *s == '_') \
312 for (d = s; isdigit(*s); s++) ;
313 yylval = string(d,s-d);
319 split_to_array = set_array_base = TRUE;
322 case '/': /* may either be division or pattern */
329 yylval = string("/=",2);
335 case '0': case '1': case '2': case '3': case '4':
336 case '5': case '6': case '7': case '8': case '9':
341 s = cpy2(tokenbuf,s,s[-1]);
343 fatal("String not terminated:\n%s",str_get(linestr));
345 yylval = string(tokenbuf,0);
353 if (strEQ(d,"break"))
355 if (strEQ(d,"BEGIN"))
360 if (strEQ(d,"continue"))
372 if (strEQ(d,"exit")) {
376 if (strEQ(d,"exp")) {
385 if (saw_FS == 1 && in_begin) {
386 for (d = s; *d && isspace(*d); d++) ;
388 for (d++; *d && isspace(*d); d++) ;
389 if (*d == '"' && d[2] == '"')
395 if (strEQ(d,"FILENAME"))
402 if (strEQ(d,"getline"))
414 if (strEQ(d,"index")) {
415 set_array_base = TRUE;
418 if (strEQ(d,"int")) {
431 if (strEQ(d,"length")) {
435 if (strEQ(d,"log")) {
446 do_split = split_to_array = set_array_base = TRUE;
447 if (strEQ(d,"next")) {
454 if (strEQ(d,"ORS")) {
458 if (strEQ(d,"OFS")) {
462 if (strEQ(d,"OFMT")) {
468 if (strEQ(d,"print")) {
471 if (strEQ(d,"printf")) {
487 if (strEQ(d,"split")) {
488 set_array_base = TRUE;
491 if (strEQ(d,"substr")) {
492 set_array_base = TRUE;
495 if (strEQ(d,"sprintf"))
497 if (strEQ(d,"sqrt")) {
513 if (strEQ(d,"while"))
538 fatal("Search pattern not found:\n%s",str_get(linestr));
540 s = cpytill(tokenbuf,s,s[-1]);
542 fatal("Search pattern not terminated:\n%s",str_get(linestr));
544 yylval = string(tokenbuf,0);
551 fprintf(stderr,"%s in file %s at line %d\n",
562 case '1': case '2': case '3': case '4': case '5':
563 case '6': case '7': case '8': case '9': case '0' : case '.':
565 while (isdigit(*s) || *s == '_')
567 if (*s == '.' && index("0123456789eE",s[1]))
569 while (isdigit(*s) || *s == '_')
571 if (index("eE",*s) && index("+-0123456789",s[1]))
573 if (*s == '+' || *s == '-')
578 yylval = string(tokenbuf,0);
589 ops[mop++].ival = OSTRING + (1<<8);
592 ops[mop].cval = safemalloc(len+1);
593 strncpy(ops[mop].cval,ptr,len);
594 ops[mop++].cval[len] = '\0';
604 fatal("type > 255 (%d)\n",type);
605 ops[mop++].ival = type;
616 fatal("type > 255 (%d)\n",type);
617 ops[mop++].ival = type + (1<<8);
618 ops[mop++].ival = arg1;
622 oper2(type,arg1,arg2)
630 fatal("type > 255 (%d)\n",type);
631 ops[mop++].ival = type + (2<<8);
632 ops[mop++].ival = arg1;
633 ops[mop++].ival = arg2;
637 oper3(type,arg1,arg2,arg3)
646 fatal("type > 255 (%d)\n",type);
647 ops[mop++].ival = type + (3<<8);
648 ops[mop++].ival = arg1;
649 ops[mop++].ival = arg2;
650 ops[mop++].ival = arg3;
654 oper4(type,arg1,arg2,arg3,arg4)
664 fatal("type > 255 (%d)\n",type);
665 ops[mop++].ival = type + (4<<8);
666 ops[mop++].ival = arg1;
667 ops[mop++].ival = arg2;
668 ops[mop++].ival = arg3;
669 ops[mop++].ival = arg4;
673 oper5(type,arg1,arg2,arg3,arg4,arg5)
684 fatal("type > 255 (%d)\n",type);
685 ops[mop++].ival = type + (5<<8);
686 ops[mop++].ival = arg1;
687 ops[mop++].ival = arg2;
688 ops[mop++].ival = arg3;
689 ops[mop++].ival = arg4;
690 ops[mop++].ival = arg5;
703 type = ops[branch].ival;
706 for (i=depth; i; i--)
708 if (type == OSTRING) {
709 printf("%-5d\"%s\"\n",branch,ops[branch+1].cval);
712 printf("(%-5d%s %d\n",branch,opname[type],len);
714 for (i=1; i<=len; i++)
715 dump(ops[branch+i].ival);
717 for (i=depth; i; i--)
729 else if ((ops[arg].ival & 255) != OBLOCK)
730 return oper2(OBLOCK,arg,maybe);
731 else if ((ops[arg].ival >> 8) != 2)
732 return oper2(OBLOCK,ops[arg+1].ival,maybe);
743 for (s = str->str_ptr; *s; s++) {
744 if (*s == ';' && s[1] == ' ' && s[2] == '\n') {
748 else if (*s == '\n') {
749 for (t = s+1; isspace(*t & 127); t++) ;
751 while (isspace(*t & 127) && *t != '\n') t--;
752 if (*t == '\n' && t-s > 1) {
765 register char *d, *s, *t, *e;
766 register int pos, newpos;
770 for (s = str->str_ptr; *s; s++) {
781 if (pos > 78) { /* split a long line? */
784 for (t = tokenbuf; isspace(*t & 127); t++) {
791 while (d > tokenbuf && (*d != ' ' || d[-1] != ';'))
795 while (d > tokenbuf &&
796 (*d != ' ' || d[-1] != '|' || d[-2] != '|') )
801 while (d > tokenbuf &&
802 (*d != ' ' || d[-1] != '&' || d[-2] != '&') )
807 while (d > tokenbuf && (*d != ' ' || d[-1] != ','))
812 while (d > tokenbuf && *d != ' ')
819 if (d[-1] != ';' && !(newpos % 4)) {
839 for (t = tokenbuf; *t; t++) {
843 strcpy(t+strlen(t)-1, "\t#???\n");
848 if (strnEQ(t,"#!/bin/awk",10) || strnEQ(t,"#! /bin/awk",11))
851 fputs(tokenbuf,stdout);
860 key = walk(0,0,arg,&dummy);
862 hstore(symtab,key->str_ptr,str_make("1"));
864 set_array_base = TRUE;