home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume14 / mush6.0 / part02 / strings.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-04-12  |  4.6 KB  |  245 lines

  1. /* strings.c Copyrite(1988) Dan Heller */
  2.  
  3. #include "mush.h"
  4.  
  5. /*
  6.  * lose the newline character, trailing whitespace, and return the end of p
  7.  * test for '\n' separately since some _ctype_[] arrays may not have the
  8.  * _S bit set for the newline character.  see <ctype.h> for more info.
  9.  */
  10. char *
  11. no_newln(p)
  12. register char *p;
  13. {
  14.     register char *p2 = p + strlen(p);    /* point it to the null terminator */
  15.  
  16.     while (p2 > p && *--p2 == '\n' || isspace(*p2))
  17.     *p2 = 0;  /* get rid of newline and trailing spaces */
  18.     return p2;
  19. }
  20.  
  21. /* find any character in string2 that's in string1 */
  22. char *
  23. any(s1, s2)
  24. register char *s1, *s2;
  25. {
  26.     register char *p;
  27.     if (!s1 || !*s1 || !s2 || !*s2)
  28.     return NULL;
  29.     for( ; *s1; s1++) {
  30.     for(p = s2; *p; p++)
  31.         if (*p == *s1)
  32.         return s1;
  33.     }
  34.     return NULL;
  35. }
  36.  
  37. /* check two lists of strings each of which contain substrings.
  38.  * Each substring is delimited by any char in "delimeters"
  39.  * return true if any elements in list1 are on list2.
  40.  * thus:
  41.  * string1 = "foo, bar, baz"
  42.  * string2 = "foobar, baz, etc"
  43.  * delimeters = ", \t"
  44.  * example returns 1 because "baz" exists in both lists
  45.  * NOTE: case is ignored.
  46.  */
  47. chk_two_lists(list1, list2, delimeters)
  48. register char *list1, *list2, *delimeters;
  49. {
  50.     register char *p, c;
  51.     register int found = 0;
  52.  
  53.     if (p = any(list1, delimeters)) {
  54.     for (p++; *p && index(delimeters, *p); p++)
  55.         ;
  56.     if (chk_two_lists(p, list2, delimeters))
  57.         return 1;
  58.     }
  59.     if (p = any(list2, delimeters)) {
  60.     for (p++; *p && index(delimeters, *p); p++)
  61.         ;
  62.     if (chk_two_lists(list1, p, delimeters))
  63.         return 1;
  64.     }
  65.     if (p) {
  66.     while (index(delimeters, *(p-1)))
  67.         --p;
  68.     c = *p, *p = 0;
  69.     }
  70.     found = !lcase_strcmp(list1, list2);
  71.     if (p)
  72.     *p = c;
  73.     return found;
  74. }
  75.  
  76. bzero(addr, size)
  77. register char *addr;
  78. register int size;
  79. {
  80.     while (size-- > 0)
  81.     addr[size] = 0;
  82. }
  83.  
  84. /* do an atoi() on the string passed and return in "val" the decimal value.
  85.  * the function returns a pointer to the location in the string that is not
  86.  * a digit.
  87.  */
  88. char *
  89. my_atoi(p, val)
  90. register char *p;
  91. register int *val;
  92. {
  93.     int positive = 1;
  94.  
  95.     if (!p)
  96.     return NULL;
  97.     *val = 0;
  98.     if (*p == '-')
  99.     positive = -1, p++;
  100.     while (isdigit(*p))
  101.     *val = (*val) * 10 + *p++ - '0';
  102.     *val *= positive;
  103.     return p;
  104. }
  105.  
  106. /* strcmp ignoring case */
  107. lcase_strcmp(str1, str2)
  108. register char *str1, *str2;
  109. {
  110.     while (*str1 && *str2)
  111.     if (lower(*str1) != lower(*str2))
  112.         break;
  113.     else
  114.         str1++, str2++;
  115.     return *str1 - *str2;
  116. }
  117.  
  118. /* strcpy coverting everything to lower case (arbitrary) to ignore cases */
  119. char *
  120. lcase_strcpy(dst, src)
  121. register char *dst, *src;
  122. {
  123.     register char *s = dst;
  124.  
  125.     /* "lower" is a macro, don't incrment its argument! */
  126.     while (*dst++ = lower(*src))
  127.     src++;
  128.     return s;
  129. }
  130.  
  131. /* this strcpy returns number of bytes copied */
  132. Strcpy(dst, src)
  133. register char *dst, *src;
  134. {
  135.     register int n = 0;
  136.     if (!dst || !src)
  137.     return 0;
  138.     while (*dst++ = *src++)
  139.     n++;
  140.     return n;
  141. }
  142.  
  143. void
  144. xfree(cp)
  145. char *cp;
  146. {
  147.     extern char end[];
  148.  
  149.     if (cp >= end && cp < (char *) &cp && debug < 5)
  150.     free(cp);
  151. }
  152.  
  153. char *
  154. savestr(s)
  155. register char *s;
  156. {
  157.     register char *p;
  158.     char *malloc();
  159.     if (!s)
  160.     s = "";
  161.     if (!(p = malloc((unsigned) (strlen(s) + 1)))) {
  162.     error("out of memory saving %s", s);
  163.     return NULL;
  164.     }
  165.     return strcpy(p, s);
  166. }
  167.  
  168. void
  169. free_vec(argv)
  170. char **argv;
  171. {
  172.     register int n;
  173.     if (!argv)
  174.     return;
  175.     for (n = 0; argv[n]; n++)
  176.     xfree(argv[n]);
  177.     xfree((char *)argv);
  178. }
  179.  
  180. /* copy a vector of stirngs into one string -- return the end of the string */
  181. char *
  182. argv_to_string(p, argv)
  183. register char *p, **argv;
  184. {
  185.     register int i;
  186.     register char *ptr = p;
  187.  
  188.     *p = 0;
  189.     if (!argv[0])
  190.     return "";
  191.     for (i = 0; argv[i]; i++)
  192.     ptr += strlen(sprintf(ptr, "%s ", argv[i]));
  193.     *--ptr = 0;   /* get rid of the last space */
  194.     return ptr;
  195. }
  196.  
  197. /* echo the command line. return -1 cuz no messages are affected */
  198. do_echo(argc, argv)
  199. register char **argv;
  200. {
  201.     char buf[BUFSIZ];
  202.     int no_return;
  203.  
  204.     if (argc > 1 && !strcmp(argv[1], "-?")) {
  205.     print("usage: %s [-n] ...\n", *argv);
  206.     return -1;
  207.     }
  208.     no_return = *++argv && !strcmp(*argv, "-n");
  209.     (void) argv_to_string(buf, argv+no_return);
  210.     print("%s%s", buf, (no_return)? "" : "\n");
  211.     return -1;
  212. }
  213.  
  214. char *
  215. itoa(n)
  216. {
  217.     static char buf[10];
  218.     return sprintf(buf, "%d", n);
  219. }
  220.  
  221. #ifdef SYSV
  222. char *
  223. Sprintf(buf, fmt, args)
  224. register char *buf, *fmt;
  225. {
  226.     vsprintf(buf, fmt, &args);
  227.     return buf;
  228. }
  229. #endif /* SYSV */
  230.  
  231. print_argv(argv)
  232. char **argv;
  233. {
  234.     while (*argv)
  235.     if (debug)
  236.         printf("(%s) ", *argv++);
  237.     else
  238.         wprint("%s ", *argv++);
  239.     if (debug) {
  240.     putchar('\n');
  241.     fflush(stdout);
  242.     } else
  243.     wprint("\n");
  244. }
  245.