home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #4 / amigaacscoverdisc1998-041998.iso / utilities / shareware / dev / ucb_logoppc / source / logo.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-23  |  14.2 KB  |  436 lines

  1. /*
  2.  *      logo.h          logo header file                dvb
  3.  *
  4.  * Copyright (C) 1993 by the Regents of the University of California
  5.  *
  6.  *      This program is free software; you can redistribute it and/or modify
  7.  *      it under the terms of the GNU General Public License as published by
  8.  *      the Free Software Foundation; either version 2 of the License, or
  9.  *      (at your option) any later version.
  10.  *
  11.  *      This program is distributed in the hope that it will be useful,
  12.  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *      GNU General Public License for more details.
  15.  *
  16.  *      You should have received a copy of the GNU General Public License
  17.  *      along with this program; if not, write to the Free Software
  18.  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  */
  21.  
  22.  
  23. #ifndef _LOGO_H
  24. #define _LOGO_H
  25.  
  26. /* #define MEM_DEBUG */
  27.  
  28. #define ecma   /* for European extended character set using parity bit */
  29.  
  30. #ifdef WIN32
  31. #define ibm
  32. #undef __ZTC__
  33. #define HAVE_MEMCPY
  34. #endif
  35.  
  36. #ifdef THINK_C
  37. #define mac
  38. #define HAVE_MEMCPY
  39. #endif
  40.  
  41. #ifdef __TURBOC__
  42. #define ibm
  43. #endif
  44.  
  45. #ifdef __ZTC__
  46. #define ibm
  47. #define HAVE_MEMCPY
  48. #endif
  49.  
  50. #ifdef _MSC_VER
  51. #define ibm
  52. #endif
  53.  
  54. #if !defined(ibm) && !defined(mac)
  55. #ifndef unix
  56. #define unix
  57. #endif
  58. #include "config.h"
  59. #ifndef X_DISPLAY_MISSING
  60. #define x_window
  61. #endif
  62. #else
  63. #define RETSIGTYPE void
  64. #ifndef STDC_HEADERS
  65. #define STDC_HEADERS
  66. #endif
  67. #endif
  68.  
  69. #include <stdio.h>
  70. #include <string.h>
  71. #include <signal.h>
  72. #ifdef STDC_HEADERS
  73. #include <stdlib.h>
  74. #else
  75. #include <sys/types.h>
  76. #include <malloc.h>
  77. extern char *getenv();
  78. #endif
  79.  
  80. #ifdef ibm
  81. #include <dos.h>
  82. #endif
  83.  
  84. #ifdef AMIGA
  85. #define check_throwing (check_amiga_stop() || stopping_flag == THROWING)
  86. #else
  87. #ifdef mac
  88. #define check_throwing (check_mac_stop() || stopping_flag == THROWING)
  89. #else
  90. #if defined(ibm)
  91. #define check_throwing (check_ibm_stop() || stopping_flag == THROWING)
  92. #else
  93. #define check_throwing (stopping_flag == THROWING)
  94. #endif
  95. #endif
  96. #endif
  97.  
  98. typedef enum {wrapmode, fencemode, windowmode} mode_type;
  99.  
  100. #define WORDSIZE  (8*sizeof(long))
  101.  
  102. #define NIL             (NODE *) 0
  103. #define UNBOUND         Unbound
  104. #define UNDEFINED       Unbound
  105. #define END_OF_LIST     (NODE *) 2
  106. #define HASH_LEN        1021  /* a prime number */
  107. #ifdef __ZTC__
  108. #define SEG_SIZE  2000
  109. #else
  110. #ifdef THINK_C
  111. #define SEG_SIZE  4000
  112. #else
  113. #define SEG_SIZE        16000 /* Should be a fairly big number for optimal GC
  114.                                  Performance */
  115. #endif
  116. #endif
  117. #define MAX_PHYS_LINE   5000
  118. #define MAX_NUMBER      200   /* max number of digits in a float */
  119.  
  120. #define STOP_PRIORITY   0
  121. #define OUTPUT_PRIORITY 1
  122. #define MAYBE_PRIORITY  2
  123. #define TAIL_PRIORITY   2  /* largest tailcall priority */
  124. #define MACRO_PRIORITY  3
  125. #define PREFIX_PRIORITY 4
  126.  
  127. typedef short NODETYPES;
  128.  
  129. /* Note that some of these values are used twice; they must be
  130.  * distinguishable by the other bits used with them. */
  131.  
  132. #define NT_TREE      (NODETYPES)0100000
  133. #define NT_EMPTY  (NODETYPES)040000
  134. #define NT_AGGR      (NODETYPES)020000
  135. #define NT_LIST      (NODETYPES)010000
  136. #define NT_RUNP      (NODETYPES)004000
  137. #define NT_ARRAY  (NODETYPES)002000
  138. #define NT_WORD      (NODETYPES)001000
  139. #define NT_NUMBER (NODETYPES)000400
  140. #define NT_FLOAT  (NODETYPES)000200
  141. #define NT_CONT      (NODETYPES)000200
  142. #define NT_PRIM      (NODETYPES)000100
  143. #define NT_INFIX  (NODETYPES)000040
  144. #define NT_LINE      (NODETYPES)000040
  145. #define NT_VBAR      (NODETYPES)000040
  146. #define NT_STRING (NODETYPES)000020
  147. #define NT_BACKSL (NODETYPES)000010
  148. #define NT_PUNCT  (NODETYPES)000004
  149. #define NT_TAILFORM  (NODETYPES)000004
  150. #define NT_COLON  (NODETYPES)000002
  151. #define NT_MACRO  (NODETYPES)000002
  152. #define NT_CASEOBJ   (NODETYPES)000001
  153.  
  154. #define  PNIL     (NODETYPES)(NT_EMPTY|NT_AGGR|NT_LIST)
  155. #define PUNBOUND  (NODETYPES)0
  156. #define CONS      (NODETYPES)(NT_AGGR|NT_LIST)
  157. #define STRING    (NODETYPES)(NT_WORD|NT_STRING)
  158. #define INT    (NODETYPES)(NT_WORD|NT_NUMBER)
  159. #define FLOATT    (NODETYPES)(NT_WORD|NT_NUMBER|NT_FLOAT)
  160. #define PRIM      (NODETYPES)(NT_PRIM)
  161. #define MACRO     (NODETYPES)(NT_PRIM|NT_MACRO)
  162. #define TAILFORM  (NODETYPES)(NT_PRIM|NT_TAILFORM)
  163. #define CASEOBJ      (NODETYPES)(NT_WORD|NT_CASEOBJ)
  164. #define INFIX     (NODETYPES)(NT_PRIM|NT_INFIX)
  165. #define TREE      (NODETYPES)(NT_AGGR|NT_LIST|NT_TREE)
  166. #define RUN_PARSE (NODETYPES)(NT_AGGR|NT_LIST|NT_RUNP)
  167. #define QUOTE     (NODETYPES)(NT_WORD|NT_PUNCT)
  168. #define COLON     (NODETYPES)(NT_WORD|NT_PUNCT|NT_COLON)
  169. #define BACKSLASH_STRING (NODETYPES)(NT_WORD|NT_STRING|NT_BACKSL)
  170. #define VBAR_STRING  (NODETYPES)(NT_WORD|NT_STRING|NT_BACKSL|NT_VBAR)
  171. #define ARRAY     (NODETYPES)(NT_AGGR|NT_ARRAY)
  172. #define LINE      (NODETYPES)(NT_LINE|NT_LIST|NT_AGGR)
  173. #define CONT      (NODETYPES)(NT_CONT|NT_LIST)
  174. #define NTFREE    (NODETYPES)(-1)
  175.  
  176. #define aggregate(nd)   (nodetype(nd) & NT_AGGR)
  177. #define is_cont(nd)  (nodetype(nd) == CONT)
  178. #define is_list(nd)  (nodetype(nd) & NT_LIST)
  179. #define is_tree(nd)  (nodetype(nd) & NT_TREE)
  180. #define is_string(nd)   (nodetype(nd) & NT_STRING)
  181. #define is_number(nd)   (nodetype(nd) & NT_NUMBER)
  182. #define is_prim(nd)  (nodetype(nd) & NT_PRIM)
  183. #define is_word(nd)  (nodetype(nd) & NT_WORD)
  184. #define runparsed(nd)   (nodetype(nd) & NT_RUNP)
  185. #define backslashed(nd) (nodetype(nd) & NT_BACKSL)
  186. #define is_tailform(nd) (nodetype(nd) == TAILFORM)
  187.  
  188. typedef enum { FATAL, OUT_OF_MEM, STACK_OVERFLOW, TURTLE_OUT_OF_BOUNDS,
  189.       BAD_DATA_UNREC, DIDNT_OUTPUT, NOT_ENOUGH, BAD_DATA, TOO_MUCH,
  190.       DK_WHAT, PAREN_MISMATCH, NO_VALUE, UNEXPECTED_PAREN, DK_HOW,
  191.       NO_CATCH_TAG, ALREADY_DEFINED, STOP_ERROR, ALREADY_DRIBBLING,
  192.       FILE_ERROR, IF_WARNING, SHADOW_WARN, USER_ERR, IS_PRIM,
  193.       NOT_INSIDE, DK_HOW_UNREC, NO_TEST, UNEXPECTED_BRACKET,
  194.       UNEXPECTED_BRACE, BAD_GRAPH_INIT, ERR_MACRO,
  195.       DK_WHAT_UP, AT_TOPLEVEL, APPLY_BAD_DATA, DEEPEND,
  196.       OUT_OF_MEM_UNREC} ERR_TYPES;
  197.  
  198. #ifdef WIN32
  199. #define BOOLEAN int
  200. #else
  201. typedef int BOOLEAN;
  202. #endif
  203.  
  204. #define FALSE  0
  205. #define TRUE   1
  206.  
  207. #define even_p(x) !(x & 0x1)
  208.  
  209. #define FIXNUM          long
  210. #define FLONUM          double
  211. #define MAXLOGOINT   0x7fffffff
  212. #define SAFEINT      0x00003fff  /* safe to multiply w/o overflow */
  213.  
  214. struct string_block {
  215.     unsigned FIXNUM str_refcnt;
  216.     char str_str[1];     /* This array will be of variable length really */
  217. };
  218.  
  219. #define getstrrefcnt(sh)        ((sh)->str_refcnt)
  220. #define setstrrefcnt(sh, v)     ((sh)->str_refcnt = (v))
  221. #define incstrrefcnt(sh)        (((sh)->str_refcnt)++)
  222. #define decstrrefcnt(sh)        (--((sh)->str_refcnt))
  223.  
  224. typedef struct logo_node {
  225.     NODETYPES node_type;
  226.     int my_gen; /* Nodes's Generation */ /*GC*/
  227.     int gen_age; /* How many times to GC at this generation */
  228.     long int mark_gc;   /* when marked */
  229.     struct logo_node *next; /* Link together nodes of the same age */ /*GC*/
  230.     struct logo_node *oldyoung_next;
  231.     union {
  232.    struct {
  233.        struct logo_node *ncar;
  234.        struct logo_node *ncdr;
  235.        struct logo_node *nobj;         /* used only for oblist etc */
  236.    } ncons;
  237.    struct {
  238.        char *nstring_ptr;
  239.        struct string_block *nstring_head;
  240.        int nstring_len;
  241.    } nstring;
  242.    struct {
  243.        struct logo_node * (*nprim_fun) ();
  244.        short npriority;
  245.        short nmin_args;
  246.        short ndef_args;
  247.        short nmax_args;
  248.    } nprim;
  249.    FIXNUM nint;
  250.    FLONUM nfloat;
  251.    struct {
  252.        int narray_dim;
  253.        int narray_origin;
  254.        struct logo_node **narray_data;
  255.    } narray;
  256.     } nunion;
  257. } NODE;
  258.  
  259. #define settype(node, type)     ((node)->node_type = (type))
  260.  
  261. #define n_car                   nunion.ncons.ncar
  262. #define n_cdr                   nunion.ncons.ncdr
  263. #define n_obj                   nunion.ncons.nobj
  264. #define getobject(node)         ((node)->n_obj)
  265. #define car(node)               ((node)->n_car)
  266. #define cdr(node)               ((node)->n_cdr)
  267. #define caar(node)              ((node)->n_car->n_car)
  268. #define cadr(node)              ((node)->n_cdr->n_car)
  269. #define cdar(node)              ((node)->n_car->n_cdr)
  270. #define cddr(node)              ((node)->n_cdr->n_cdr)
  271.  
  272. #define n_str                   nunion.nstring.nstring_ptr
  273. #define n_len                   nunion.nstring.nstring_len
  274. #define n_head                  nunion.nstring.nstring_head
  275. #define getstrptr(node)         ((node)->n_str)
  276. #define getstrlen(node)         ((node)->n_len)
  277. #define getstrhead(node)        ((node)->n_head)
  278. #define setstrptr(node,ptr)     ((node)->n_str = (ptr))
  279. #define setstrlen(node,len)     ((node)->n_len = (len))
  280. #define setstrhead(node,ptr)    ((node)->n_head = (ptr))
  281.  
  282. #define n_int                   nunion.nint
  283. #define getint(node)            ((node)->n_int)
  284. #define setint(node,num)        ((node)->n_int = (num))
  285.  
  286. #define n_float                 nunion.nfloat
  287. #define getfloat(node)          ((node)->n_float)
  288. #define setfloat(node,num)      ((node)->n_float = (num))
  289.  
  290. #define n_pfun                  nunion.nprim.nprim_fun
  291. #define n_ppri                  nunion.nprim.npriority
  292. #define n_pmin                  nunion.nprim.nmin_args
  293. #define n_pdef                  nunion.nprim.ndef_args
  294. #define n_pmax                  nunion.nprim.nmax_args
  295. #define getprimfun(node)        ((node)->n_pfun)
  296. #define setprimfun(node,fun)    ((node)->n_pfun = (fun))
  297. #define getprimmin(node)        ((node)->n_pmin)
  298. #define setprimmin(node,num)    ((node)->n_pmin = (num))
  299. #define getprimmax(node)        ((node)->n_pmax)
  300. #define setprimmax(node,num)    ((node)->n_pmax = (num))
  301. #define getprimdflt(node)       ((node)->n_pdef)
  302. #define setprimdflt(node,num)   ((node)->n_pdef = (num))
  303. #define getprimpri(node)        ((node)->n_ppri)
  304. #define setprimpri(node,num)    ((node)->n_ppri = (num))
  305. /* Special value for pmin, means that it's
  306.  *  OK if primitive name on line by itself even though defltargs=1 (ED, CO) */
  307. #define OK_NO_ARG 01000
  308.  
  309. #define n_dim        nunion.narray.narray_dim
  310. #define n_org        nunion.narray.narray_origin
  311. #define n_array         nunion.narray.narray_data
  312. #define getarrdim(node)    ((node)->n_dim)
  313. #define getarrorg(node)    ((node)->n_org)
  314. #define getarrptr(node)    ((node)->n_array)
  315. #define setarrdim(node,len)   ((node)->n_dim = (len))
  316. #define setarrorg(node,org)   ((node)->n_org = (org))
  317. #define setarrptr(node,ptr)   ((node)->n_array = (ptr))
  318.  
  319. #ifdef ecma
  320. #define clearparity(ch)    ecma_clear(ch)
  321. #define setparity(ch)      ecma_set(ch)
  322. #define getparity(ch)      ecma_get(ch)
  323. #define ecma_begin      003   /* first char used for quoteds */
  324. #else
  325. #define clearparity(ch)         (ch & 0x7f)
  326. #define setparity(ch)           (ch | 0x80)
  327. #define getparity(ch)           (ch & 0x80)
  328. #endif
  329.  
  330. typedef enum { RUN, STOP, OUTPUT, THROWING, MACRO_RETURN } CTRLTYPE;
  331.  
  332. struct segment {
  333.    struct segment *next;
  334.    struct logo_node nodes[SEG_SIZE];
  335. };
  336.  
  337. #define NOT_THROWING            (stopping_flag != THROWING)
  338. #define RUNNING                 (stopping_flag == RUN)
  339. #define STOPPING                (stopping_flag == STOP)
  340.  
  341. #define canonical__object(o)    car(o)
  342. #define procnode__object(o)     cadr(o)
  343. #define setprocnode__object(o,v) setcar(cdr(o), v)
  344. #define valnode__object(o)      cadr(cdr(o))
  345. #define setvalnode__object(o,v) setcar(cddr(o), v)
  346. #define plist__object(o)        cadr(cddr(o))
  347. #define setplist__object(o,v) setcar(cdr(cddr(o)), v)
  348. #define obflags__object(o) car(cddr(cddr(o)))
  349. #define caselistptr__object(o)  cddr(cddr(o))
  350. #define caselist__object(o)     cdr(cddr(cddr(o)))
  351.  
  352. #define strnode__caseobj(co)    car(co)
  353. #define object__caseobj(c)      cdr(c)
  354. #define procnode__caseobj(c)    procnode__object(object__caseobj(c))
  355. #define setprocnode__caseobj(c,v) setprocnode__object(object__caseobj(c),v)
  356. #define valnode__caseobj(c)   valnode__object(object__caseobj(c))
  357. #define setvalnode__caseobj(c,v) setvalnode__object(object__caseobj(c),v)
  358. #define plist__caseobj(c)  plist__object(object__caseobj(c))
  359. #define setplist__caseobj(c,v)   setplist__object(object__caseobj(c),v)
  360. #define obflags__caseobj(c)   obflags__object(object__caseobj(c))
  361.  
  362. #define text__procnode(p)  car(p)
  363. #define formals__procnode(p)    caar(p)
  364. #define bodylist__procnode(p)   cdar(p)
  365. #define dfltargs__procnode(p)   cadr(cddr(p))
  366. #define minargs__procnode(p)    car(cddr(p))
  367. #define maxargs__procnode(p)    car(cddr(cddr(p)))
  368. #define bodywords__procnode(p)  cadr(p)
  369. #define setbodywords__procnode(p,v) setcar(cdr(p),v)
  370.  
  371. #define unparsed__runparse(rn)  rn
  372. #define parsed__runparse(rn)    getobject(rn)
  373. #define node__quote(q)          car(q)
  374. #define node__colon(c)          car(c)
  375. #define valnode__colon(c)       valnode__caseobj(node__colon(c))
  376.  
  377. #define unparsed__tree(t)  t
  378. #define treepair__tree(t)  getobject(t)
  379. #define settreepair__tree(t, v)  setobject(t, v)
  380. #define generation__tree(t)   car(treepair__tree(t))
  381. #define setgeneration__tree(t, g) setcar(treepair__tree(t), g)
  382. #define tree__tree(t)      cdr(treepair__tree(t))
  383. #define settree__tree(t, v)   settreepair__tree(t, cons(the_generation, v))
  384.  
  385. #define unparsed__line(l)  getobject(l)
  386. #define tree__line(l)      l
  387.  
  388. #define cont__cont(c)      (FIXNUM)car(c)
  389. #define val__cont(c)    cdr(c)
  390.  
  391. /* Object flags.  Ones settable by users via bury_helper must come in threes
  392.  * for proc, val, plist even if meaningless for some of those. */
  393. #define PROC_BURIED  01
  394. #define VAL_BURIED   02
  395. #define PLIST_BURIED 04
  396. #define PROC_TRACED  010
  397. #define VAL_TRACED   020
  398. #define PLIST_TRACED 040
  399. #define PROC_STEPPED 0100
  400. #define VAL_STEPPED  0200
  401. #define PLIST_STEPPED   0400
  402. #define PROC_MACRO   01000
  403. #define PERMANENT 02000
  404.  
  405. #define setflag__caseobj(c,f) ((obflags__caseobj(c))->n_int |= (f))
  406. #define clearflag__caseobj(c,f) ((obflags__caseobj(c))->n_int &= ~(f))
  407. #define flag__caseobj(c,f) (int)((obflags__caseobj(c))->n_int & (f))
  408. #define flag__object(o,f) (int)((obflags__object(o))->n_int & (f))
  409. #define is_macro(c) (flag__caseobj(c, PROC_MACRO))
  410.  
  411. #define push(obj, stack)    spush(obj, &stack)
  412. #define pop(stack)       spop(&stack)
  413.  
  414. /* evaluator labels, needed by macros in other files */
  415.  
  416. #define do_list(x) \
  417.     x(all_done) \
  418.     x(begin_line) x(end_line) x(begin_seq) x(begin_apply) \
  419.     x(eval_sequence_continue) \
  420.     x(accumulate_arg) x(compound_apply_continue) \
  421.     x(set_args_continue) x(macro_return) \
  422.     x(qm_continue) \
  423.     x(runresult_continuation) x(runresult_followup) \
  424.     x(repeat_continuation) x(repeat_followup) \
  425.     x(catch_continuation) x(catch_followup) x(after_lambda) \
  426.     x(goto_continuation)
  427.  
  428. #define do_enum(x) x,
  429.  
  430. enum labels {
  431.     do_list(do_enum)
  432.     NUM_TOKENS
  433. };
  434.  
  435. #endif /* _LOGO_H */
  436.