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: