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