From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/bastrngs.c | 144 ++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/bastrngs.c (limited to 'reference/C/CONTRIB/SNIP/bastrngs.c') diff --git a/reference/C/CONTRIB/SNIP/bastrngs.c b/reference/C/CONTRIB/SNIP/bastrngs.c new file mode 100755 index 0000000..54d87d2 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/bastrngs.c @@ -0,0 +1,144 @@ +/* +** BASIC-like string operations +** +** public domain by Bob Stout +*/ + +#include +#include +#include +#include +#include + +static int stralloc_ptr; +static char *strings[8]; +static int str_tag[8]; + +/* +** stralloc() is the key function in this package, maintaining a pool of +** reusable strings. +*/ + +char *stralloc(size_t length) +{ + register int i; + + i = stralloc_ptr++; + if ((!strings[i]) || (length > strlen(strings[i]))) + { + assert(strings[i] = (char *)realloc(strings[i], length)); + str_tag[i] = -1; + } + else str_tag[i] = 0; + stralloc_ptr &= 7; + return (strings[i]); + /* Maintains 8 strings in a circular buffer */ +} + +/* +** free the string pool. +*/ + +void str_free(char *string) +{ + register int i; + + for (i = 0; i < 8; ++i) + { + if (strings[i] == string) + { + if (str_tag[i]) + free(strings[i]); + return; + } + } +} + +/* +** return the leftmost N characters from a string +*/ + +char *left(char *string, size_t N) +{ + char *buf; + size_t strlength = strlen(string); + + if (N > strlength) + N = strlength; + buf = stralloc(N + 1); + memcpy(buf, string, N); + buf[N] = '\0'; + return buf; +} + +/* +** return the rightmost N characters from a string +*/ + +char *right(char *string, size_t N) +{ + char *buf; + size_t strlength = strlen(string); + + if (N > strlength) + N = strlength; + buf = stralloc(N + 1); + strcpy(buf, &string[strlength-N]); + return buf; +} + +/* +** return a substring, N characters long beginning at position M +*/ + +char *mid(char *string, size_t M, size_t N) +{ + char *buf; + size_t strlength = strlen(string); + + if (M > strlength) + return NULL; + if (N > (strlength - M)) + N = strlength - M; + buf = stralloc(N + 1); + memcpy(buf, &string[M-1], N); + buf[N] = '\0'; + return buf; +} + +/* +** string concatenation function, equivalent to A$=B$+C$+... +*/ + +char *string_add(char *string, ...) +{ + va_list arg_ptr; + char *temp1, *temp2, *buf; + + va_start(arg_ptr, string); + temp1 = string; + do + { + if(NULL == (temp2 = va_arg(arg_ptr, char *))) + break; + buf = stralloc(strlen(temp1) + strlen(temp2) + 1); + temp1 = strcat(strcpy(buf, temp1), temp2); + } while (NULL != temp2); + return temp1; +} + +#ifdef TEST + +/* +** Demo main() +*/ + +void main(void) +{ + char *x = "European", *y = "Hardware", *z = "Skaters"; + + z = string_add(left(x, 2), right(y, 2), mid(z, 2, 2), "!", NULL); + puts(z); +} + +#endif /* TEST */ -- cgit v1.2.3-54-g00ecf