diff interps/c-intercal/src/abcess.h @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/c-intercal/src/abcess.h	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,225 @@
+/* abcess.h -- functions used by compiled INTERCAL programs */
+
+/* AIS note: This header file now serves two purposes. For non-multithread
+   programs, it serves as headers to the degenerated code and many support
+   functions. For multithread programs, this header file adds extra functions
+   only when compiling the degenerated code and unravel.c, and holds its
+   previous contents during other files. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+#ifndef ICKBOOL_DEFINED
+/*@-redef@*/
+typedef int ick_bool;
+/*@=redef@*/
+#define ICKBOOL_DEFINED
+#endif
+
+#define ICK_ABCESS_H_INCLUDED
+
+#define ick_TRUE	1
+#define ick_FALSE	0
+
+#define ick_ONESPOT	0
+#define ick_TWOSPOT	1
+#define ick_TAIL	2
+#define ick_HYBRID	3
+
+#define ick_MAXNEXT 80 /* AIS: Moved from cesspool.c */
+
+/* the following two types must both promote to unsigned int in expressions */
+
+typedef unsigned short ick_type16;
+typedef unsigned int   ick_type32;
+
+typedef struct ick_array_t
+{
+  unsigned int rank;
+  size_t *dims;
+  union
+  {
+    ick_type16 *tail;
+    ick_type32 *hybrid;
+  } data;
+} ick_array;
+
+
+/* AIS: For operand overloading, a more complicated data type is needed. */
+typedef struct ick_overop_t
+{
+  ick_type32 (*get)(ick_type32);
+  void (*set)(ick_type32, void(*)());
+} ick_overop;
+
+/* AIS: Moved from cesspool.c */
+typedef struct ick_stashbox_t     /* this is a save-stack element */
+{
+  unsigned int type;	      /* variable type */
+  unsigned int index;       /* variable's index within the type */
+  union		      /* the data itself */
+  {
+    ick_type16	onespot;
+    ick_type32	twospot;
+    ick_array	*a;
+  } save;
+  /*@null@*/ /*@dependent@*/ struct ick_stashbox_t *ick_next;  /* pointer to next-older ick_stashbox */
+  ick_overop overloadinfo; /* AIS: overloading info is stashed too, in a
+			    non-overloaded program (ignored otherwise) */
+} ick_stashbox;
+
+/* AIS: files to take input and output from */
+/*@null@*/ extern FILE* ick_cesspoolin;
+/*@null@*/ extern FILE* ick_cesspoolout;
+
+/* defined in cesspool.c */
+extern void ick_pushnext(unsigned n);
+extern unsigned int ick_popnext(unsigned n);
+extern unsigned int ick_resume(unsigned n);
+extern unsigned int ick_pin(void);
+extern void ick_clockface(ick_bool mode);
+extern void ick_setclcsemantics(ick_bool mode); /* AIS */
+extern void ick_pout(unsigned int val);
+extern void ick_binin(unsigned int type, ick_array *a, ick_bool forget);
+extern void ick_binout(unsigned int type, const ick_array *a);
+extern unsigned int ick_assign(char *dest, unsigned int type, ick_bool forget,
+			   unsigned int value);
+
+/* AIS: yuk, unravel and ick_ec need these */
+extern unsigned* ick_next;
+/*@null@*/ extern jmp_buf* ick_next_jmpbufs;
+extern int ick_nextindex;
+extern /*@null@*/ ick_stashbox *ick_first;
+
+/* AIS: Implement the +ick_mystery command line option. */
+extern unsigned long ick_mysteryc;
+extern int ick_mystery;
+#define ick_MYSTERYLINE if(ick_mystery && ick_mysteryc++ > 4000000000LU) exit(42);
+
+/* AIS: More command-line options */
+extern int ick_wimp_mode;
+extern int ick_instapipe;
+
+/* AIS: Handle multiple COME FROMs aiming at the same line */
+extern int ick_multicome0(int errlineno, jmp_buf pc);
+
+#ifdef HAVE_STDARG_H
+/*@dependent@*/ extern void *ick_aref(unsigned int type, ...);
+extern void ick_resize(unsigned int type, ...);
+#else
+/*@dependent@*/ extern void *ick_aref();
+extern void ick_resize();
+#endif
+
+extern void ick_stashinit(void);
+/* AIS: Added mentions of oo. This is set to 0 in a non-overloaded program. */
+extern void ick_stash(unsigned int type, unsigned int index, void *from, ick_overop* oo);
+extern void ick_retrieve(void *to, unsigned int type, unsigned int index,
+			 ick_bool forget, ick_overop* oo);
+extern unsigned int ick_roll(unsigned int n);
+
+/* AIS: Lose with IE277 */
+extern ick_type32 ick_ieg277(ick_type32);
+extern void ick_ies277(ick_type32, void(*)());
+
+/* defined in arrgghh.c */
+extern void ick_parseargs(int argc, char **argv);
+extern int ick_printflow;
+
+/* AIS: For the CREATE statement */
+typedef struct ick_tag_createdata ick_createdata;
+struct ick_tag_createdata
+{
+  int width;           /* 16 or 32 (maybe 0 will be allowed at some point) */
+  int isarray;         /* this and the previous determine what vartype it is */
+  unsigned short varnumber;
+                       /* 0 if not a variable, the var's number if it is */
+  ick_overop accessors;/* how to get and set this lvalue, or {0,0} */
+  unsigned long value; /* current value of the var or expression */
+};
+extern void ick_registercreation(const char*,unsigned long);
+extern unsigned long ick_jicmatch(const char*);
+
+/* AIS: Multithreading types and defines */
+#if MULTITHREAD != 0
+typedef struct tag_ickthread ickthread;
+/*@refcounted@*/ struct tag_ickthread
+{
+  void* varforget[10]; /* holds all four variable types, and forgetting data */
+  unsigned* nextstack;
+  int nextpointer;
+  jmp_buf pc; /* program counter */
+  ick_stashbox* sb; /* holds all stash data */
+  /*@partial@*/ /*@dependent@*/ ickthread* ick_next;
+  /*@null@*/ /*@partial@*/ /*@dependent@*/ ickthread* choicepoint;
+  /* the top choicepoint available. Used as a next pointer in the choicepoint
+     stack. */
+  int stale; /* if this is a choicepoint, whether it's a stale choicepoint. */
+  int refcount; /* when Threaded INTERCAL and Backtracking INTERCAL are
+		   combined, reference-counting on choicepoints is needed
+		   so that backtracking past multithreading is possible.
+		   This also allows for garbage-collection of choicepoints.
+		   (Luckily, choicepoints cannot refer to themselves, so this
+		   mechanism works.) This only applies to ickthreads that are
+		   acting as choicepoints, not those acting as threads. */
+  int ick_ccfc;  /* number of comefroms currently active */
+  long ick_skipto; /* compucome line number */
+  jmp_buf ick_cjb; /* keeps track of compucomes */
+  /*@partial@*/ /*@dependent@*/ ickthread* dsi; /* which thread's varforget and sb to use */
+  /*@null@*/ /*@dependent@*/ ickthread* usesthis; /* for garbage collection purposes */
+};
+/*@partial@*/ /*@dependent@*/ extern ickthread* ickmt_cur; /* current thread */
+/*@partial@*/ /*@dependent@*/ extern ickthread*ickmt_prev; /* previous thread: an optimisation to make
+                                                              thread switching O(1), not O(n), with
+                                                              respect to the number of threads */
+extern int weaving; /* whether to weave newly created threads */
+#define NEXTTHREAD if(ick_printflow) fprintf(stderr,"[%d:%lx]",ick_lineno, \
+					     (unsigned long)ickmt_cur);	\
+  if(setjmp(ick_cjb) == 0)						\
+    nextthread(ick_cjb, ick_lineno, 3);
+
+extern void nextthread(jmp_buf pc, int errlineno, int flags);
+extern void killthread(void);
+extern void ickmtinit(void);
+extern int multicome1(int errlineno, jmp_buf pc);
+extern void choicepoint(void);
+extern void choiceahead(void);
+extern void choiceback(void);
+
+/* from ick-wrap.c, declare as extern so they can be accessed by cesspool.c,
+   unravel.c */
+extern int onespotcount;
+extern int twospotcount;
+extern int tailcount;
+extern int hybridcount;
+
+extern int ick_oldabstain;
+extern int gonebackto;
+extern int ick_ccfc;
+extern long ick_skipto;
+extern jmp_buf btjb;
+extern jmp_buf ick_cjb;
+
+#define MULTICOME multicome1
+#else
+#define MULTICOME ick_multicome0
+#endif /* MULTITHREAD */
+
+/* AIS: Used by the debugger, multithread code, external calls */
+#if (MULTITHREAD != 0) || (YUKDEBUG != 0) || defined(ICK_EC)
+extern ick_type16* ick_onespots;
+extern ick_bool* ick_oneforget;
+extern ick_type32* ick_twospots;
+extern ick_bool* ick_twoforget;
+extern ick_array* ick_tails;
+extern ick_bool* ick_tailforget;
+extern ick_array* ick_hybrids;
+extern ick_bool* ick_hyforget;
+#if (MULTITHREAD != 0) || defined(ICK_EC)
+/*@null@*/ extern ick_overop* ick_oo_onespots;
+/*@null@*/ extern ick_overop* ick_oo_twospots;
+#endif
+#endif
+
+/* abcess.h ends here */