Annotation of parser3/src/main/pa_string.C, revision 1.1

1.1     ! paf         1: #include <string.h>
        !             2: 
        !             3: #include "pa_pool.h"
        !             4: 
        !             5: void *String::operator new(size_t size, Pool *apool) {
        !             6:        return apool->alloc(size);
        !             7: }
        !             8: 
        !             9: void String::construct(Pool *apool, int achunk_items) {
        !            10:        pool=apool;
        !            11:        chunk_items=achunk_items;
        !            12: 
        !            13:        head_chunk=static_cast<Chunk *>(
        !            14:                pool->calloc(sizeof(Chunk::Row)*chunk_items+sizeof(Chunk *)));
        !            15:        append_here=&head_chunk->first;
        !            16:        chunk_link_row=&head_chunk->first+chunk_items;
        !            17: }
        !            18: 
        !            19: void String::expand() {
        !            20:        chunk_link_row->link=static_cast<Chunk *>(
        !            21:                pool->calloc(sizeof(Chunk::Row)*chunk_items+sizeof(Chunk *)));
        !            22:        append_here=&chunk_link_row->link->first;
        !            23:        chunk_link_row=&chunk_link_row->link->first+chunk_items;
        !            24: }
        !            25: 
        !            26: String& String::operator += (char *src) {
        !            27:        if(chunk_is_full())
        !            28:                expand();
        !            29: 
        !            30:        append_here->item.ptr=src;
        !            31:        append_here->item.size=strlen(src);
        !            32:        append_here++;
        !            33: 
        !            34:        return *this;
        !            35: }
        !            36: 
        !            37: size_t String::size() {
        !            38:        int result=0;
        !            39:        for(Chunk::Row *row=&head_chunk->first; row; row=&row->link->first)
        !            40:                for(int i=0; i<chunk_items; i++) {
        !            41:                        if(row==append_here)
        !            42:                                goto break2;
        !            43: 
        !            44:                        result+=row->item.size;
        !            45:                        row++;
        !            46:                }
        !            47: break2:
        !            48:        return result;
        !            49: }
        !            50: 
        !            51: char *String::c_str() {
        !            52:        char *result=static_cast<char *>(pool->alloc(size()+1));
        !            53: 
        !            54:        char *copy_here=result;
        !            55:        for(Chunk::Row *row=&head_chunk->first; row; row=&row->link->first)
        !            56:                for(int i=0; i<chunk_items; i++) {
        !            57:                        if(row==append_here)
        !            58:                                goto break2;
        !            59: 
        !            60:                        memcpy(copy_here, row->item.ptr, row->item.size);
        !            61:                        copy_here+=row->item.size;
        !            62:                        row++;
        !            63:                }
        !            64: break2:
        !            65:        *copy_here=0;
        !            66:        return result;
        !            67: }
        !            68: 

E-mail: