⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a2py.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	    *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 + -