1 /*This file is a part of luscus project*/
2 /*Licensed under the Academic Free License version 3.0*/
3 /*cdeck mystring.c $Revision: 7.7 $ */
4
5
6 /*****************************************************************************
7 * *
8 * Any modifications are prohibited unless explicitly permitted by the luscus *
9 * authors. *
10 * *
11 *****************************************************************************/
12
13
14 /****************************************************************************/
15 /* */
16 /* General string operations */
17 /* */
18 /****************************************************************************/
19
20 #include "vstring.h"
21 /* See desctription in header file */
22
23 int
myNext(char * in,char c,int * shift,int * len)24 myNext (char *in, char c, int *shift, int *len)
25 {
26 char *ptr;
27 int tmp;
28 tmp=(int)strlen(in);
29 if (*shift >= tmp)
30 return -1;
31 ptr = strchr (in + *shift, c);
32
33 if (ptr == NULL)
34 ptr = strchr (in + *shift, '\n');
35 if (ptr == NULL)
36 {
37 *len = (int)strlen (in) - *shift;
38 }
39 else
40 {
41 *len = (int)(ptr - in - *shift);
42 }
43 if (*len < 1)
44 return -1;
45 return 0;
46 }
47
48 int
mytoken(char * in,unsigned int c,char * out,char * innew)49 mytoken (char *in, unsigned int c, char *out, char *innew)
50 {
51 int i;
52 int flag = 0, il = 0;
53 for (i = 0; in[i] != 0; i++)
54 {
55 if (flag == 0)
56 {
57 out[i] = in[i];
58 if (in[i] == c)
59 {
60 flag = 1;
61 out[i] = 0;
62 il = i;
63 }
64 }
65 else
66 {
67 innew[i - il - 1] = in[i];
68 }
69 }
70 innew[i - il - 1] = 0;
71 return flag;
72 }
73
74
75 int
mycut(char * in,char c,char * out)76 mycut (char *in, char c, char *out)
77 {
78 int i = 0;
79 while (in[i] != 0 && in[i] != c)
80 {
81 out[i] = in[i];
82 i++;
83 }
84 out[i] = 0;
85 return 1;
86 }
87
88
89 int
myterminate(char * in,char * term)90 myterminate (char *in, char *term)
91 {
92 int i, j;
93 int l = (int)strlen (term);
94 for (i = 0; in[i] != 0; i++)
95 for (j = 0; j < l; j++)
96 if (in[i] == term[j])
97 {
98 in[i] = 0;
99 return 1;
100 }
101 return 1;
102 }
103
104
105 int
my7cut(char * in,char c)106 my7cut (char *in, char c)
107 {
108 int i = 0;
109 while (in[i] != 0 && in[i] != c)
110 {
111 i++;
112 }
113 in[i] = 0;
114 return 1;
115 }
116
117 char *
myexchange(char * in,unsigned int a,unsigned int b)118 myexchange (char *in, unsigned int a, unsigned int b)
119 {
120 int i;
121 for (i = 0; in[i] != 0; i++)
122 {
123 if (in[i] == a)
124 in[i] = b;
125 }
126 return in;
127 }
128
129 int
myfgets(char * str,int len,FILE * inp)130 myfgets (char *str, int len, FILE * inp)
131 {
132 char temp[80];
133 char *ptr;
134 if (fgets (str, len - 1, inp) == NULL)
135 return 0;
136 if ((ptr = strchr (str, '\n')) != NULL)
137 {
138 *ptr = 0;
139 return 1;
140 }
141
142 str[len - 1] = 0;
143 if (fgets (temp, 80, inp) == NULL)
144 return 1;
145 while ((strchr (temp, '\n')) == NULL)
146 if (fgets (temp, 80, inp) == NULL)
147 break;
148
149 return 1;
150 }
151
152 int
mysubdelete(char * str,char * token,char c)153 mysubdelete (char *str, char *token, char c)
154 {
155 char *ptr, *ptr1;
156 ptr = strstr (str, token);
157 if (ptr == NULL)
158 return 0;
159 ptr1 = strchr (ptr, c);
160 if (ptr1 == NULL)
161 {
162 *ptr = 0;
163 return 1;
164 }
165 strcpy (ptr, ptr1 + 1);
166 return 1;
167 }
168
169 int
mysubstitute(char * in,char * out,char * token,char * ins)170 mysubstitute (char *in, char *out, char *token, char *ins)
171 {
172 char *ptr;
173 ptr = strstr (in, token);
174 if (ptr == NULL)
175 return 0;
176 strncpy (out, in, (unsigned int) (ptr - in));
177 out[ptr - in] = 0;
178 strcat (out, ins);
179 strcat (out, ptr + strlen (token));
180 return 1;
181 }
182
183 int
mylastchar(char * str,char c)184 mylastchar (char *str, char c)
185 {
186 if (str[strlen (str) - 1] == c)
187 return 1;
188 else
189 return 0;
190 }
191
192 char *
strcatc(char * str,unsigned int c)193 strcatc (char *str, unsigned int c)
194 {
195 int i;
196 i = (int)strlen (str);
197 str[i] = c;
198 str[i + 1] = 0;
199 return str;
200 }
201
mystrcatl(char * str,unsigned int c)202 char *mystrcatl (char *str, unsigned int c)
203 {
204 int i;
205 i = (int)strlen (str);
206 if (str[i-1] == c)
207 return str;
208 str[i] = c;
209 str[i + 1] = 0;
210 return str;
211 }
212
213 int
mylastvchar(char * str,char c)214 mylastvchar (char *str, char c)
215 {
216 int i;
217 int j;
218 j = (int)strlen (str) - 1;
219 for (i = j; i > 0; i--)
220 {
221 if (str[i] != '\n' && str[i] != ' ')
222 break;
223 }
224 if (str[i] == c)
225 return 1;
226 else
227 return 0;
228 }
229
230
231 int
mylastdel(char * str,unsigned int c)232 mylastdel (char *str, unsigned int c)
233 {
234 int i;
235 i = (int)strlen (str) - 1;
236 if (str[i] == c)
237 str[i] = 0;
238 return 0;
239 }
240
241 char *
chop(char * str)242 chop (char *str)
243 {
244 int i;
245 i = (int)strlen (str) - 1;
246 str[i] = 0;
247 return str;
248 }
249
250 char *
chomp(char * str)251 chomp (char *str)
252 {
253 int i;
254 i = (int)strlen (str) - 1;
255 if (str[i] == '\n')
256 str[i] = 0;
257 return str;
258 }
259
260
261 char *
mydiet(char * in)262 mydiet (char *in)
263 {
264 int i, ii, j = 0, l;
265 char *temp, *ptr;
266 if (!strlen (in))
267 return in;
268
269 temp = (char *) malloc ((strlen (in) + 2) * sizeof (char));
270 if (temp == NULL)
271 {
272 fprintf(stderr,"Memory is over\n");
273 return NULL;
274 }
275 if ((ptr = strchr (in, '\n')) != NULL)
276 *ptr = ' ';
277 l = (int)strlen (in) - 1;
278 for (i = 0; i < l; i++)
279 {
280 if (in[i] == ' ' && in[i + 1] == ' ')
281 continue;
282 temp[j++] = in[i];
283 }
284 temp[j++] = in[i];
285
286 temp[j] = 0;
287 if (temp[0] == ' ')
288 {
289 for (ii=0; ii<j; ii++)
290 temp[i]=temp[i+1];
291 /* strcpy (temp, temp + 1); */
292 j--;
293 }
294
295 if (j > 0)
296 if (temp[j - 1] == ' ')
297 temp[j - 1] = 0;
298
299 strcpy (in, temp);
300
301 free (temp);
302 return in;
303 }
304
305 char *
mydietspace(char * in)306 mydietspace (char *in)
307 {
308 int i, j = 0, l, k;
309 char *temp;
310 if (!strlen (in))
311 return in;
312 temp = (char *) malloc ((strlen (in) + 2) * sizeof (char));
313 if (temp == NULL)
314 {
315 fprintf(stderr,"Memory is over\n");
316 return NULL;
317 }
318 l = (int)strlen (in) - 1;
319 for (i = 0; i < l; i++)
320 {
321 if (in[i] == ' ' && in[i + 1] == ' ')
322 continue;
323 temp[j++] = in[i];
324 }
325 temp[j++] = in[i];
326
327 temp[j] = 0;
328 if (temp[0] == ' ')
329 {
330 for(k=0; k<j; k++)
331 {
332 temp[k]=temp[k+1];
333 /*
334 strcpy (temp, temp + 1);
335 */
336 }
337 j--;
338 }
339
340 if (j > 0)
341 if (temp[j - 1] == ' ')
342 temp[j - 1] = 0;
343 if (j > 1)
344 if (temp[j - 1] == '\n' && temp[j - 2] == ' ')
345 temp[j - 1] = '\n';
346 strcpy (in, temp);
347
348 free (temp);
349 return in;
350 }
351
352
353 char *
mystrupr(char * str)354 mystrupr (char *str)
355 {
356 /* simple substitution of strupr function */
357 int i;
358 unsigned int c;
359
360 for (i = 0; str[i] != 0; i++)
361 if (islower (c = *(str + i)))
362 *(str + i) = toupper ((int)c);
363 return str;
364
365 }
366
367 char *
mystrlwr(char * str)368 mystrlwr (char *str)
369 {
370 /* simple substitution of strlwr function */
371 int i;
372 unsigned int c;
373
374 for (i = 0; str[i] != 0; i++)
375 if (isupper (c = *(str + i)))
376 *(str + i) = tolower ((int)c);
377 return str;
378
379 }
380
381 int
mysubtranc(char * in,char * token,char * ins)382 mysubtranc (char *in, char *token, char *ins)
383 {
384 char *ptr;
385 int l_ins;
386 int l_token;
387 int l = 0;
388 unsigned int i;
389 l_ins = (int)strlen (ins);
390 l_token = (int)strlen (token);
391 if (l_token < l_ins)
392 {
393 fprintf(stderr,"Wrong usage of mysubtranc\n");
394 return 0;
395 }
396 while ((ptr = strstr (in + l, token)) != NULL)
397 {
398
399 strncpy (ptr, ins,(unsigned int)l_ins);
400 for(i=0; i<strlen (ptr + l_token); i++)
401 {
402 *(ptr+l_ins+i)=*(ptr+l_token+i);
403 }
404 /*
405 strncpy (ptr + l_ins, ptr + l_token, strlen (ptr + l_token));
406 */
407 ptr[l_ins + strlen (ptr + l_token)] = 0;
408 l = l_token + 1;
409 }
410 return 1;
411 }
412
413
414 /*
415 int itoa(int i, char* s)
416 {
417 char c;
418 int j,k=0;
419 if(i<=0) return -1;
420 while(i>0)
421 {
422 j=i-i/10*10;
423 i=i/10;
424 c=char(j+int('0'));
425 s[k++]=c;
426 if(k>sizeof(s)) return -1;
427 }
428 s[k]=0;
429 for(j=0; j<k/2; j++)
430 {
431 c=s[j];
432 s[j]=s[k-1-j];
433 s[k-1-j]=c;
434 }
435 return 0;
436 }
437 */
438
439
440 int
mycount(char * in,unsigned int c)441 mycount (char *in, unsigned int c)
442 {
443 int i = 0, j = 0;
444 while (in[i])
445 {
446 if (in[i++] == c)
447 j++;
448 }
449 return j;
450 }
451
452 int
mycount2(char * in,unsigned int c,int n)453 mycount2 (char *in, unsigned int c, int n)
454 {
455 int i = 0, j = 0;
456 while (in[i])
457 {
458 if (i == n)
459 break;
460 if (in[i++] == c)
461 j++;
462
463 }
464 return j;
465 }
466
467 int
mycounts(char * in,char * sub,char c)468 mycounts (char *in, char *sub, char c)
469 {
470 int i = 0, j = 0, l;
471 char *ptr;
472 ptr=strstr(in,sub);
473 if(ptr==NULL) return 0;
474 l=(int)(ptr-in);
475 while (i<l)
476 {
477 if (in[i++] == c)
478 j++;
479
480 }
481 return j;
482 }
483
484 int
mycounts_next(char * in,char * sub,char c,char * next,int len)485 mycounts_next (char *in, char *sub, char c, char *next, int len)
486 {
487 int i = 0, j = 0, l;
488 char *ptr;
489 ptr=strstr(in,sub);
490 if(ptr==NULL) return 0;
491
492 l=(int)(ptr-in);
493
494 strncpy(next,ptr,(unsigned int)len);
495 next[len]=0;
496 ptr=strchr(next,c);
497 if(ptr) *ptr=0;
498 while (i<l)
499 {
500 if (in[i++] == c)
501 j++;
502
503 }
504 return j;
505 }
506
507 #include <stdlib.h>
508
509 void *
xmalloc(size_t size)510 xmalloc (size_t size)
511 {
512
513 register void *value = malloc (size);
514 if (size == 0)
515 {
516 fprintf(stderr,"malloc call with zero size!\n");
517 exit (-1);
518 }
519 if (value == 0)
520 {
521 fprintf(stderr, "Virtual memory exhausted\n");
522 exit (-1);
523 }
524 return value;
525 }
526
527 char *
myextradiet(char * s,char c)528 myextradiet (char *s, char c)
529 {
530 int i, j = 0, l;
531 char *s1;
532 if (s[0] == 0)
533 return s;
534 if ((s1 = (char *) xmalloc ((strlen (s) + 1) * sizeof (char))) == NULL)
535 return NULL;
536 strcpy (s1, s);
537 l = (int)strlen (s);
538 for (i = 0; i < l; i++)
539 {
540 if (s1[i] != c)
541 {
542 s[j] = s1[i];
543 j++;
544 }
545 }
546 s[j] = 0;
547 free (s1);
548
549 return s;
550 }
551
552 static int double_ne(double, double);
553
554 int
mycutsub(char * in,char c)555 mycutsub (char *in, char c)
556 {
557 char *ptr;
558 ptr = strchr (in, c);
559 if (ptr != NULL)
560 strcpy (in, ptr + 1);
561 return 0;
562 }
563
564 int
myisnan(double n)565 myisnan(double n)
566 {
567 return double_ne(n,n);
568
569 }
double_ne(double n1,double n2)570 static int double_ne(double n1,double n2)
571 {
572 return n1!=n2;
573 }
574
575