home *** CD-ROM | disk | FTP | other *** search
- /* strings.c Copyrite(1988) Dan Heller */
-
- #include "mush.h"
-
- /*
- * lose the newline character, trailing whitespace, and return the end of p
- * test for '\n' separately since some _ctype_[] arrays may not have the
- * _S bit set for the newline character. see <ctype.h> for more info.
- */
- char *
- no_newln(p)
- register char *p;
- {
- register char *p2 = p + strlen(p); /* point it to the null terminator */
-
- while (p2 > p && *--p2 == '\n' || isspace(*p2))
- *p2 = 0; /* get rid of newline and trailing spaces */
- return p2;
- }
-
- /* find any character in string2 that's in string1 */
- char *
- any(s1, s2)
- register char *s1, *s2;
- {
- register char *p;
- if (!s1 || !*s1 || !s2 || !*s2)
- return NULL;
- for( ; *s1; s1++) {
- for(p = s2; *p; p++)
- if (*p == *s1)
- return s1;
- }
- return NULL;
- }
-
- /* check two lists of strings each of which contain substrings.
- * Each substring is delimited by any char in "delimeters"
- * return true if any elements in list1 are on list2.
- * thus:
- * string1 = "foo, bar, baz"
- * string2 = "foobar, baz, etc"
- * delimeters = ", \t"
- * example returns 1 because "baz" exists in both lists
- * NOTE: case is ignored.
- */
- chk_two_lists(list1, list2, delimeters)
- register char *list1, *list2, *delimeters;
- {
- register char *p, c;
- register int found = 0;
-
- if (p = any(list1, delimeters)) {
- for (p++; *p && index(delimeters, *p); p++)
- ;
- if (chk_two_lists(p, list2, delimeters))
- return 1;
- }
- if (p = any(list2, delimeters)) {
- for (p++; *p && index(delimeters, *p); p++)
- ;
- if (chk_two_lists(list1, p, delimeters))
- return 1;
- }
- if (p) {
- while (index(delimeters, *(p-1)))
- --p;
- c = *p, *p = 0;
- }
- found = !lcase_strcmp(list1, list2);
- if (p)
- *p = c;
- return found;
- }
-
- bzero(addr, size)
- register char *addr;
- register int size;
- {
- while (size-- > 0)
- addr[size] = 0;
- }
-
- /* do an atoi() on the string passed and return in "val" the decimal value.
- * the function returns a pointer to the location in the string that is not
- * a digit.
- */
- char *
- my_atoi(p, val)
- register char *p;
- register int *val;
- {
- int positive = 1;
-
- if (!p)
- return NULL;
- *val = 0;
- if (*p == '-')
- positive = -1, p++;
- while (isdigit(*p))
- *val = (*val) * 10 + *p++ - '0';
- *val *= positive;
- return p;
- }
-
- /* strcmp ignoring case */
- lcase_strcmp(str1, str2)
- register char *str1, *str2;
- {
- while (*str1 && *str2)
- if (lower(*str1) != lower(*str2))
- break;
- else
- str1++, str2++;
- return *str1 - *str2;
- }
-
- /* strcpy coverting everything to lower case (arbitrary) to ignore cases */
- char *
- lcase_strcpy(dst, src)
- register char *dst, *src;
- {
- register char *s = dst;
-
- /* "lower" is a macro, don't incrment its argument! */
- while (*dst++ = lower(*src))
- src++;
- return s;
- }
-
- /* this strcpy returns number of bytes copied */
- Strcpy(dst, src)
- register char *dst, *src;
- {
- register int n = 0;
- if (!dst || !src)
- return 0;
- while (*dst++ = *src++)
- n++;
- return n;
- }
-
- void
- xfree(cp)
- char *cp;
- {
- extern char end[];
-
- if (cp >= end && cp < (char *) &cp && debug < 5)
- free(cp);
- }
-
- char *
- savestr(s)
- register char *s;
- {
- register char *p;
- char *malloc();
- if (!s)
- s = "";
- if (!(p = malloc((unsigned) (strlen(s) + 1)))) {
- error("out of memory saving %s", s);
- return NULL;
- }
- return strcpy(p, s);
- }
-
- void
- free_vec(argv)
- char **argv;
- {
- register int n;
- if (!argv)
- return;
- for (n = 0; argv[n]; n++)
- xfree(argv[n]);
- xfree((char *)argv);
- }
-
- /* copy a vector of stirngs into one string -- return the end of the string */
- char *
- argv_to_string(p, argv)
- register char *p, **argv;
- {
- register int i;
- register char *ptr = p;
-
- *p = 0;
- if (!argv[0])
- return "";
- for (i = 0; argv[i]; i++)
- ptr += strlen(sprintf(ptr, "%s ", argv[i]));
- *--ptr = 0; /* get rid of the last space */
- return ptr;
- }
-
- /* echo the command line. return -1 cuz no messages are affected */
- do_echo(argc, argv)
- register char **argv;
- {
- char buf[BUFSIZ];
- int no_return;
-
- if (argc > 1 && !strcmp(argv[1], "-?")) {
- print("usage: %s [-n] ...\n", *argv);
- return -1;
- }
- no_return = *++argv && !strcmp(*argv, "-n");
- (void) argv_to_string(buf, argv+no_return);
- print("%s%s", buf, (no_return)? "" : "\n");
- return -1;
- }
-
- char *
- itoa(n)
- {
- static char buf[10];
- return sprintf(buf, "%d", n);
- }
-
- #ifdef SYSV
- char *
- Sprintf(buf, fmt, args)
- register char *buf, *fmt;
- {
- vsprintf(buf, fmt, &args);
- return buf;
- }
- #endif /* SYSV */
-
- print_argv(argv)
- char **argv;
- {
- while (*argv)
- if (debug)
- printf("(%s) ", *argv++);
- else
- wprint("%s ", *argv++);
- if (debug) {
- putchar('\n');
- fflush(stdout);
- } else
- wprint("\n");
- }
-