static SLang_BString_Type * concat_bstrings (SLang_BString_Type *a, SLang_BString_Type *b) { unsigned int len; SLang_BString_Type *c; char *bytes; len = a->len + b->len; #if SLANG_USE_TMP_OPTIMIZATION if ((a->num_refs == 1) /* owned by stack */ && (a->ptr_type == IS_BSTRING) && (len <= a->malloced_len)) { bytes = (char *)a->v.bytes; memcpy (bytes + a->len, (char *)BS_GET_POINTER(b), b->len); bytes[len] = 0; /* ok to \0 terminate --- see above */ a->len = len; a->num_refs++; return a; } #endif if (NULL == (c = SLbstring_create (NULL, len))) return NULL; bytes = (char *)BS_GET_POINTER(c); memcpy (bytes, (char *)BS_GET_POINTER(a), a->len); memcpy (bytes + a->len, (char *)BS_GET_POINTER(b), b->len); bytes[len] = 0; return c; }
static SLang_BString_Type * concat_bstrings (SLang_BString_Type *a, SLang_BString_Type *b) { unsigned int len; SLang_BString_Type *c; char *bytes; len = a->len + b->len; if (NULL == (c = SLbstring_create (NULL, len))) return NULL; bytes = (char *)BS_GET_POINTER(c); memcpy (bytes, (char *)BS_GET_POINTER(a), a->len); memcpy (bytes + a->len, (char *)BS_GET_POINTER(b), b->len); return c; }
static int compare_bstrings (SLang_BString_Type *a, SLang_BString_Type *b) { unsigned int len; int ret; len = a->len; if (b->len < len) len = b->len; ret = memcmp ((char *)BS_GET_POINTER(b), (char *)BS_GET_POINTER(a), len); if (ret != 0) return ret; if (a->len > b->len) return 1; if (a->len == b->len) return 0; return -1; }
unsigned char *SLbstring_get_pointer (SLang_BString_Type *b, unsigned int *len) { if (b == NULL) { *len = 0; return NULL; } *len = b->len; return BS_GET_POINTER(b); }
/* returns the character position of substring in a string or null */ static int issubbytes (SLang_BString_Type *as, SLang_BString_Type *bs) { unsigned int lena, lenb; unsigned char *a, *b, *amax, *bmax, *astart; unsigned char ch0; a = BS_GET_POINTER(as); b = BS_GET_POINTER(bs); lena = as->len; lenb = bs->len; if ((lenb > lena) || (lenb == 0)) return 0; lena -= lenb; amax = a + lena; bmax = b + lenb; astart = a; ch0 = *b++; while (a <= amax) { unsigned char *a0, *b0; if (ch0 != *a++) continue; a0 = a; b0 = b; while ((b < bmax) && (*a == *b)) { a++; b++; } if (b == bmax) return (a0 - astart); a = a0; b = b0; } return 0; }
static char *bstring_string (unsigned char type, VOID_STAR v) { SLang_BString_Type *s; unsigned char buf[128]; unsigned char *bytes, *bytes_max; unsigned char *b, *bmax; (void) type; s = *(SLang_BString_Type **) v; bytes = BS_GET_POINTER(s); bytes_max = bytes + s->len; b = buf; bmax = buf + (sizeof (buf) - 4); while (bytes < bytes_max) { unsigned char ch = *bytes; if ((ch < 32) || (ch >= 127) || (ch == '\\')) { if (b + 4 > bmax) break; sprintf ((char *) b, "\\%03o", ch); b += 4; } else { if (b == bmax) break; *b++ = ch; } bytes++; } if (bytes < bytes_max) { *b++ = '.'; *b++ = '.'; *b++ = '.'; } *b = 0; return SLmake_string ((char *)buf); }
static unsigned int count_byte_occurrences (SLang_BString_Type *b, unsigned char *chp) { unsigned char ch = *chp; unsigned char *bytes, *bytes_max; unsigned int n; bytes = BS_GET_POINTER(b); bytes_max = bytes + b->len; n = 0; while (bytes < bytes_max) { if (*bytes++ == ch) n++; } return n; }
static int bstring_to_string (unsigned char a_type, VOID_STAR ap, unsigned int na, unsigned char b_type, VOID_STAR bp) { char **s; unsigned int i; SLang_BString_Type **a; (void) a_type; (void) b_type; s = (char **) bp; a = (SLang_BString_Type **) ap; for (i = 0; i < na; i++) { SLang_BString_Type *ai = a[i]; if (ai == NULL) { s[i] = NULL; continue; } if (NULL == (s[i] = SLang_create_slstring ((char *)BS_GET_POINTER(ai)))) { while (i != 0) { i--; SLang_free_slstring (s[i]); s[i] = NULL; } return -1; } } return 1; }