150 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * 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 "awk.h"
 | |
| 
 | |
| NODE *
 | |
| node0(type)
 | |
| {
 | |
|   NODE *p;
 | |
|   char *emalloc();
 | |
| 
 | |
|   p = (NODE *) emalloc(sizeof(*p) - sizeof(p));
 | |
|   p->n_type = type;
 | |
|   p->n_next = NULL;
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| NODE *
 | |
| node1(type, arg0) NODE *arg0;
 | |
| {
 | |
|   NODE *p;
 | |
|   char *emalloc();
 | |
| 
 | |
|   p = (NODE *) emalloc(sizeof(*p));
 | |
|   p->n_type = type;
 | |
|   p->n_next = NULL;
 | |
|   p->n_arg[0] = (NODE *) arg0;
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| NODE *
 | |
| node2(type, arg0, arg1) NODE *arg0, *arg1;
 | |
| {
 | |
|   NODE *p;
 | |
|   char *emalloc();
 | |
| 
 | |
|   p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * 1);
 | |
|   p->n_type = type;
 | |
|   p->n_next = NULL;
 | |
|   p->n_arg[0] = (NODE *) arg0;
 | |
|   p->n_arg[1] = (NODE *) arg1;
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| NODE *
 | |
| node3(type, arg0, arg1, arg2) NODE *arg0, *arg1, *arg2;
 | |
| {
 | |
|   NODE *p;
 | |
|   char *emalloc();
 | |
| 
 | |
|   p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * 2);
 | |
|   p->n_type = type;
 | |
|   p->n_next = NULL;
 | |
|   p->n_arg[0] = (NODE *) arg0;
 | |
|   p->n_arg[1] = (NODE *) arg1;
 | |
|   p->n_arg[2] = (NODE *) arg2;
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| NODE *
 | |
| node4(type, arg0, arg1, arg2, arg3) NODE *arg0, *arg1, *arg2, *arg3;
 | |
| {
 | |
|   NODE *p;
 | |
|   char *emalloc();
 | |
| 
 | |
|   p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * 3);
 | |
|   p->n_type = type;
 | |
|   p->n_next = NULL;
 | |
|   p->n_arg[0] = (NODE *) arg0;
 | |
|   p->n_arg[1] = (NODE *) arg1;
 | |
|   p->n_arg[2] = (NODE *) arg2;
 | |
|   p->n_arg[3] = (NODE *) arg3;
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| CELL *
 | |
| mkcell(type, sval, fval) char *sval; double fval;
 | |
| {
 | |
|   CELL *p;
 | |
|   char *emalloc(), *strsave();
 | |
| 
 | |
|   p = (CELL *) emalloc(sizeof(*p));
 | |
|   p->c_type = type;
 | |
|   if (sval == NULL)
 | |
| 	p->c_sval = NULL;
 | |
|   else
 | |
| 	p->c_sval = strsave(sval);
 | |
|   p->c_fval = fval;
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| #ifdef TMPCELL
 | |
| #define MAXTMP	25
 | |
| 
 | |
| CELL tmpcell[MAXTMP];
 | |
| #endif
 | |
| 
 | |
| CELL *
 | |
| mktmp(type, sval, fval) char *sval; double fval;
 | |
| {
 | |
|   register int i;
 | |
|   char *strsave();
 | |
| 
 | |
| #ifdef TMPCELL
 | |
|   for (i = 0; i < MAXTMP; i++)
 | |
| 	if (tmpcell[i].c_type == 0) {
 | |
| 		tmpcell[i].c_type = type | TMP;
 | |
| 		tmpcell[i].c_sval = strsave(sval);
 | |
| 		tmpcell[i].c_fval = fval;
 | |
| 		return &tmpcell[i];
 | |
| 	}
 | |
|   error("formula too complex", (char *) 0);
 | |
| #else
 | |
|   return mkcell(type | TMP, sval, fval);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| c_free(p) CELL *p;
 | |
| {
 | |
|   if ((p != NULL) && (p->c_type & TMP)) {
 | |
| #ifdef TMPCELL
 | |
| 	p->c_type = 0;
 | |
| 	sfree(p->c_sval);
 | |
| 	p->c_sval = (char *)NULL;
 | |
| 	p->c_fval = 0.0;
 | |
| #else
 | |
| 	if (p->c_sval != NULL) {
 | |
| 		Free(p->c_sval);
 | |
| 		p->c_sval = NULL;
 | |
| 	}
 | |
| 	p->c_type = 0;
 | |
| 	Free(p);
 | |
| 	p = NULL;
 | |
| #endif
 | |
|   }
 | |
| }
 | 
