📄 a2py.c
字号:
*d = toupper(*d); ID(d); case 'p': case 'P': SNARFWORD; if (strEQ(d,"print")) { XTERM(PRINT); } if (strEQ(d,"printf")) { XTERM(PRINTF); } if (strEQ(d,"push")) *d = toupper(*d); else if (strEQ(d,"pop")) *d = toupper(*d); ID(d); case 'q': case 'Q': SNARFWORD; ID(d); case 'r': case 'R': SNARFWORD; if (strEQ(d,"RS")) { d = "/"; saw_RS = TRUE; } if (strEQ(d,"rand")) { yylval = ORAND; XTERM(FUN1); } if (strEQ(d,"return")) XTERM(RET); if (strEQ(d,"reset")) *d = toupper(*d); else if (strEQ(d,"redo")) *d = toupper(*d); else if (strEQ(d,"rename")) *d = toupper(*d); ID(d); case 's': case 'S': SNARFWORD; if (strEQ(d,"split")) { set_array_base = TRUE; XOP(SPLIT); } if (strEQ(d,"substr")) { set_array_base = TRUE; XTERM(SUBSTR); } if (strEQ(d,"sub")) XTERM(SUB); if (strEQ(d,"sprintf")) XTERM(SPRINTF); if (strEQ(d,"sqrt")) { yylval = OSQRT; XTERM(FUN1); } if (strEQ(d,"SUBSEP")) { d = ";"; } if (strEQ(d,"sin")) { yylval = OSIN; XTERM(FUN1); } if (strEQ(d,"srand")) { yylval = OSRAND; XTERM(FUN1); } if (strEQ(d,"system")) { yylval = OSYSTEM; XTERM(FUN1); } if (strEQ(d,"s")) *d = toupper(*d); else if (strEQ(d,"shift")) *d = toupper(*d); else if (strEQ(d,"select")) *d = toupper(*d); else if (strEQ(d,"seek")) *d = toupper(*d); else if (strEQ(d,"stat")) *d = toupper(*d); else if (strEQ(d,"study")) *d = toupper(*d); else if (strEQ(d,"sleep")) *d = toupper(*d); else if (strEQ(d,"symlink")) *d = toupper(*d); else if (strEQ(d,"sort")) *d = toupper(*d); ID(d); case 't': case 'T': SNARFWORD; if (strEQ(d,"tr")) *d = toupper(*d); else if (strEQ(d,"tell")) *d = toupper(*d); else if (strEQ(d,"time")) *d = toupper(*d); else if (strEQ(d,"times")) *d = toupper(*d); ID(d); case 'u': case 'U': SNARFWORD; if (strEQ(d,"until")) *d = toupper(*d); else if (strEQ(d,"unless")) *d = toupper(*d); else if (strEQ(d,"umask")) *d = toupper(*d); else if (strEQ(d,"unshift")) *d = toupper(*d); else if (strEQ(d,"unlink")) *d = toupper(*d); else if (strEQ(d,"utime")) *d = toupper(*d); ID(d); case 'v': case 'V': SNARFWORD; if (strEQ(d,"values")) *d = toupper(*d); ID(d); case 'w': case 'W': SNARFWORD; if (strEQ(d,"while")) XTERM(WHILE); if (strEQ(d,"write")) *d = toupper(*d); else if (strEQ(d,"wait")) *d = toupper(*d); ID(d); case 'x': case 'X': SNARFWORD; if (strEQ(d,"x")) *d = toupper(*d); ID(d); case 'y': case 'Y': SNARFWORD; if (strEQ(d,"y")) *d = toupper(*d); ID(d); case 'z': case 'Z': SNARFWORD; ID(d); }}char *scanpat(s)register char *s;{ register char *d; switch (*s++) { case '/': break; default: fatal("Search pattern not found:\n%s",str_get(linestr)); } d = tokenbuf; for (; *s; s++,d++) { if (*s == '\\') { if (s[1] == '/') *d++ = *s++; else if (s[1] == '\\') *d++ = *s++; else if (s[1] == '[') *d++ = *s++; } else if (*s == '[') { *d++ = *s++; do { if (*s == '\\' && s[1]) *d++ = *s++; if (*s == '/' || (*s == '-' && s[1] == ']')) *d++ = '\\'; *d++ = *s++; } while (*s && *s != ']'); } else if (*s == '/') break; *d = *s; } *d = '\0'; if (!*s) fatal("Search pattern not terminated:\n%s",str_get(linestr)); s++; yylval = string(tokenbuf,0); return s;}yyerror(s)char *s;{ fprintf(stderr,"%s in file %s at line %d\n", s,filename,line);}char *scannum(s)register char *s;{ register char *d; switch (*s) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0' : case '.': d = tokenbuf; while (isdigit(*s)) { *d++ = *s++; } if (*s == '.') { if (isdigit(s[1])) { *d++ = *s++; while (isdigit(*s)) { *d++ = *s++; } } else s++; } if (index("eE",*s) && index("+-0123456789",s[1])) { *d++ = *s++; if (*s == '+' || *s == '-') *d++ = *s++; while (isdigit(*s)) *d++ = *s++; } *d = '\0'; yylval = string(tokenbuf,0); break; } return s;}string(ptr,len)char *ptr;{ int retval = mop; ops[mop++].ival = OSTRING + (1<<8); if (!len) len = strlen(ptr); ops[mop].cval = safemalloc(len+1); strncpy(ops[mop].cval,ptr,len); ops[mop++].cval[len] = '\0'; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}oper0(type)int type;{ int retval = mop; if (type > 255) fatal("type > 255 (%d)\n",type); ops[mop++].ival = type; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}oper1(type,arg1)int type;int arg1;{ int retval = mop; if (type > 255) fatal("type > 255 (%d)\n",type); ops[mop++].ival = type + (1<<8); ops[mop++].ival = arg1; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}oper2(type,arg1,arg2)int type;int arg1;int arg2;{ int retval = mop; if (type > 255) fatal("type > 255 (%d)\n",type); ops[mop++].ival = type + (2<<8); ops[mop++].ival = arg1; ops[mop++].ival = arg2; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}oper3(type,arg1,arg2,arg3)int type;int arg1;int arg2;int arg3;{ int retval = mop; if (type > 255) fatal("type > 255 (%d)\n",type); ops[mop++].ival = type + (3<<8); ops[mop++].ival = arg1; ops[mop++].ival = arg2; ops[mop++].ival = arg3; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}oper4(type,arg1,arg2,arg3,arg4)int type;int arg1;int arg2;int arg3;int arg4;{ int retval = mop; if (type > 255) fatal("type > 255 (%d)\n",type); ops[mop++].ival = type + (4<<8); ops[mop++].ival = arg1; ops[mop++].ival = arg2; ops[mop++].ival = arg3; ops[mop++].ival = arg4; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}oper5(type,arg1,arg2,arg3,arg4,arg5)int type;int arg1;int arg2;int arg3;int arg4;int arg5;{ int retval = mop; if (type > 255) fatal("type > 255 (%d)\n",type); ops[mop++].ival = type + (5<<8); ops[mop++].ival = arg1; ops[mop++].ival = arg2; ops[mop++].ival = arg3; ops[mop++].ival = arg4; ops[mop++].ival = arg5; if (mop >= OPSMAX) fatal("Recompile a2p with larger OPSMAX\n"); return retval;}int depth = 0;dump(branch)int branch;{ register int type; register int len; register int i; type = ops[branch].ival; len = type >> 8; type &= 255; for (i=depth; i; i--) printf(" "); if (type == OSTRING) { printf("%-5d\"%s\"\n",branch,ops[branch+1].cval); } else { printf("(%-5d%s %d\n",branch,opname[type],len); depth++; for (i=1; i<=len; i++) dump(ops[branch+i].ival); depth--; for (i=depth; i; i--) printf(" "); printf(")\n"); }}bl(arg,maybe)int arg;int maybe;{ if (!arg) return 0; else if ((ops[arg].ival & 255) != OBLOCK) return oper2(OBLOCK,arg,maybe); else if ((ops[arg].ival >> 8) < 2) return oper2(OBLOCK,ops[arg+1].ival,maybe); else return arg;}fixup(str)STR *str;{ register char *s; register char *t; for (s = str->str_ptr; *s; s++) { if (*s == ';' && s[1] == ' ' && s[2] == '\n') { strcpy(s+1,s+2); s++; } else if (*s == '\n') { for (t = s+1; isspace(*t & 127); t++) ; t--; while (isspace(*t & 127) && *t != '\n') t--; if (*t == '\n' && t-s > 1) { if (s[-1] == '{') s--; strcpy(s+1,t); } s++; } }}putlines(str)STR *str;{ register char *d, *s, *t, *e; register int pos, newpos; d = tokenbuf; pos = 0; for (s = str->str_ptr; *s; s++) { *d++ = *s; pos++; if (*s == '\n') { *d = '\0'; d = tokenbuf; pos = 0; putone(); } else if (*s == '\t') pos += 7; if (pos > 78) { /* split a long line? */ *d-- = '\0'; newpos = 0; for (t = tokenbuf; isspace(*t & 127); t++) { if (*t == '\t') newpos += 8; else newpos += 1; } e = d; while (d > tokenbuf && (*d != ' ' || d[-1] != ';')) d--; if (d < t+10) { d = e; while (d > tokenbuf && (*d != ' ' || d[-1] != '|' || d[-2] != '|') ) d--; } if (d < t+10) { d = e; while (d > tokenbuf && (*d != ' ' || d[-1] != '&' || d[-2] != '&') ) d--; } if (d < t+10) { d = e; while (d > tokenbuf && (*d != ' ' || d[-1] != ',')) d--; } if (d < t+10) { d = e; while (d > tokenbuf && *d != ' ') d--; } if (d > t+3) { char save[2048]; strcpy(save, d); *d = '\n'; d[1] = '\0'; putone(); putchar('\n'); if (d[-1] != ';' && !(newpos % 4)) { *t++ = ' '; *t++ = ' '; newpos += 2; } strcpy(t,save+1); newpos += strlen(t); d = t + strlen(t); pos = newpos; } else d = e + 1; } }}putone(){ register char *t; for (t = tokenbuf; *t; t++) { *t &= 127; if (*t == 127) { *t = ' '; strcpy(t+strlen(t)-1, "\t#???\n"); checkers++; } } t = tokenbuf; if (*t == '#') { if (strnEQ(t,"#!/bin/awk",10) || strnEQ(t,"#! /bin/awk",11)) return; if (strnEQ(t,"#!/usr/bin/awk",14) || strnEQ(t,"#! /usr/bin/awk",15)) return; } fputs(tokenbuf,stdout);}numary(arg)int arg;{ STR *key; int dummy; key = walk(0,0,arg,&dummy,P_MIN); str_cat(key,"[]"); hstore(symtab,key->str_ptr,str_make("1")); str_free(key); set_array_base = TRUE; return arg;}rememberargs(arg)int arg;{ int type; STR *str; if (!arg) return arg; type = ops[arg].ival & 255; if (type == OCOMMA) { rememberargs(ops[arg+1].ival); rememberargs(ops[arg+3].ival); } else if (type == OVAR) { str = str_new(0); hstore(curarghash,ops[ops[arg+1].ival+1].cval,str); } else fatal("panic: unknown argument type %d, line %d\n",type,line); return arg;}aryrefarg(arg)int arg;{ int type = ops[arg].ival & 255; STR *str; if (type != OSTRING) fatal("panic: aryrefarg %d, line %d\n",type,line); str = hfetch(curarghash,ops[arg+1].cval); if (str) str_set(str,"*"); return arg;}fixfargs(name,arg,prevargs)int name;int arg;int prevargs;{ int type; STR *str; int numargs; if (!arg) return prevargs; type = ops[arg].ival & 255; if (type == OCOMMA) { numargs = fixfargs(name,ops[arg+1].ival,prevargs); numargs = fixfargs(name,ops[arg+3].ival,numargs); } else if (type == OVAR) { str = hfetch(curarghash,ops[ops[arg+1].ival+1].cval); if (strEQ(str_get(str),"*")) { char tmpbuf[128]; str_set(str,""); /* in case another routine has this */ ops[arg].ival &= ~255; ops[arg].ival |= OSTAR; sprintf(tmpbuf,"%s:%d",ops[name+1].cval,prevargs); fprintf(stderr,"Adding %s\n",tmpbuf); str = str_new(0); str_set(str,"*"); hstore(curarghash,tmpbuf,str); } numargs = prevargs + 1; } else fatal("panic: unknown argument type %d, arg %d, line %d\n", type,prevargs+1,line); return numargs;}fixrargs(name,arg,prevargs)char *name;int arg;int prevargs;{ int type; STR *str; int numargs; if (!arg) return prevargs; type = ops[arg].ival & 255; if (type == OCOMMA) { numargs = fixrargs(name,ops[arg+1].ival,prevargs); numargs = fixrargs(name,ops[arg+3].ival,numargs); } else { char tmpbuf[128]; sprintf(tmpbuf,"%s:%d",name,prevargs); str = hfetch(curarghash,tmpbuf); if (str && strEQ(str->str_ptr,"*")) { if (type == OVAR || type == OSTAR) { ops[arg].ival &= ~255; ops[arg].ival |= OSTAR; } else fatal("Can't pass expression by reference as arg %d of %s\n", prevargs+1, name); } numargs = prevargs + 1; } return numargs;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -