| 221 | } |
| 222 | |
| 223 | txSymbol* fxNewParserSymbol(txParser* parser, txString theString) |
| 224 | { |
| 225 | txString aString; |
| 226 | txSize aLength; |
| 227 | txU4 aSum; |
| 228 | txU4 aModulo; |
| 229 | txSymbol* aSymbol; |
| 230 | |
| 231 | aString = theString; |
| 232 | aLength = 0; |
| 233 | aSum = 0; |
| 234 | while(*aString != 0) { |
| 235 | aLength++; |
| 236 | aSum = (aSum << 1) + *aString++; |
| 237 | } |
| 238 | aSum &= 0x7FFFFFFF; |
| 239 | aModulo = aSum % parser->symbolModulo; |
| 240 | aSymbol = parser->symbolTable[aModulo]; |
| 241 | while (aSymbol != C_NULL) { |
| 242 | if (aSymbol->sum == aSum) |
| 243 | if (c_strcmp(aSymbol->string, theString) == 0) |
| 244 | break; |
| 245 | aSymbol = aSymbol->next; |
| 246 | } |
| 247 | if (aSymbol == C_NULL) { |
| 248 | aSymbol = fxNewParserChunk(parser, sizeof(txSymbol)); |
| 249 | aSymbol->next = parser->symbolTable[aModulo]; |
| 250 | aSymbol->ID = -1; |
| 251 | aSymbol->length = aLength + 1; |
| 252 | aSymbol->string = fxNewParserString(parser, theString, aLength); |
| 253 | aSymbol->sum = aSum; |
| 254 | aSymbol->usage = 0; |
| 255 | parser->symbolTable[aModulo] = aSymbol; |
| 256 | } |
| 257 | return aSymbol; |
| 258 | } |
| 259 | |
| 260 | void fxReportMemoryError(txParser* parser, txInteger line, txString theFormat, ...) |
| 261 | { |
no test coverage detected