-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathk.h
144 lines (131 loc) · 3.72 KB
/
k.h
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#ifndef K_H
#define K_H
#include <stddef.h>
#include <math.h>
#include <stdint.h>
#include <limits.h>
extern int precision;
/* 1=i, 2=f, 3=c, 4=s, 5=d, 6=n, 7=f, 0=kv, -1=iv, -2=fv, -3=cv, -4=sv */
/* 16=inull */
/* 20=qse, 21=se */
/* 99=variable, 98=kerror */
/* 10=plistlist, 11=plist, 12=elist, 13=rhs */
/* 14=plist+av, 15=plist+o, 17=vo, 27=ov, 37=lambda, 47=av, 57=+: ,67=fc, 77 87=projection */
typedef struct {
char t; /* type */
unsigned int c; /* count */
union {void *v;int i;double f;}; /* data */
int r; /* reference count */
} K;
typedef struct {
char *s;
int i,j;
} ERR;
extern K *D,*one,*zero,*null,*inull;
/* valid size for vector */
#define VSIZE(x) do{if((x)==INT_MAX||(x)==INT_MIN||(x)==INT_MIN+1) return kerror("wsfull");}while(0);
#define VSIZE2(x) do{if((x)>=INT_MAX) return (char*)-1;}while(0);
/* creators */
#define k1(v) knew(1,0,0,(v),0,0)
#define k2(v) knew(2,0,0,0,(v),0)
#define k3(v) knew(3,0,0,(v),0,0)
#define k4(v) knew(4,0,(v),0,0,0)
#define k5(v) knew(5,0,(v),0,0,0)
#define k7(v) knew(7,0,(v),0,0,0)
#define kv0(c) knew(0,(c),0,0,0,0)
#define kv1(c) knew(-1,(c),0,0,0,0)
#define kv2(c) knew(-2,(c),0,0,0,0)
#define kv3(c) knew(-3,(c),0,0,0,0)
#define kv4(c) knew(-4,(c),0,0,0,0)
/* type-derivable accessors */
#define a1 a->i
#define a2 a->f
#define a3 a->i
#define a4 ((char*)a->v)
#define a5 ((dict*)a->v)
#define a7 ((fn*)(a)->v)
#define b1 b->i
#define b2 b->f
#define b3 b->i
#define b4 ((char*)b->v)
#define b5 ((dict*)b->v)
#define b7 ((fn*)(b)->v)
#define v0(x) ((K**)((x)->v))
#define v1(x) ((int*)((x)->v))
#define v2(x) ((double*)((x)->v))
#define v3(x) ((char*)((x)->v))
#define v4(x) ((char**)((x)->v))
/* count */
#define ac a->c
#define bc b->c
#define cc c->c
#define dc d->c
#define rc r->c
/* type */
#define at a->t
#define bt b->t
#define ct c->t
#define dt d->t
#define rt r->t
#define DO(n,x) {int i,n_=(n);for(i=0;i<n_;i++){x;}}
#define DO2(n,x) {int j,n_=(n);for(j=0;j<n_;j++){x;}}
#define DO3(n,x) {int k,n_=(n);for(k=0;k<n_;k++){x;}}
#define EC(x) if((x)->t==98)return (x);
/* integer to double, 0I->0i, 0N->0n, -0I->-0i */
#define I2F(a) \
((a)==INT_MAX ? INFINITY \
: (((a)==INT_MIN ? NAN \
: (((a)==INT_MIN+1) ? -INFINITY \
: (double)(a)))))
/* floating point comparision */
#define CMPFF(A,B) \
(isnan(A) && !isnan(B) ? -1 \
: isnan(B) && !isnan(A) ? 1 \
: isnan(A) && isnan(B) ? 0 \
: (A)<(B) ? -1 \
: (A)>(B) ? 1 \
: 0)
/* floating point comparison with tolerance */
#define EPSILON 0.0000000000001
#define CMPFFE(A,B) \
((A)-(B) > EPSILON*fabs((A)+(B)) ? 1 \
: (B)-(A) > EPSILON*fabs((A)+(B)) ? -1 \
: 0)
#ifndef __linux__
#define CMPFFT(A,B) \
(isnan(A) && !isnan(B) ? -1 \
: isnan(B) && !isnan(A) ? 1 \
: isnan(A) && isnan(B) ? 0 \
: isinf(A)&&isinf(B)&&A<0.0&&B>0.0 ? -1 \
: isinf(B)&&isinf(A)&&B<0.0&&A>0.0 ? 1 \
: isinf(A)&&!isinf(B)&&A<0.0 ? -1 \
: isinf(B)&&!isinf(A)&&B<0.0 ? 1 \
: isinf(A)&&!isinf(B)&&A>0.0 ? 1 \
: isinf(B)&&!isinf(A)&&B>0.0 ? -1 \
: CMPFFE(A,B))
#else /* win32 and osx */
#define CMPFFT(A,B) \
(isnan(A) && !isnan(B) ? -1 \
: isnan(B) && !isnan(A) ? 1 \
: isnan(A) && isnan(B) ? 0 \
: isinf(A) < isinf(B) ? -1 \
: isinf(B) < isinf(A) ? 1 \
: CMPFFE(A,B))
#endif
void kinit(int argc, char **argv);
K* knew(char t, unsigned int c, void *v, int i, double f, int r);
void kfree(K *k);
void kdump(int l);
static inline K* kref(K *k) { if(k->r>=0) k->r++; else if(k->r<=-2) k->r--; return k; }
void kprint(K *p, char *s, char *s0, int nl);
char* kprint_(K *p, char *s, char *s0, int nl);
char* kprint5(K *p, char *s, char *s0, int nl);
K* knorm(K *s);
K* kerror(char *msg);
K* kmix(K *s);
K* kcp(K *s);
int vname(char *s, int len);
int kcmpr(K *a, K *b);
uint64_t khash(K *a);
int kreserved(char *s);
#endif /* K_H */