Читаем UNIX — универсальная среда программирования полностью

 if (fin fin != stdin)

  fclose(fin);

 infile = *gargv++;

 lineno = 1;

 if (strcmp(infile, "-") == 0) {

  fin = stdin;

  infile = 0;

 } else if ((fin=fopen(infile, "r")) == NULL) {

  fprintf (stderr, "%s: can't open %s\n", progname, infile);

  return moreinput;

 }

 return 1;

}


run /* execute until EOF */

{

 setjmp(begin);

 signal(SIGFPE, fpecatch);

 for (initcode; yyparse; initcode)

  execute(progbase);

}


warning(s, t) /* print warning message */

 char *s, *t;

{

 fprintf(stderr, "%s: %s", progname, s);

 if (t)

  fprintf(stderr, " %s", t);

 if (infile)

  fprintf(stderr, " in %s", infile);

 fprintf(stderr, " near line %d\n", lineno);

 while (c != '\n' c != EOF)

  с = getc(fin); /* flush rest of input line */

 if (c == '\n')

  lineno++;

}

3.7.15 init.c

#include "hoc.h"

#include "y.tab.h"

#include math.h


extern double Log, Log10, Sqrt, Exp, integer;


static struct { /* Keywords */

 char *name;

 int kval;

} keywords[] = {

 "proc",   PROC,

 "func",   FUNC,

 "return", RETURN,

 "if",     IF,

 "else",   ELSE,

 "while",  WHILE,

 "print",  PRINT,

 "read",   READ,

 0,        0,

};


static struct { /* Constants */

 char *name;

 double eval;

} consts[] = {

 "PI",    3.14159265358979323846,

 "E",     2.71828182845904523536,

 "GAMMA", 0.57721566490153286060, /* Euler */

 "DEG",  57.29577951308232087680, /* deg/radian */

 "PHI",   1.61803398874989484820, /* golden ratio */

 0,       0

};


static struct { /* Built-ins */

 char *name;

 double (*func);

} builtins[] = {

 "sin",   sin,

 "cos",   cos,

 "atan",  atan,

 "log",   Log, /* checks range */

 "log10", Log10, /* checks range */

 "exp",   Exp, /* checks range */

 "sqrt",  Sqrt, /* checks range */

 "int",   integer,

 "abs",   fabs,

 0, 0

};


init /* install constants and built-ins in table */

{

 int i;

 Symbol *s;


 for (i = 0; keywords[i].name; i++)

  install(keywords[i].name, keywords[i].kval, 0.0);

 for (i = 0; consts[i].name; i++)

  install(consts[i].name, VAR, consts[i].eval);

 for (i = 0; builtins[i].name; i++) {

  s = install(builtins[i].name, BLTIN, 0.0);

  s-u.ptr = builtins[i].func;

 }

}

3.7.16 makeapp

#!/bin/sh


cd hoc6

for i in hoc.y hoc.h symbol.c code.c init.c math.c makefile

do

 echo "

**** $i ***************************************

"

 sed 's/\\/\\e/g

 s/^$/.sp .5/' $i |

 awk '

                      { print }

  /(^ ;$)|(^})|(^%%)/ { print ".P3" }

 '

done

3.7.17 makefile

CC = lcc

YFLAGS = -d

OBJS = hoc.o code.o init.o math.o symbol.o


hoc6: $(OBJS)

      $(CC) $(CFLAGS) $(OBJS) -lm -o hoc6


hoc.o code.o init.o symbol.o: hoc.h


code.o init.o symbol.o: x.tab.h


x.tab.h: y.tab.h

      -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h


pr: hoc.y hoc.h code.c init.c math.c symbol.c

      @pr $?

      @touch pr


clean:

      rm -f $(OBJS) [xy].tab.[ch]

3.7.18 math.c

#include math.h

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже