1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/* Global definitions of limits and constants */
#define MAX_LINE_LENGTH 1024
#define MAX_LINE_TOKENS 1024
typedef enum
{
ArrayTag,
FunctionTag,
HybridTag,
MonadicOpTag,
DyadicOpTag,
BoundFunctionTag, /* Function with left arg bound */
LParTag,
RParTag,
LCurlTag,
RCurlTag,
LBracketTag,
RBracketTag
} datumTag;
typedef enum
{
AtypeInt,
AtypeArray
} arrayDataType;
/* Data types */
typedef struct Array Array;
typedef struct Datum Datum;
struct Array
{
arrayDataType type;
int rank;
int *shape;
int size;
union {
char *rawdata;
vlong *intdata;
Array **arraydata;
};
};
struct Datum
{
datumTag tag;
union {
Array *array;
int code;
};
};
/* Function prototypes for the different source files */
/* print.c */
Rune *ppdatum(Datum);
Rune *ppdatums(Datum *, int);
Rune *pparray(Array *);
/* lexer.c */
Datum *lexline(Rune *, int *);
/* array.c */
Array *mkarray(int, int, int);
Array *mkscalarint(vlong);
Array *duparray(Array *);
int simplearray(Array *);
int simplescalar(Array *);
/* eval.c */
Datum *eval(Datum *, int *);
/* Monadic functions from functions.h */
Array *fnEnclose(Array *);
Array *fnNest(Array *);
Array *fnRavel(Array *);
/* Dyadic functions from functions.h */
Array *fnCatenateFirst(Array *, Array *);
/* Global variables */
extern Rune *errormsg; /* eval.c */
extern int datasizes[]; /* array.c */
extern Rune primfuncnames[]; /* lexer.c */
extern Rune primmonopnames[]; /* lexer.c */
extern Rune primdyadopnames[]; /* lexer.c */
extern Rune primhybridnames[]; /* lexer.c */
|