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

📄 4.4bsd-patches

📁 早期freebsd实现
💻 4BSD-PATCHES
字号:
From: Vern Paxson <vern@daffy.ee.lbl.gov>I've ported Research Awk to flex and tested it moderately.  Note that Ididn't have time to support the nice error-message context stuff (whereit points out exactly where on a line it thinks an error occurred), asthe original code made a lot of assumptions regarding the internalbuffering of a lex scanner that are no longer valid with flex.  Also, thesources had a function called "isnumber" which conflicted with a macro bythe same name in <ctype.h>, so I changed its name to is_a_number.Let me know if you find more problems.		Verndiff -wc orig/awk.lx.l awk.lx.l*** orig/awk.lx.l	Fri Oct 29 10:39:54 1993--- awk.lx.l	Fri Oct 29 11:07:35 1993****************** 25,37 ****  THIS SOFTWARE.  ****************************************************************/  - /* some of this depends on behavior of lex that-    may not be preserved in other implementations of lex.- */- - #undef	input	/* defeat lex */- #undef	unput-   #include <stdlib.h>  #include <string.h>  #include "awk.h"--- 25,30 ----****************** 60,65 ****--- 53,70 ----  uchar	cbuf[CBUFLEN];  uchar	*s;  int	clen, cflag;+ + /* some of this depends on behavior of lex that+    may not be preserved in other implementations of lex.+ */+ + static	int	my_input( YY_CHAR *buf, int max_size );+ + #undef YY_INPUT+ #define YY_INPUT(buf,result,max_size) result = my_input(buf, max_size);+ + #undef YY_USER_INIT+ #define YY_USER_INIT init_input_source();  %}    A	[a-zA-Z_]****************** 70,76 ****  WS	[ \t]    %%! 	switch (yybgin-yysvec-1) {	/* witchcraft */  	case 0:  		BEGIN A;  		break;--- 75,81 ----  WS	[ \t]    %%! 	switch ((yy_start - 1) / 2) {	/* witchcraft */  	case 0:  		BEGIN A;  		break;****************** 116,128 ****    <A>"$"{D}+	{ yylval.cp = fieldadr(atoi(yytext+1)); RET(FIELD); }  <A>"$NF"	{ unputstr("(NF)"); return(INDIRECT); }! <A>"$"{A}{B}*	{ int c, n;! 		  c = input(); unput(c);! 		  if (c == '(' || c == '[' || infunc && (n=isarg(yytext+1)) >= 0) {! 			unputstr(yytext+1);  			return(INDIRECT);  		  } else {! 			yylval.cp = setsymtab(yytext+1,"",0.0,STR|NUM,symtab);  			RET(IVAR);  		  }  		}--- 121,139 ----    <A>"$"{D}+	{ yylval.cp = fieldadr(atoi(yytext+1)); RET(FIELD); }  <A>"$NF"	{ unputstr("(NF)"); return(INDIRECT); }! <A>"$"{A}{B}*	{! 		  int c;! 		  char *yytext_copy = strdup(yytext);! 		  c = input(); unput(c);	/* look for '(' or '[' */! 		  if (c == '(' || c == '[' ||! 		      infunc && isarg(yytext_copy+1) >= 0) {! 			  unputstr(yytext_copy+1);! 			  free(yytext_copy);  			  return(INDIRECT);  		  } else {! 			  yylval.cp =! 				setsymtab(yytext_copy+1,"",0.0,STR|NUM,symtab);! 			  free(yytext_copy);  			  RET(IVAR);  		  }  		}****************** 172,183 ****  <A>fflush	{ yylval.i = FFLUSH; RET(BLTIN); }    <A>{A}{B}*	{ int n, c;  		  c = input(); unput(c);	/* look for '(' */! 		  if (c != '(' && infunc && (n=isarg(yytext)) >= 0) {  			yylval.i = n;  			RET(ARG);  		  } else {! 			yylval.cp = setsymtab(yytext,"",0.0,STR|NUM,symtab);  			if (c == '(') {  				RET(CALL);  			} else {--- 183,198 ----  <A>fflush	{ yylval.i = FFLUSH; RET(BLTIN); }    <A>{A}{B}*	{ int n, c;+ 		  char *yytext_copy = strdup(yytext);  		  c = input(); unput(c);	/* look for '(' */! 		  if (c != '(' && infunc && (n=isarg(yytext_copy)) >= 0) {  			yylval.i = n;+ 			free(yytext_copy);  			RET(ARG);  		  } else {! 			yylval.cp =! 				setsymtab(yytext_copy,"",0.0,STR|NUM,symtab);! 			free(yytext_copy);  			if (c == '(') {  				RET(CALL);  			} else {****************** 185,190 ****--- 200,206 ----  			}  		  }  		}+   <A>\"		{ BEGIN str; clen = 0; }    <A>"}"		{ if (--bracecnt < 0) ERROR "extra }" SYNTAX; BEGIN sc; RET(';'); }****************** 235,280 ****  	clen = 0;  }  ! /* input() and unput() are transcriptions of the standard lex!    macros for input and output with additions for error message!    printing.  God help us all if someone changes how lex works.! */! ! uchar	ebuf[300];! uchar	*ep = ebuf;! ! input(void)	/* get next lexical input character */  {- 	register int c;  	extern uchar *lexprog;  ! 	if (yysptr > yysbuf)! 		c = U(*--yysptr);! 	else if (lexprog != NULL) {	/* awk '...' */! 		if (c = *lexprog)! 			lexprog++;! 	} else				/* awk -f ... */! 		c = pgetc();! 	if (c == '\n')! 		yylineno++;! 	else if (c == EOF)! 		c = 0;! 	if (ep >= ebuf + sizeof ebuf)! 		ep = ebuf;! 	return *ep++ = c;  }  ! void unput(int c)	/* put lexical character back on input */! {! 	yytchar = c;! 	if (yytchar == '\n')! 		yylineno--;! 	*yysptr++ = yytchar;! 	if (--ep < ebuf)! 		ep = ebuf + sizeof(ebuf) - 1;  }  -   void unputstr(char *s)	/* put a string back on input */  {  	int i;--- 251,281 ----  	clen = 0;  }  ! static int my_input( YY_CHAR *buf, int max_size )  {  	extern uchar *lexprog;  ! 	if ( lexprog ) {		/* awk '...' */! 		int num_chars = strlen( lexprog );! 		if ( num_chars > max_size )! 			{! 			num_chars = max_size;! 			strncpy( buf, lexprog, num_chars );  			}+ 		else+ 			strcpy( buf, lexprog );+ 		lexprog += num_chars;+ 		return num_chars;  ! 	} else {			/* awk -f ... */! 		int c = pgetc();! 		if (c == EOF)! 			return 0;! 		buf[0] = c;! 		return 1;  	}+ }    void unputstr(char *s)	/* put a string back on input */  {  	int i;****************** 281,284 ****--- 282,290 ----    	for (i = strlen(s)-1; i >= 0; i--)  		unput(s[i]);+ }+ + int lex_input()+ {+ 	return input();  }diff -wc orig/lib.c lib.c*** orig/lib.c	Fri Oct 29 10:39:55 1993--- lib.c	Fri Oct 29 11:22:33 1993****************** 129,135 ****  					xfree(recloc->sval);  				recloc->sval = record;  				recloc->tval = REC | STR | DONTFREE;! 				if (isnumber(recloc->sval)) {  					recloc->fval = atof(recloc->sval);  					recloc->tval |= NUM;  				}--- 129,135 ----  					xfree(recloc->sval);  				recloc->sval = record;  				recloc->tval = REC | STR | DONTFREE;! 				if (is_a_number(recloc->sval)) {  					recloc->fval = atof(recloc->sval);  					recloc->tval |= NUM;  				}****************** 202,208 ****  	p = qstring(p, '\0');  	q = setsymtab(s, p, 0.0, STR, symtab);  	setsval(q, p);! 	if (isnumber(q->sval)) {  		q->fval = atof(q->sval);  		q->tval |= NUM;  	}--- 202,208 ----  	p = qstring(p, '\0');  	q = setsymtab(s, p, 0.0, STR, symtab);  	setsval(q, p);! 	if (is_a_number(q->sval)) {  		q->fval = atof(q->sval);  		q->tval |= NUM;  	}****************** 268,274 ****  	maxfld = i;  	donefld = 1;  	for (p = fldtab+1; p <= fldtab+maxfld; p++) {! 		if(isnumber(p->sval)) {  			p->fval = atof(p->sval);  			p->tval |= NUM;  		}--- 268,274 ----  	maxfld = i;  	donefld = 1;  	for (p = fldtab+1; p <= fldtab+maxfld; p++) {! 		if(is_a_number(p->sval)) {  			p->fval = atof(p->sval);  			p->tval |= NUM;  		}****************** 410,416 ****    	if (beenhere++)  		return;! 	while ((c = input()) != EOF && c != '\0')  		bclass(c);  	bcheck2(bracecnt, '{', '}');  	bcheck2(brackcnt, '[', ']');--- 410,416 ----    	if (beenhere++)  		return;! 	while ((c = lex_input()) != EOF && c != '\0')  		bclass(c);  	bcheck2(bracecnt, '{', '}');  	bcheck2(brackcnt, '[', ']');****************** 458,463 ****--- 458,464 ----    void eprint(void)	/* try to print context around error */  {+ #if 0  	uchar *p, *q;  	int c;  	static int been_here = 0;****************** 490,495 ****--- 491,497 ----  		}  	putc('\n', stderr);  	ep = ebuf;+ #endif  }    void bclass(int c)****************** 534,540 ****    #define	MAXEXPON	38	/* maximum exponent for fp number. should be IEEE */  ! isnumber(uchar *s)	/* probably should be done by a library function */  {  	register int d1, d2;  	int point;--- 536,542 ----    #define	MAXEXPON	38	/* maximum exponent for fp number. should be IEEE */  ! is_a_number(uchar *s)	/* probably should be done by a library function */  {  	register int d1, d2;  	int point;diff -wc orig/main.c main.c*** orig/main.c	Fri Oct 29 10:39:54 1993--- main.c	Fri Oct 29 10:43:31 1993****************** 175,177 ****--- 175,189 ----  		curpfile++;  	}  }+ + void init_input_source(void)+ {+ 	if (yyin == NULL) {+ 		if (pfile[curpfile] == 0)+ 			return;+ 		if (strcmp((char *) pfile[curpfile], "-") == 0)+ 			yyin = stdin;+ 		else if ((yyin = fopen((char *) pfile[curpfile], "r")) == NULL)+ 			ERROR "can't open file %s", pfile[curpfile] FATAL;+ 	}+ }diff -wc orig/proto.h proto.h*** orig/proto.h	Fri Oct 29 10:39:52 1993--- proto.h	Fri Oct 29 11:22:28 1993****************** 22,28 ****  THIS SOFTWARE.  ****************************************************************/  - extern	int	yywrap(void);  extern	void	setfname(Cell *);  extern	int	constnode(Node *);  extern	uchar	*strnode(Node *);--- 22,27 ----****************** 31,42 ****    extern	int	yylex(void);  extern	void	startreg(void);! extern	int	input(void);! extern	void	unput(int);  extern	void	unputstr(char *);- extern	int	yylook(void);- extern	int	yyback(int *, int);- extern	int	yyinput(void);    extern	fa	*makedfa(uchar *, int);  extern	fa	*mkdfa(uchar *, int);--- 30,37 ----    extern	int	yylex(void);  extern	void	startreg(void);! extern	int	lex_input(void);  extern	void	unputstr(char *);    extern	fa	*makedfa(uchar *, int);  extern	fa	*mkdfa(uchar *, int);****************** 66,71 ****--- 61,67 ----    extern	int	main(int, uchar **);  extern	int	pgetc(void);+ extern	void	init_input_source(void);    extern	Node	*nodealloc(int);  extern	Node	*exptostat(Node *);****************** 130,136 ****  extern	void	bclass(int);  extern	double	errcheck(double, uchar *);  extern	int	isclvar(uchar *);! extern	int	isnumber(uchar *);    extern	void	run(Node *);  extern	Cell	*r_execute(Node *);--- 126,132 ----  extern	void	bclass(int);  extern	double	errcheck(double, uchar *);  extern	int	isclvar(uchar *);! extern	int	is_a_number(uchar *);    extern	void	run(Node *);  extern	Cell	*r_execute(Node *);diff -wc orig/run.c run.c*** orig/run.c	Fri Oct 29 10:39:56 1993--- run.c	Fri Oct 29 11:22:39 1993****************** 360,366 ****  			strcpy(record, buf);  			recloc->sval = record;  			recloc->tval = REC | STR | DONTFREE;! 			if (isnumber(recloc->sval)) {  				recloc->fval = atof(recloc->sval);  				recloc->tval |= NUM;  			}--- 360,366 ----  			strcpy(record, buf);  			recloc->sval = record;  			recloc->tval = REC | STR | DONTFREE;! 			if (is_a_number(recloc->sval)) {  				recloc->fval = atof(recloc->sval);  				recloc->tval |= NUM;  			}****************** 618,624 ****    	x = execute(a[0]);  	m = getfval(x);! 	if (m == 0 && !isnumber(s = getsval(x)))	/* suspicion! */  		ERROR "illegal field $(%s), name \"%s\"", s, x->nval FATAL;    /* can x->nval ever be null??? */  		/* ERROR "illegal field $(%s)", s FATAL; */--- 618,624 ----    	x = execute(a[0]);  	m = getfval(x);! 	if (m == 0 && !is_a_number(s = getsval(x)))	/* suspicion! */  		ERROR "illegal field $(%s), name \"%s\"", s, x->nval FATAL;    /* can x->nval ever be null??? */  		/* ERROR "illegal field $(%s)", s FATAL; */****************** 1097,1103 ****  				sprintf((char *)num, "%d", n);  				temp = *patbeg;  				*patbeg = '\0';! 				if (isnumber(s))  					setsymtab(num, s, atof((char *)s), STR|NUM, (Array *) ap->sval);  				else  					setsymtab(num, s, 0.0, STR, (Array *) ap->sval);--- 1097,1103 ----  				sprintf((char *)num, "%d", n);  				temp = *patbeg;  				*patbeg = '\0';! 				if (is_a_number(s))  					setsymtab(num, s, atof((char *)s), STR|NUM, (Array *) ap->sval);  				else  					setsymtab(num, s, 0.0, STR, (Array *) ap->sval);****************** 1114,1120 ****  		}  		n++;  		sprintf((char *)num, "%d", n);! 		if (isnumber(s))  			setsymtab(num, s, atof((char *)s), STR|NUM, (Array *) ap->sval);  		else  			setsymtab(num, s, 0.0, STR, (Array *) ap->sval);--- 1114,1120 ----  		}  		n++;  		sprintf((char *)num, "%d", n);! 		if (is_a_number(s))  			setsymtab(num, s, atof((char *)s), STR|NUM, (Array *) ap->sval);  		else  			setsymtab(num, s, 0.0, STR, (Array *) ap->sval);****************** 1134,1140 ****  			temp = *s;  			*s = '\0';  			sprintf((char *)num, "%d", n);! 			if (isnumber(t))  				setsymtab(num, t, atof((char *)t), STR|NUM, (Array *) ap->sval);  			else  				setsymtab(num, t, 0.0, STR, (Array *) ap->sval);--- 1134,1140 ----  			temp = *s;  			*s = '\0';  			sprintf((char *)num, "%d", n);! 			if (is_a_number(t))  				setsymtab(num, t, atof((char *)t), STR|NUM, (Array *) ap->sval);  			else  				setsymtab(num, t, 0.0, STR, (Array *) ap->sval);****************** 1151,1157 ****  			temp = *s;  			*s = '\0';  			sprintf((char *)num, "%d", n);! 			if (isnumber(t))  				setsymtab(num, t, atof((char *)t), STR|NUM, (Array *) ap->sval);  			else  				setsymtab(num, t, 0.0, STR, (Array *) ap->sval);--- 1151,1157 ----  			temp = *s;  			*s = '\0';  			sprintf((char *)num, "%d", n);! 			if (is_a_number(t))  				setsymtab(num, t, atof((char *)t), STR|NUM, (Array *) ap->sval);  			else  				setsymtab(num, t, 0.0, STR, (Array *) ap->sval);diff -wc orig/tran.c tran.c*** orig/tran.c	Fri Oct 29 10:39:57 1993--- tran.c	Fri Oct 29 11:22:43 1993****************** 110,116 ****  	cp->sval = (uchar *) ARGVtab;  	for (i = 0; i < ac; i++) {  		sprintf((char *)temp, "%d", i);! 		if (isnumber(*av))  			setsymtab(temp, *av, atof(*av), STR|NUM, ARGVtab);  		else  			setsymtab(temp, *av, 0.0, STR, ARGVtab);--- 110,116 ----  	cp->sval = (uchar *) ARGVtab;  	for (i = 0; i < ac; i++) {  		sprintf((char *)temp, "%d", i);! 		if (is_a_number(*av))  			setsymtab(temp, *av, atof(*av), STR|NUM, ARGVtab);  		else  			setsymtab(temp, *av, 0.0, STR, ARGVtab);****************** 130,136 ****  		if ((p = (uchar *) strchr((char *) *envp, '=')) == NULL)  			continue;  		*p++ = 0;	/* split into two strings at = */! 		if (isnumber(p))  			setsymtab(*envp, p, atof(p), STR|NUM, ENVtab);  		else  			setsymtab(*envp, p, 0.0, STR, ENVtab);--- 130,136 ----  		if ((p = (uchar *) strchr((char *) *envp, '=')) == NULL)  			continue;  		*p++ = 0;	/* split into two strings at = */! 		if (is_a_number(p))  			setsymtab(*envp, p, atof(p), STR|NUM, ENVtab);  		else  			setsymtab(*envp, p, 0.0, STR, ENVtab);****************** 332,338 ****  		recbld();  	if (!isnum(vp)) {	/* not a number */  		vp->fval = atof(vp->sval);	/* best guess */! 		if (isnumber(vp->sval) && !(vp->tval&CON))  			vp->tval |= NUM;	/* make NUM only sparingly */  	}  	dprintf( ("getfval %o: %s = %g, t=%o\n", vp, vp->nval, vp->fval, vp->tval) );--- 332,338 ----  		recbld();  	if (!isnum(vp)) {	/* not a number */  		vp->fval = atof(vp->sval);	/* best guess */! 		if (is_a_number(vp->sval) && !(vp->tval&CON))  			vp->tval |= NUM;	/* make NUM only sparingly */  	}  	dprintf( ("getfval %o: %s = %g, t=%o\n", vp, vp->nval, vp->fval, vp->tval) );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -