Annotation of parser3/src/main/pa_string.C, revision 1.7
1.4 paf 1: /*
1.7 ! paf 2: $Id: pa_string.C,v 1.6 2001/01/26 18:55:55 paf Exp $
1.4 paf 3: */
4:
1.1 paf 5: #include <string.h>
6:
7: #include "pa_pool.h"
1.5 paf 8: #include "pa_hash.h"
1.1 paf 9:
10: void *String::operator new(size_t size, Pool *apool) {
1.5 paf 11: return apool->malloc(size);
1.1 paf 12: }
13:
1.2 paf 14: void String::construct(Pool *apool) {
1.1 paf 15: pool=apool;
1.2 paf 16: head.count=curr_chunk_rows=CR_PREALLOCATED_COUNT;
1.5 paf 17: append_here=head.rows;
1.2 paf 18: head.preallocated_link=0;
1.5 paf 19: link_row=&head.rows[curr_chunk_rows];
1.1 paf 20: }
21:
22: void String::expand() {
1.2 paf 23: curr_chunk_rows=curr_chunk_rows*100/CR_GROW_PERCENT;
24: Chunk *chunk=static_cast<Chunk *>(
25: pool->calloc(sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *)));
26: chunk->count=curr_chunk_rows;
27: link_row->link=chunk;
1.5 paf 28: append_here=chunk->rows;
29: link_row=&chunk->rows[curr_chunk_rows];
1.1 paf 30: }
31:
1.5 paf 32: String::String(String& src) {/*
33: int src_used_rows=src.used_rows(); {
34: curr_chunk_rows=src_total_rows
35: Chunk *chunk=static_cast<Chunk *>(
36: pool->calloc(sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *)));
37: chunk->count=curr_chunk_rows;
38: link_row->link=chunk;
39: append_here=chunk->rows;
40: link_row=&chunk->rows[curr_chunk_rows];
41: }
42:
43: Chunk *chunk=&head;
44: do {
45: result+=chunk->count;
46: chunk=row->link;
47: } while(chunk);
48: break2:
49: return result;*/
50:
51: }
52:
1.6 paf 53: String& String::operator = (String& src) {
54: return *this;
55: }
56:
1.5 paf 57:
1.1 paf 58: String& String::operator += (char *src) {
59: if(chunk_is_full())
60: expand();
61:
62: append_here->item.ptr=src;
63: append_here->item.size=strlen(src);
64: append_here++;
65:
66: return *this;
67: }
68:
69: size_t String::size() {
70: int result=0;
1.5 paf 71:
1.2 paf 72: Chunk *chunk=&head;
73: do {
1.5 paf 74: Chunk::Row *row=chunk->rows;
1.2 paf 75: for(int i=0; i<chunk->count; i++) {
1.1 paf 76: if(row==append_here)
77: goto break2;
78:
79: result+=row->item.size;
80: row++;
81: }
1.2 paf 82: chunk=row->link;
83: } while(chunk);
1.1 paf 84: break2:
85: return result;
86: }
87:
88: char *String::c_str() {
1.5 paf 89: char *result=static_cast<char *>(pool->malloc(size()+1));
1.1 paf 90:
91: char *copy_here=result;
1.2 paf 92: Chunk *chunk=&head;
93: do {
1.5 paf 94: Chunk::Row *row=chunk->rows;
1.2 paf 95: for(int i=0; i<chunk->count; i++) {
1.1 paf 96: if(row==append_here)
97: goto break2;
98:
99: memcpy(copy_here, row->item.ptr, row->item.size);
100: copy_here+=row->item.size;
101: row++;
102: }
1.2 paf 103: chunk=row->link;
104: } while(chunk);
1.1 paf 105: break2:
106: *copy_here=0;
107: return result;
108: }
109:
1.5 paf 110: int String::used_rows() {
111: int result=0;
112:
113: Chunk *chunk=&head;
114: do {
115: int count=chunk->count;
116: result+=count;
117: chunk=chunk->rows[count].link;
118: } while(chunk);
119:
120: result-=link_row-append_here;
121:
122: return result;
123: }
124:
1.7 ! paf 125: uint String::hash_code() {
! 126: uint result=0;
1.5 paf 127:
128: Chunk *chunk=&head;
129: do {
130: Chunk::Row *row=chunk->rows;
131: for(int i=0; i<chunk->count; i++) {
132: if(row==append_here)
133: goto break2;
134:
1.6 paf 135: result=Hash::generic_code(result, row->item.ptr, row->item.size);
1.5 paf 136: row++;
137: }
138: chunk=row->link;
139: } while(chunk);
140: break2:
141: return result;
142: }
143:
144: bool String::operator == (String& src) {
145: return false;
146: }
E-mail: