* @brief Adds Token to the last empty position of TokenList * * @param TokenList the token list to push into * @param Token the token to add * @return PSCRIPT_ENGINE_TOKEN_LIST */
| 438 | * @return PSCRIPT_ENGINE_TOKEN_LIST |
| 439 | */ |
| 440 | PSCRIPT_ENGINE_TOKEN_LIST |
| 441 | Push(PSCRIPT_ENGINE_TOKEN_LIST TokenList, PSCRIPT_ENGINE_TOKEN Token) |
| 442 | { |
| 443 | // |
| 444 | // Calculate address to write new token |
| 445 | // |
| 446 | uintptr_t Head = (uintptr_t)TokenList->Head; |
| 447 | uintptr_t Pointer = (uintptr_t)TokenList->Pointer; |
| 448 | PSCRIPT_ENGINE_TOKEN * WriteAddr = (PSCRIPT_ENGINE_TOKEN *)(Head + Pointer * sizeof(PSCRIPT_ENGINE_TOKEN)); |
| 449 | |
| 450 | // |
| 451 | // Write Token to appropriate address in TokenList |
| 452 | // |
| 453 | *WriteAddr = Token; |
| 454 | |
| 455 | // |
| 456 | // Update Pointer |
| 457 | // |
| 458 | TokenList->Pointer++; |
| 459 | |
| 460 | // |
| 461 | // Handle overflow |
| 462 | // |
| 463 | if (Pointer == TokenList->Size - 1) |
| 464 | { |
| 465 | // |
| 466 | // Allocate a new buffer for string list with doubled length |
| 467 | // |
| 468 | PSCRIPT_ENGINE_TOKEN * NewHead = (PSCRIPT_ENGINE_TOKEN *)malloc(2 * TokenList->Size * sizeof(PSCRIPT_ENGINE_TOKEN)); |
| 469 | |
| 470 | if (NewHead == NULL) |
| 471 | { |
| 472 | printf("err, could not allocate buffer"); |
| 473 | return NULL; |
| 474 | } |
| 475 | |
| 476 | // |
| 477 | // Copy old buffer to new buffer |
| 478 | // |
| 479 | memcpy(NewHead, TokenList->Head, TokenList->Size * sizeof(PSCRIPT_ENGINE_TOKEN)); |
| 480 | |
| 481 | // |
| 482 | // Free old buffer |
| 483 | // |
| 484 | free(TokenList->Head); |
| 485 | |
| 486 | // |
| 487 | // Update Head and size of TokenList |
| 488 | // |
| 489 | TokenList->Size = TokenList->Size * 2; |
| 490 | TokenList->Head = NewHead; |
| 491 | } |
| 492 | |
| 493 | return TokenList; |
| 494 | } |
| 495 | /** |
| 496 | * @brief Removes last Token of a TokenList and returns it |
| 497 | * |
no outgoing calls
no test coverage detected