|
|
1.1 root 1: /* Courier.h 4.1 83/07/03 */
2:
3: #include <stdio.h>
4:
5: #define NIL 0
6: #define MAXSTR 200
7: #define streq(s, t) (strcmp(s, t) == 0)
8: #define New(t) ((t *) calloc(1, sizeof(t)))
9:
10: /*
11: * Cons cell for lisp operations.
12: */
13: struct cons {
14: struct cons *c_cdr;
15: struct cons *c_car;
16: };
17: typedef struct cons *list;
18: #define car(x) ((x)->c_car)
19: #define cdr(x) ((x)->c_cdr)
20:
21: /*
22: * Object classes.
23: */
24: enum class {
25: O_TYPE = 1,
26: O_CONSTANT,
27: O_SYMBOL
28: };
29:
30: /*
31: * Type constructors.
32: */
33: enum constr {
34: C_PREDEF = 1,
35: C_ENUMERATION,
36: C_ARRAY,
37: C_SEQUENCE,
38: C_RECORD,
39: C_CHOICE,
40: C_PROCEDURE,
41: C_ERROR
42: };
43:
44: /*
45: * Object structure, for types, numbers, and strings.
46: */
47: struct object {
48: enum class o_class;
49: union {
50: struct type *u_type;
51: char *u_name;
52: int u_value;
53: } o_union;
54: };
55: #define o_type o_union.u_type
56: #define o_name o_union.u_name
57: #define o_value o_union.u_value
58:
59: #define class_of(x) (((struct object *) x)->o_class)
60: #define name_of(x) (((struct object *) x)->o_name)
61: #define value_of(x) (((struct object *) x)->o_value)
62:
63: /*
64: * Type structure.
65: *
66: * Formats of various lists are as follows.
67: * . indicates a cons operation.
68: * ... indicates a list of elements of the preceding form.
69: *
70: * enumeration:
71: * ((name . value) ...)
72: * record, error, procedure arguments, procedure results:
73: * (((name ...) . type) ...)
74: * choice:
75: * ((((name . value) ...) . type) ...)
76: */
77: struct type {
78: enum constr type_constr; /* constructor */
79: char *type_pfname; /* name of pack function */
80: char *type_ufname; /* name of unpack function */
81: union {
82: list u_list; /* enumeration, record, error */
83: struct {
84: struct object *u_size, *u_basetype;
85: } u_array; /* array, sequence */
86: struct {
87: struct object *u_designator;
88: list u_candidates;
89: } u_choice; /* choice */
90: struct {
91: list u_args, u_results, u_errors;
92: } u_procedure; /* procedure */
93: } type_u;
94: };
95: /*
96: * These definitions allow access from an object pointer
97: * known to be a type.
98: */
99: #define t_constr o_type->type_constr
100: #define t_pfname o_type->type_pfname
101: #define t_ufname o_type->type_ufname
102: #define t_list o_type->type_u.u_list
103: #define t_size o_type->type_u.u_array.u_size
104: #define t_basetype o_type->type_u.u_array.u_basetype
105: #define t_designator o_type->type_u.u_choice.u_designator
106: #define t_candidates o_type->type_u.u_choice.u_candidates
107: #define t_args o_type->type_u.u_procedure.u_args
108: #define t_results o_type->type_u.u_procedure.u_results
109: #define t_errors o_type->type_u.u_procedure.u_errors
110:
111: /*
112: * This macro is to cope with the fact that C passes arrays
113: * by reference but all other constructed types by value.
114: */
115: #define refstr(t) (basetype(t)->t_constr == C_ARRAY ? "" : "&")
116:
117: /*
118: * Predefined types.
119: */
120: extern struct object
121: *Boolean_type,
122: *Cardinal_type, *LongCardinal_type,
123: *Integer_type, *LongInteger_type,
124: *String_type,
125: *Unspecified_type, *LongUnspecified_type;
126:
127: extern struct object
128: *Undefined_constant;
129:
130: extern struct object *make(), *lookup(), *basetype();
131: extern struct object *construct_type1(), *construct_type2();
132: extern struct object *construct_choice(), *construct_procedure();
133: extern list Values, Types;
134: extern list cons(), nconc();
135: extern FILE *hf, *cf1, *cf2, *uf, *sf;
136: extern int explicit, print_level;
137: extern char *program_name;
138: extern char *copy(), *gensym();
139: extern char *obj_rep(), *pack_function(), *unpack_function();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.