Rev 8079 | Rev 8100 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10 | reyssat | 1 | /* Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis |
2 | * |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
16 | */ |
||
17 | |||
18 | /* WWW multipurpose server, dynamic library definitions */ |
||
19 | |||
20 | #include "../config.h" |
||
21 | #include "../includes.h" |
||
22 | #include "../wimsdef.h" |
||
23 | |||
7798 | bpr | 24 | /* for mt19937ar.c */ |
10 | reyssat | 25 | #ifdef RAND_MAX |
26 | # undef RAND_MAX |
||
27 | #endif |
||
28 | #define RAND_MAX 2147483647 |
||
29 | #define random genrand_int31 |
||
30 | #define srandom init_genrand |
||
31 | long int genrand_int31(void); |
||
32 | |||
7798 | bpr | 33 | /* errors.c */ |
10 | reyssat | 34 | void (*error1) (char *msg); |
35 | void (*error2) (char *msg); |
||
36 | void (*error3) (char *msg); |
||
37 | |||
7798 | bpr | 38 | /* lines.c */ |
10 | reyssat | 39 | char *int2str(int i); |
40 | void *xmalloc(size_t n); |
||
7798 | bpr | 41 | int msleep(int ms); /* millisecond sleeper */ |
42 | void _tolinux(char *p); /* dos/mac to unix/linux translation */ |
||
43 | void ovlstrcpy(char *dest, char *src); /* strcpy of possibly overlapping strings (64 bits problem)*/ |
||
44 | void mystrncpy(char *dest, const char *src, size_t lim); /* optimized and secured strncpy */ |
||
45 | /* find matching parenthesis. |
||
46 | * The entrance point should be after the opening parenthesis. |
||
47 | * Returns NULL if unmatched. |
||
48 | */ |
||
10 | reyssat | 49 | char *find_matching(char *p, char c); |
7798 | bpr | 50 | char *find_word_start(char *p); /* Strips leading spaces */ |
51 | char *find_word_end(char *p); /* Points to the end of the word */ |
||
52 | char *strparchr(char *p, char c); /* search for char, skipping parentheses */ |
||
53 | char *strparstr(char *p, char *fnd); /* search for string, skipping parentheses */ |
||
54 | char *find_item_end(char *p); /* Points to the end of an item */ |
||
55 | char *find_line_end(char *p); /* Points to the end of a line */ |
||
10 | reyssat | 56 | char *charchr(char *p,char *w); |
7798 | bpr | 57 | char *wordchr(char *p, char *w); /* Find first occurrence of word */ |
58 | char *itemchr(char *p, char *w); /* Find first occurrence of item */ |
||
59 | char *linechr(char *p, char *w); /* Find first occurrence of line */ |
||
60 | char *varchr(char *p, char *v); /* Find first occurrence of math variable */ |
||
61 | int cutitems(char *p, char *list[], int max); /* Cut items of a string */ |
||
62 | int cutwords(char *p, char *list[], int max); /* Cut words of a string */ |
||
63 | int cutlines(char *p, char *list[], int max); /* Cut lines of a string */ |
||
64 | int cutchars(char *p, char *list[], int max); /* Cut chars of a string */ |
||
65 | char *strip_trailing_spaces(char *p); /* strip trailing spaces; return string end. */ |
||
66 | /* Verify whether a list is well-ordered. For debugging uses. |
||
67 | * Returns 0 if order is OK, -1 otherwise. |
||
68 | */ |
||
10 | reyssat | 69 | int verify_order(void *list, int items, size_t item_size); |
8079 | bpr | 70 | /* searches a list. Returns index if found, (-1-index of insertion) if nomatch. |
71 | * Uses binary search, list must be sorted. |
||
72 | */ |
||
10 | reyssat | 73 | int search_list(void *list, int items, size_t item_size, const char *str); |
7798 | bpr | 74 | unsigned int linenum(char *p); /* Returns number of lines in string p */ |
75 | unsigned int itemnum(char *p); /* Returns number of items in the list p, comma separated */ |
||
76 | unsigned int wordnum(char *p); /* Returns number of words in string p */ |
||
77 | unsigned int charnum(char *p); /* This is just to suppress an annoying compiler warning message. */ |
||
10 | reyssat | 78 | char *fnd_line(char *p, int n, char bf[]); /* find n-th line in string p */ |
79 | char *fnd_item(char *p, int n, char bf[]); /* find n-th item in list p, comma separated */ |
||
80 | char *fnd_word(char *p, int n, char bf[]); /* find n-th word in string p */ |
||
81 | char *fnd_char(char *p, int n, char bf[]); /* find n-th char in string p */ |
||
7798 | bpr | 82 | char *fnd_row(char *p, int n, char bf[]); /* find n-th row in a matrix p */ |
83 | /* Separate items in the string p, end each item with 0, |
||
84 | * and store item pointers in parm[]. Does not parse past max. |
||
8079 | bpr | 85 | * Returns the number of fields. |
86 | */ |
||
10 | reyssat | 87 | int separate_item(char *p, char *parm[], int max); |
88 | int separate_line(char *p, char *parm[], int max); |
||
89 | int separate_word(char *p, char *parm[], int max); |
||
90 | int _separator(char *p,char *parm[], int max, char fs); |
||
7798 | bpr | 91 | int rows2lines(char *p); /* Returns 1 if semicolons changed to new lines */ |
10 | reyssat | 92 | void lines2rows(char *p); |
93 | unsigned int rownum(char *p); |
||
7798 | bpr | 94 | void words2items(char *p); /* change words to items */ |
95 | void words2lines(char *p); /* change words to lines */ |
||
96 | void lines2items(char *p); /* change lines to items */ |
||
97 | void lines2words(char *p); /* change lines to words */ |
||
98 | void items2words(char *p); /* change items to words */ |
||
99 | void items2lines(char *p); /* change items to lines */ |
||
100 | void strip_enclosing_par(char *p); /* Strip enclosing pairs of parentheses */ |
||
101 | /* strstr but may have embedded zeros. |
||
102 | * Returns memory end if not found. |
||
103 | * Supposes memory ends with 0. |
||
104 | */ |
||
10 | reyssat | 105 | char *memstr(char *s1, char *s2, int len); |
7798 | bpr | 106 | /* Check whether parentheses are balanced in a given string. |
107 | * Returns 0 if OK. |
||
108 | */ |
||
109 | /* style=0: simple check. style<>0: strong check. */ |
||
10 | reyssat | 110 | int check_parentheses(char *p, int style); |
7798 | bpr | 111 | void nospace(char *p); /* collapses all space characters in string. */ |
112 | void singlespace(char *p); /* change all spaces into ' ', and collapse multiple occurences */ |
||
113 | void deaccent(char *p); /* fold accented letters to unaccented */ |
||
114 | void reaccent(char *p); /* compose accented letters using symbols */ |
||
115 | /* modify a string. Bufferlen must be at least MAX_LINELEN */ |
||
8086 | bpr | 116 | extern void (*string_modify)(char *start, char *bad_beg, char *bad_end, char *good,...); |
117 | void string_modify1(char *start, char *bad_beg, char *bad_end, char *good,...); |
||
118 | void string_modify2(char *start, char *bad_beg, char *bad_end, char *good,...); |
||
119 | |||
10 | reyssat | 120 | long int filelength(char *fn,...); |
121 | int catfile(FILE *outf, char *fn,...); |
||
122 | #ifdef libwims |
||
123 | char *fnd_position; |
||
124 | char *fnd_nextpos; |
||
125 | #else |
||
126 | extern char *fnd_position; |
||
127 | extern char *fnd_nextpos; |
||
128 | #endif |
||
129 | |||
7798 | bpr | 130 | /* evalue.c */ |
131 | #define EV_S "EVLS" |
||
132 | #define EV_T "EVLT" |
||
133 | #define EV_X "EVLX" |
||
134 | #define EV_Y "EVLY" |
||
10 | reyssat | 135 | typedef struct ev_variable{ |
136 | char *name; double value; |
||
137 | } ev_variable; |
||
138 | #ifdef LIBWIMS |
||
139 | int *ev_varcnt=NULL; |
||
140 | ev_variable *ev_var=NULL; |
||
141 | #else |
||
142 | extern int *ev_varcnt; |
||
143 | extern ev_variable *ev_var; |
||
144 | #endif |
||
145 | char *moneyprint(char *p, double s); |
||
146 | double factorial(double d); |
||
147 | void init_random(void); |
||
148 | double drand(double m); |
||
149 | double irand(double n); |
||
150 | double sign(double d); |
||
151 | double factorial(double d); |
||
152 | double binomial(double d1,double d2); |
||
153 | double max(double d1, double d2); |
||
154 | double min(double d1, double d2); |
||
155 | double gcd(double n1, double n2); |
||
156 | double lcm(double n1, double n2); |
||
7798 | bpr | 157 | int eval_getpos(char *name); /* get position of name in nametable */ |
158 | void eval_setval(int pos, double v); /* set value to name */ |
||
7847 | bpr | 159 | /*void set_evalue_pointer(char *p); */ /* prepare pointer for evaluation */ |
160 | /* char *get_evalue_pointer(void); */ /* get string pointer (after evaluation) */ |
||
161 | /* double _evalue(int ord);*/ |
||
162 | double strevalue(char *p); /* evalue a string to double after checking it*/ |
||
163 | double checked_eval (char* p); /* evalue a string to double */ |
||
10 | reyssat | 164 | char *(*substitute) (char *p); |
7847 | bpr | 165 | /* int get_evalue_error(void); |
166 | void set_evalue_error(int e);*/ |
||
10 | reyssat | 167 | int get_evalcnt(void); |
168 | char *get_evalname(int i); |
||
169 | int get_evaltype(int i); |
||
170 | int evaltab_verify(void); |
||
171 | int search_evaltab(char *p); |
||
7798 | bpr | 172 | /* compile an expression for faster evaluation |
173 | * returns -1 if cannot be compiled. |
||
174 | * else returns the number of compilations. |
||
175 | */ |
||
10 | reyssat | 176 | int evalue_compile(char *p); |
7847 | bpr | 177 | typedef struct eval_struct {char *texte; int x; int y; int s; int t;} eval_struct; |
178 | eval_struct * eval_create (char *in_p); /* speed up the evaluation by |
||
179 | "precompiling" the string to be evaluated.*/ |
||
180 | /* evaluate standard functions with at most four variables named |
||
181 | * "x", "y", "s" and "t" |
||
182 | */ |
||
10 | reyssat | 183 | |
7847 | bpr | 184 | double eval_x (eval_struct *p, double x); /* evaluate standard function in x*/ |
185 | double eval_t (eval_struct *p, double t); /* evaluate standard function in t*/ |
||
186 | double eval_x_y (eval_struct *p, double x, double y); /* evaluate standard function in x and y*/ |
||
187 | double eval_multiple (eval_struct *p, double x, double y, double s, double t); |
||
188 | void eval_destroy (eval_struct *q); /* reclaim the memory */ |
||
189 | |||
7798 | bpr | 190 | /* math.c */ |
191 | char *find_mathvar_start(char *p); /* Points to the start of a mathematics variable (or number) */ |
||
192 | char *find_mathvar_end(char *p); /* Points to the end of a mathematics variable (or number) */ |
||
193 | void mathvarlist(char *p); /* list variable (function) names in an expression. buffer is modified to contain the list. */ |
||
10 | reyssat | 194 | |
7798 | bpr | 195 | /* dir.c */ |
196 | int remove_tree(char *dirname); /* remove a directory tree */ |
||
197 | void mkdirs(char *s); /* recursively generate a directory structure */ |
||
10 | reyssat | 198 | |
7798 | bpr | 199 | /* text.c */ |
200 | void text(char *p); /* main entry point for text routines */ |
||
10 | reyssat | 201 | int textab_verify(void); |
202 | |||
7798 | bpr | 203 | /* levelcurve.c */ |
204 | #define LEVEL_LIM 256 |
||
205 | #define LEVELPOINT_LIM 16384 |
||
206 | #define LEVELSIZE_LIM 2048 |
||
207 | #define LEVELGRAIN_LIM 16 |
||
10 | reyssat | 208 | typedef struct { |
209 | char *fn, *xname, *yname; |
||
210 | double levels[LEVEL_LIM]; |
||
211 | int xsize,ysize,grain,levelcnt,datacnt,xevpos,yevpos; |
||
212 | double xrange[2],yrange[2],xspan,yspan; |
||
213 | short unsigned int xdata[LEVELPOINT_LIM],ydata[LEVELPOINT_LIM]; |
||
214 | } leveldata; |
||
7798 | bpr | 215 | int levelcurve(leveldata *ld); /* produces level curve data. Returns non-zero if error. */ |
10 | reyssat | 216 | |
217 | /* My accelerated definitions. */ |
||
8079 | bpr | 218 | #define myisdigit(x) ((x)>='0' && (x)<='9') |
5456 | bpr | 219 | #define myisalpha(x) (((x)&~32)>='A' && ((x)&~32)<='Z') |
220 | #define myisalnum(x) (myisalpha(x) || myisdigit(x)) |
||
221 | #define myisupper(x) ((x)>='A' && (x)<='Z') |
||
222 | #define myislower(x) ((x)>='a' && (x)<='z') |
||
223 | #define myislspace(x) ((x)==' ' || (x)=='\t') |
||
224 | #define myisspace(x) ((x)==' ' || (x)=='\t' || (x)=='\n' || (x)=='\r') |
||
8079 | bpr | 225 | |
5456 | bpr | 226 | /*ou |
227 | inline int myisdigit(char x) { return x>='0' && x<='9'; } |
||
5476 | bpr | 228 | */ |