diff options
author | Karl Berry <karl@freefriends.org> | 2008-05-04 17:04:24 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2008-05-04 17:04:24 +0000 |
commit | cc9ce94021dcb487c98b49fb08aa570671c4c57c (patch) | |
tree | f6622481ed20e5d4da034ece57e1b513846ff48d /Build/source/texk/lcdf-typetools/liblcdf/permstr.cc | |
parent | eed6bd31cc43fa6f09f26224add40f33b0256096 (diff) |
lcdf-typetools 2.68
git-svn-id: svn://tug.org/texlive/trunk@7841 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/lcdf-typetools/liblcdf/permstr.cc')
-rw-r--r-- | Build/source/texk/lcdf-typetools/liblcdf/permstr.cc | 98 |
1 files changed, 25 insertions, 73 deletions
diff --git a/Build/source/texk/lcdf-typetools/liblcdf/permstr.cc b/Build/source/texk/lcdf-typetools/liblcdf/permstr.cc index 421714a0e35..4d6744215c3 100644 --- a/Build/source/texk/lcdf-typetools/liblcdf/permstr.cc +++ b/Build/source/texk/lcdf-typetools/liblcdf/permstr.cc @@ -2,7 +2,7 @@ /* permstr.{cc,hh} -- permanent strings * - * Copyright (c) 1998-2006 Eddie Kohler + * Copyright (c) 1998-2008 Eddie Kohler * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -21,7 +21,6 @@ #include <string.h> #include <stdio.h> - static PermString::Initializer initializer; PermString::Doodad PermString::zero_char_doodad = { @@ -125,7 +124,7 @@ PermString::initialize(const char* s, int length) return; } - unsigned int hash; + unsigned hash; int l; for (hash = 0, l = length, mm = m; l; mm++, l--) hash = (hash << 1) + scatter[*mm]; @@ -149,40 +148,10 @@ PermString::initialize(const char* s, int length) _rep = buck->data; } -PermString::PermString(char c) -{ - unsigned char u = (unsigned char) c; - _rep = one_char_doodad[u].data; -} - - - -bool -operator==(PermString a, const char *b) -{ - if (!a || !b) - return !a && !b; - int l = strlen(b); - return a.length() == l && memcmp(a.c_str(), b, l) == 0; -} - - -char -PermString::operator[](int e) const -{ - assert(e >= 0 && e <= length()); - if (e >= 0 && e < length()) - return c_str()[e]; - else - return 0; -} - - static int pspos; static int pscap = 64; static char *psc = (char *)malloc(pscap); - static void append(const char *s, int len) { @@ -223,11 +192,11 @@ vpermprintf(const char *s, va_list val) int iflag = -1; while (1) switch (*++s) { - + case '0': /* zeroflag = 1; */ break; - + case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': assert(iflag == -1 /* Too many decimal flags in permprintf */); @@ -237,12 +206,12 @@ vpermprintf(const char *s, va_list val) s++; } break; - + case '*': assert(iflag == -1 /* iflag given */); iflag = va_arg(val, int); break; - + case 's': { const char *x = va_arg(val, const char *); if (x) { @@ -259,7 +228,7 @@ vpermprintf(const char *s, va_list val) append(&c, 1); goto pctdone; } - + case 'p': { PermString::Capsule x = va_arg(val, PermString::Capsule); PermString px; @@ -271,24 +240,24 @@ vpermprintf(const char *s, va_list val) append(px.c_str(), iflag); goto pctdone; } - + case 'd': { // FIXME FIXME rewrite for sense int x = va_arg(val, int); if (pspos == pscap) extend(1); - + // FIXME -2^31 unsigned int ux = x; if (x < 0) { psc[pspos++] = '-'; ux = -x; } - + int numdigits = 0; for (unsigned digcountx = ux; digcountx > 9; digcountx /= 10) numdigits++; - + extend(numdigits + 1); int digit = numdigits; do { @@ -297,10 +266,10 @@ vpermprintf(const char *s, va_list val) digit--; } while (ux); pspos += numdigits + 1; - + goto pctdone; } - + case 'g': { // FIXME FIXME rewrite for sense double x = va_arg(val, double); @@ -312,11 +281,11 @@ vpermprintf(const char *s, va_list val) pspos += len; goto pctdone; } - + default: assert(0 /* Bad % in permprintf */); goto pctdone; - + } pctdone: @@ -326,9 +295,7 @@ vpermprintf(const char *s, va_list val) return PermString(psc, pspos); } - -PermString -permprintf(const char *s, ...) +PermString permprintf(const char *s, ...) { va_list val; va_start(val, s); @@ -337,31 +304,16 @@ permprintf(const char *s, ...) return p; } - -PermString -permcat(PermString p1, PermString p2) -{ - unsigned l1 = p1.length(); - unsigned l2 = p2.length(); - char *s = new char[l1 + l2]; - memcpy(s, p1.c_str(), l1); - memcpy(s + l1, p2.c_str(), l2); - PermString p(s, l1 + l2); - delete[] s; - return p; -} - -PermString -permcat(PermString p1, PermString p2, PermString p3) +PermString permcat(PermString a, PermString b) { - unsigned l1 = p1.length(); - unsigned l2 = p2.length(); - unsigned l3 = p3.length(); - char *s = new char[l1 + l2 + l3]; - memcpy(s, p1.c_str(), l1); - memcpy(s + l1, p2.c_str(), l2); - memcpy(s + l1 + l2, p3.c_str(), l3); - PermString p(s, l1 + l2 + l3); + if (!a || !b) + return a ? a : b; + unsigned al = a.length(); + unsigned bl = b.length(); + char *s = new char[al + bl]; + memcpy(s, a.c_str(), al); + memcpy(s + al, b.c_str(), bl); + PermString p(s, al + bl); delete[] s; return p; } |