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

📄 r.c

📁 操作系统源代码
💻 C
字号:
/* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */#include <stdio.h>#include <ctype.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#ifdef DOS#include <process.h>#endif#include "awk.h"#include "regexp.h"#define MAXFLD	100extern char **FS, **RS, **OFS, **ORS, **FILENAME;extern double *NF, *NR;extern double *FNR;extern double *ARGC;extern SYMBOL *argtab[];extern CELL *getvar();char *strsave(), *strcpy(), *getsval(), *jStrchr(), *strchr();double getfval(), atof();CELL *mkcell(), *mktmp(), *execute(), *patexec();FILE *efopen();extern CELL truecell, falsecell;extern int pateval;int infileno = 1;FILE *ifp;char record[BUFSIZ];CELL *field[MAXFLD];char *fs_str;regexp *fs_pat;CELL *Getline(p) NODE *p;{  CELL *u;  char *fnam, *s, str[BUFSIZ];  int i;  FILE *fp, *getfp();  if ((int) p->n_arg[0])	/* read into var */	s = str;  else	s = NULL;  if ((int) p->n_arg[1]) {	/* file name */	u = execute(p->n_arg[1]);	fnam = getsval(u);	fp = getfp(fnam, (int) p->n_arg[2]);	c_free(u);	i = get1rec(s, fp);  }  else	i = Getrec(s);  if (s == str) {	u = execute(p->n_arg[0]);	setsval(u, str);  }  return mktmp(NUM, NULL, (double) i);}staticget1rec(buf, fp) char *buf; FILE *fp;{  register int c;  register char rs, *s;  int mflg;  if (buf == NULL)	buf = record;  if ((rs = **RS) == '\0') {	/* multi line record */	mflg = 1;	rs = '\n';  }  else	mflg = 0;  if (feof(fp) || (c = getc(fp)) == EOF)	return 0;  for (s = buf; ; ) {	for ( ; c != rs && c != EOF; c = getc(fp)) {		if (isKanji(c)) {			*s++ = c; c = getc(fp);		}		*s++ = c;	}	if (mflg) {		if ((c = getc(fp)) == '\n' || c == EOF)			break;		*s++ = '\n';	}	else		break;  }  *s = '\0';#if 1  if (buf == record) {#else  if (buf == record && c != EOF) {#endif	mkfld(record, *FS, field);	(*NR)++;	(*FNR)++;  }  return s > buf || c != EOF ? 1 : 0;}Getrec(s) char *s;{  CELL *u;  char *file, str[8];  while (ifp == stdin || infileno < (int)*ARGC) {	if (ifp == NULL) {		*FNR = 0.0;		if (infileno == (int)*ARGC)			break;		sprintf(str, "%d", infileno);		u = getvar(str, argtab);		file = getsval(u);		if (strchr(file, '=') != NULL) {			setvar(file);			infileno++;			continue;		}		else if (strcmp(file, "") == 0) {/*if (infileno == (int)*ARGC - 1)			ifp = stdin;*/			infileno++;			continue;		}		else {			if (strcmp(file, "-") == 0)				ifp = stdin;			else				ifp = efopen(file, "r");			*FILENAME = file;		}	}	if (get1rec(s, ifp))		return 1;	else {		if (ifp != stdin)			fclose(ifp);		ifp = NULL;		infileno++;	}  }  ifp = stdin;	/* for further "getline" */  *FILENAME = "-";  return 0;	/* EOF */}mkfld(rec, sep, fld) char *rec, *sep; CELL *fld[];{  char *s, *t;  char str[BUFSIZ];  int i, j, n;  int skip = 0;  if (strlen(sep) > 1)	return r_mkfld(rec, sep, fld);  if (*sep == ' ' || *sep == '\0') {	sep = " \t\n"; skip++;  }  for (i = 1, n = (int) *NF; i <= n; i++) {	sfree(fld[i]->c_sval);	sfree(fld[i]);	fld[i] = NULL;  }  for (i = 0, s = rec; ; ) {	t = str;	if (skip) {		while (*s && strchr(" \t\n", *s))			s++;		if (*s == '\0')			break;	}	while (*s && !jStrchr(sep, *s)) {		if (isKanji(*s))			*t++ = *s++;		*t++ = *s++;	}	*t = '\0';	if (isnum(str))		fld[++i] =  mkcell(FLD|STR|NUM, str, atof(str));	else		fld[++i] =  mkcell(FLD|STR, str, 0.0);	if (*s)		s++;	else		break;  }  *NF = (double) i;  return i;}staticr_mkfld(rec, sep, fld) char *rec, *sep; CELL *fld[];{  char *s, *t;  char str[BUFSIZ];  int i, n;  regexp *mkpat();  extern int r_start, r_length;  if (strcmp(*FS, fs_str) != 0) {	sfree(fs_str); sfree(fs_pat);	fs_str = strsave(*FS);	fs_pat = mkpat(fs_str);  }  for (i = 1, n = (int) *NF; i <= n; i++) {	sfree(fld[i]->c_sval);	sfree(fld[i]);	fld[i] = NULL;  }  for (i = 0, s = rec, t = str; *s; ) {	if (match(fs_pat, s)) {		for (n = r_start; --n > 0; )			*t++ = *s++;	}	else {		while (*s)			*t++ = *s++;	}	*t = '\0';	t = str;	fld[++i] = mkcell(FLD|STR, str, 0.0);	if (*s)		s += r_length;  }  *NF = (double) i;  return i;}mkrec(u) CELL *u;{  register char *s, *t;  register int i, j;  for (j = (int)*NF, i = 1; i <= j; i++)	if (field[i] == u)		break;  if (i > j) {	for ( ; i < MAXFLD; i++)		if (field[i] == u)			break;	if (i == MAXFLD)		error("too many field (%d)", i);	*NF = (double)i;  }  for (t = record, i = 1, j = (int) *NF; i <= j; i++) {	if (i > 1)		*t++ = **OFS;	for (s = getsval(field[i]); *s; )		*t++ = *s++;  }  *t++ = '\0';}CELL *Field(p) NODE *p;{  CELL *u;  int i, j;  u = execute(p->n_arg[0]);  i = (int) getfval(u);  c_free(u);  j = (int)*NF;  if (i > j)	for (++j; j <= i; j++) {		if (field[j] == NULL)			field[j] = mkcell(FLD|STR, "", 0.0);	}  return field[i];}CELL *P1stat(p) NODE *p;{  CELL *u;  double x;  pateval++;  u = execute(p->n_arg[0]);  pateval = 0;  x = getfval(u);  c_free(u);  if (x != 0.0)	u = execute(p->n_arg[1]);  else	u = &truecell;  return u;}CELL *P2stat(p) NODE *p;{  static stat = 0;  CELL *u, *v;  double x;  switch (stat) {  case 0:	pateval++;	u = execute(p->n_arg[0]);	pateval = 0;	x = getfval(u);	c_free(u);	if (x == 0.0) {		u = &truecell; break;	}	else		stat++;	/* fall through */  case 1:	u = execute(p->n_arg[2]);	c_free(u);	pateval++;	u = execute(p->n_arg[1]);	pateval = 0;	x = getfval(u);	if (x != 0.0)		stat = 0;	break;  default:	u = &truecell;	break;  }  return u;}CELL *Print0(){/*  int i, j;  char *s, str[BUFSIZ];  for (*str = '\0', i = 1, j = (int) *NF; i <= j; i++) {	if (i > 1)		strcat(str, *OFS);	s = getsval(field[i]);	strcat(str, s);  }  strcat(str, *ORS);  fputs(str, stdout);*/  fprintf(stdout, "%s%s", record, *ORS);  return &truecell;}char *format(t, p) char *t; NODE *p;{  CELL *u, *v;  char *r, *s, *s0, fmt[BUFSIZ];  double x;  int i;  u = execute(p->n_arg[2]);  s = s0 = getsval(u);/*printf("fmt(%s)\n", s);*/  for (i = 3; *s; s++) {	if (isKanji(*s)) {		*t++ = *s++; *t++ = *s; continue;	}	if (*s != '%') {		*t++ = *s; continue;	}	else if (*(s + 1) == '%') {		*t++ = *s++; continue;	}	for (r = fmt, *r++ = *s++; *r++ = *s; s++) {		if (strchr("%cdefgosux", *s))			break;	}	*r = '\0';	if (p->n_arg[i] == NULL)		error("not enough args in printf(%s)", s0);	v = execute(p->n_arg[i++]);	if (*s == 's')		r = getsval(v);	else		x = getfval(v);/*printf("val(%d)(%s)\n", v->c_type, v->c_sval);*/	switch (*s) {	case 'c':		sprintf(t, fmt, (int) x);		break;	case 'd':		if (*(s - 1) != 'l') {			*--r = 'l'; *++r = 'd'; *++r = '\0';		}		sprintf(t, fmt, (long) x);		break;	case 'e': case 'f': case 'g':		sprintf(t, fmt, x);		break;	case 'o': case 'u': case 'x':		if (*(s - 1) == 'l')			sprintf(t, fmt, (long) x);		else			sprintf(t, fmt, (int) x);		break;	case 's':		/*r = getsval(v);*/		sprintf(t, fmt, r);		break;	default:		strcpy(t, fmt);		break;	}	c_free(v);	t += strlen(t);  }  c_free(u);  *t = '\0';}#define MAXFILE	10struct {  char *f_name;	/* file name */  FILE *f_fp;  int f_type;} filetab[MAXFILE];FILE *getfp(file, type) char *file;{  register int i;  register char *name, *mode;  char *awktmp();  FILE *fp, *efopen(), *epopen();  for (i = 0; i < MAXFILE; i++)	if (filetab[i].f_name && strcmp(filetab[i].f_name, file) == 0)		return filetab[i].f_fp;  for (i = 0; i < MAXFILE; i++)	if (!filetab[i].f_fp)		break;  if (i == MAXFILE)	error("too many files to open");  name = file;  switch (type) {  case R_OUT:	mode = "w"; break;  case R_APD:	mode = "a"; break;  case R_POUT:#ifdef DOS	name = awktmp(i); mode = "w";	/* MS-DOS */#else	fp = epopen(file, "w");	goto g1;#endif	break;  case R_IN:	mode = "r"; break;  case R_PIN:#ifdef DOS	{		int savefd, fd, result;		name = awktmp(i);		if ((fd = open(name,		O_WRONLY|O_TEXT|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE)) == -1)			error("can't open %s", name);		savefd = dup(1); dup2(fd, 1); close(fd);		if ((result =			system(file)) == -1)			error("can't exec %s", file);		dup2(savefd, 1); close(savefd); close(fd);		mode = "r";	}#else	fp = epopen(file,"r");	goto g1;#endif	break;  }  fp = efopen(name, mode);g1:  filetab[i].f_name = strsave(file);  filetab[i].f_type = type;  filetab[i].f_fp = fp;  return fp;}closeall(){  register int i;  for (i = 0; i < MAXFILE; i++)	close1(i);}CELL *Close(s) char *s;{  register int i;  for (i = 0; i < MAXFILE; i++)	if (strcmp(s, filetab[i].f_name) == 0) {		close1(i);		break;	}  i = (i == MAXFILE) ? 0 : 1;  return mktmp(NUM, NULL, (double) i);}staticclose1(i){  int fd, result, savefd;  char *awktmp();  if (filetab[i].f_fp == NULL)	return;  switch (filetab[i].f_type) {  case R_PIN:#ifdef DOS	fclose(filetab[i].f_fp);	unlink(awktmp(i));#else	pclose(filetab[i].f_fp);#endif	break;  case R_IN: case R_OUT: case R_APD:	fclose(filetab[i].f_fp);	break;  case R_POUT:#ifdef DOS	fclose(filetab[i].f_fp);	if ((fd = open(awktmp(i), O_RDONLY)) == NULL)		error("can't open %s", awktmp(i));	savefd = dup(0);	dup2(fd, 0);	close(fd);	if ((result =		system(filetab[i].f_name)) == -1)/*	spawnl(P_WAIT, "/usr/bin/sh", "sh", "-c", filetab[i].f_name, (char *) 0)) == -1)		fprintf(stderr, "can't spawn /bin/sh\n");*/		error("can't exec %s", filetab[i].f_name);	dup2(savefd, 0);	close(savefd);	unlink(awktmp(i));#else	pclose(filetab[i].f_fp);#endif	break;  }  sfree(filetab[i].f_name);  filetab[i].f_type = 0;  filetab[i].f_name = NULL;  filetab[i].f_fp = NULL;}#ifndef DOSFILE *epopen(file, mod) char *file, *mod;{  FILE *fp, *popen();  if ((fp = popen(file, mod)) == NULL)	error("can't poen %s", file);  return fp;}#endifstatic char *awktmp(i){  static char str[16];  sprintf(str, "awk000%02d.tmp", i);  return str;}Index(s, t) char *s, *t;{  register char *u, *v;  register int i;  for (i = 1; *s; s++, i++) {	for (u = s, v = t; *v; u++, v++) {		if (isKanji(*v)) {			if (*u != *v)				break;			u++; v++;		}		if (*u != *v)			break;	}	if (*v == '\0')		return i;	if (isKanji(*s))		s++;  }  return 0;}

⌨️ 快捷键说明

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