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
 | 
						|
  }
 | 
						|
}
 |