Annotation of researchv10no/cmd/cfront/demangle/String.c, revision 1.1

1.1     ! root        1: /*ident        "@(#)ctrans:demangler/String.c  1.2"*/
        !             2: /*
        !             3:  * C++ Demangler Source Code
        !             4:  * @(#)master  1.5
        !             5:  * 7/27/88 13:54:37
        !             6:  */
        !             7: #include "String.h"
        !             8: #include <stdio.h>
        !             9: #include <assert.h>
        !            10: extern char *malloc();
        !            11: /* This code emulates the C++ String package
        !            12:  * in a crude way.
        !            13:  */
        !            14: 
        !            15: /* This function will expand the space
        !            16:  * availabe to a String so that more data
        !            17:  * can be appended to it
        !            18:  */
        !            19: static String *
        !            20: grow(s)
        !            21: String *s;
        !            22: {
        !            23:        int sz = s->sg.max * 2;
        !            24:        assert(sz > 0);
        !            25:        s = (String *)realloc(s,sz + sizeof(StringGuts)+1);
        !            26:        assert(s != 0);
        !            27:        s->sg.max = sz;
        !            28:        return s;
        !            29: }
        !            30: 
        !            31: /* This function will expand the space
        !            32:  * available to a String so that more data
        !            33:  * can be prepended to it.
        !            34:  */
        !            35: static String *
        !            36: ror(s,n)
        !            37: String *s;
        !            38: int n;
        !            39: {
        !            40:        int i;
        !            41:        assert(s != 0);
        !            42:        while(s->sg.end + n > s->sg.max)
        !            43:                s = grow(s);
        !            44:        for(i = s->sg.end - 1;i >= s->sg.start;i--)
        !            45:                s->data[i+n] = s->data[i];
        !            46:        s->sg.end += n;
        !            47:        s->sg.start += n;
        !            48:        s->data[s->sg.end] = 0;
        !            49:        return s;
        !            50: }
        !            51: 
        !            52: /* This function will prepend c
        !            53:  * to s
        !            54:  */
        !            55: String *
        !            56: prep_String(c,s)
        !            57: char *c;
        !            58: String *s;
        !            59: {
        !            60:        int n = strlen(c);
        !            61:        return nprep_String(c,s,n);
        !            62: }
        !            63: 
        !            64: /* This function will prepend the
        !            65:  * first n characters of c to s
        !            66:  */
        !            67: String *
        !            68: nprep_String(c,s,n)
        !            69: char *c;
        !            70: String *s;
        !            71: int n;
        !            72: {
        !            73:        int len = strlen(c);
        !            74:        assert(s != 0);
        !            75:        if(len > n)
        !            76:                len = n;
        !            77:        if(len >= s->sg.start)
        !            78:                s = ror(s,len);
        !            79:        while(len--)
        !            80:                s->data[--(s->sg.start)] = c[len];
        !            81:        s->data[s->sg.end] = '\0';
        !            82:        return s;
        !            83: }
        !            84: 
        !            85: /* This function will append
        !            86:  * c to s.
        !            87:  */
        !            88: String *
        !            89: app_String(s,c)
        !            90: String *s;
        !            91: char *c;
        !            92: {
        !            93:        int n = strlen(c);
        !            94:        s = napp_String(s,c,n);
        !            95:        return s;
        !            96: }
        !            97: 
        !            98: /* This function will append the
        !            99:  * first n characters of c to s
        !           100:  */
        !           101: String *
        !           102: napp_String(s,c,n)
        !           103: String *s;
        !           104: char *c;
        !           105: {
        !           106:        int len = strlen(c);
        !           107:        int catlen;
        !           108:        assert(s != 0);
        !           109:        if(n < len)
        !           110:                len = n;
        !           111:        catlen = s->sg.end + len;
        !           112:        while(catlen > s->sg.max)
        !           113:                s = grow(s);
        !           114:        while(len--)
        !           115:                s->data[s->sg.end++] = *c++;
        !           116:        s->data[s->sg.end] = '\0';
        !           117:        assert(s->sg.end == catlen);
        !           118:        return s;
        !           119: }
        !           120: 
        !           121: /* This function initializes a
        !           122:  * String.  It returns
        !           123:  * its argument is non-zero.
        !           124:  * This prevents the same string
        !           125:  * from being re-initialized.
        !           126:  */
        !           127: String *
        !           128: mk_String(s)
        !           129: String *s;
        !           130: {
        !           131:        if(s)
        !           132:                return s;
        !           133:        s = (String *)malloc(STRING_START + sizeof(StringGuts)+1);
        !           134:        assert(s != 0);
        !           135:        s->sg.start = s->sg.end = STRING_START/2;
        !           136:        s->sg.max = STRING_START;
        !           137:        s->data[s->sg.end] = '\0';
        !           138:        return s;
        !           139: }
        !           140: 
        !           141: void
        !           142: free_String(s)
        !           143: String *s;
        !           144: {
        !           145:        if(s) free(s);
        !           146: }
        !           147: 
        !           148: /* This function copies
        !           149:  * c into s
        !           150:  */
        !           151: String *
        !           152: set_String(s,c)
        !           153: String *s;
        !           154: char *c;
        !           155: {
        !           156:        int len = strlen(c)*2;
        !           157:        while(len > s->sg.max)
        !           158:                s = grow(s);
        !           159:        s->sg.start = s->sg.end = s->sg.max / 2;
        !           160:        s = app_String(s,c);
        !           161:        return s;
        !           162: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.