Program Listing for File test_cjson_evm.c#

Return to documentation for file (src/test/test_cjson_evm.c)

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <cjson/cJSON.h>

int main(int argc, char *argv[])
{
    // read from file
    FILE *fp = fopen("input/evm_test.json", "r");
    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char *buffer = (char *)malloc(size + 1);
    fread(buffer, 1, size, fp);
    fclose(fp);
    buffer[size] = '\0';
    // parse
    cJSON *root = cJSON_Parse(buffer);
    free(buffer);
    int status;
    const cJSON *test = NULL;
    const cJSON *pre = NULL;
    const cJSON *contract = NULL;

    if (root == NULL)
    {
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL)
        {
            fprintf(stderr, "Error before: %s\n", error_ptr);
        }
        status = 0;
        goto end;
    }

    test = cJSON_GetObjectItemCaseSensitive(root, "sstoreGas");
    pre = cJSON_GetObjectItemCaseSensitive(test, "pre");

    cJSON_ArrayForEach(contract, pre)
    {
        printf("contract: %s\n", contract->string);
        cJSON *balance = cJSON_GetObjectItemCaseSensitive(contract, "balance");
        cJSON *code = cJSON_GetObjectItemCaseSensitive(contract, "code");
        cJSON *nonce = cJSON_GetObjectItemCaseSensitive(contract, "nonce");
        cJSON *storage = cJSON_GetObjectItemCaseSensitive(contract, "storage");
        const cJSON *key_value = NULL;
        printf("balance: %s, code: %s, nonce: %s\n", balance->valuestring, code->valuestring, nonce->valuestring);
        printf("storage size: %d\n", cJSON_GetArraySize(storage));
        cJSON_ArrayForEach(key_value, storage)
        {
            printf("key: %s, value: %s\n", key_value->string, key_value->valuestring);
        }
    }

    end:
        cJSON_Delete(root);
    return 0;
}