* @brief Gets a symbol and push it into the symbol buffer * * @param SymbolBuffer * @param Symbol * @return PSYMBOL_BUFFER */
| 3963 | * @return PSYMBOL_BUFFER |
| 3964 | */ |
| 3965 | PSYMBOL_BUFFER |
| 3966 | PushSymbol(PSYMBOL_BUFFER SymbolBuffer, const PSYMBOL Symbol) |
| 3967 | { |
| 3968 | // |
| 3969 | // Calculate address to write new token |
| 3970 | // |
| 3971 | uintptr_t Head = (uintptr_t)SymbolBuffer->Head; |
| 3972 | uintptr_t Pointer = (uintptr_t)SymbolBuffer->Pointer; |
| 3973 | PSYMBOL WriteAddr = (PSYMBOL)(Head + Pointer * sizeof(SYMBOL)); |
| 3974 | |
| 3975 | if (Symbol->Type == SYMBOL_STRING_TYPE || Symbol->Type == SYMBOL_WSTRING_TYPE) |
| 3976 | { |
| 3977 | // |
| 3978 | // Update Pointer |
| 3979 | // |
| 3980 | SymbolBuffer->Pointer += GetSymbolHeapSize(Symbol); |
| 3981 | |
| 3982 | // |
| 3983 | // Handle Overflow |
| 3984 | // |
| 3985 | if (SymbolBuffer->Pointer >= SymbolBuffer->Size - 1) |
| 3986 | { |
| 3987 | // |
| 3988 | // Calculate new size for the symbol B |
| 3989 | // |
| 3990 | unsigned int NewSize = SymbolBuffer->Size; |
| 3991 | do |
| 3992 | { |
| 3993 | NewSize *= 2; |
| 3994 | } while (NewSize <= SymbolBuffer->Pointer); |
| 3995 | |
| 3996 | // |
| 3997 | // Allocate a new buffer for string list with doubled length |
| 3998 | // |
| 3999 | PSYMBOL NewHead = (PSYMBOL)malloc(NewSize * sizeof(SYMBOL)); |
| 4000 | |
| 4001 | if (NewHead == NULL) |
| 4002 | { |
| 4003 | printf("err, could not allocate buffer"); |
| 4004 | return NULL; |
| 4005 | } |
| 4006 | |
| 4007 | // |
| 4008 | // Copy old buffer to new buffer |
| 4009 | // |
| 4010 | memcpy(NewHead, SymbolBuffer->Head, SymbolBuffer->Size * sizeof(SYMBOL)); |
| 4011 | |
| 4012 | // |
| 4013 | // Free old buffer |
| 4014 | // |
| 4015 | free(SymbolBuffer->Head); |
| 4016 | |
| 4017 | // |
| 4018 | // Update Head and size of SymbolBuffer |
| 4019 | // |
| 4020 | SymbolBuffer->Size = NewSize; |
| 4021 | SymbolBuffer->Head = NewHead; |
| 4022 | } |
no test coverage detected