• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #include "hcs_opcode.h"
10 #include <string.h>
11 
12 
13 OpCodeMapEntry g_byteCodeMap[PARSEROP_COUNT] = {
14     [PARSEROP_UINT8]    = {HCS_BYTE_OP,     BYTE_SIZE, "Uint8"},
15     [PARSEROP_UINT16]   = {HCS_WORD_OP,     WORD_SIZE, "Uint16"},
16     [PARSEROP_UINT32]   = {HCS_DWORD_OP,    DWORD_SIZE, "Uint32"},
17     [PARSEROP_UINT64]   = {HCS_QWORD_OP,    QWORD_SIZE, "Uint64"},
18     [PARSEROP_STRING]   = {HCS_STRING_OP,   0, "String"},
19     [PARSEROP_ARRAY]    = {HCS_ARRAY_OP,    WORD_SIZE, "Array"}, /* ElementCount - WORD */
20     [PARSEROP_CONFNODE] = {HCS_NODE_OP,     DWORD_SIZE, "ConfigNode"}, /* SubSize - DWORD */
21     [PARSEROP_CONFTERM] = {HCS_TERM_OP,     0, "ConfigTerm"},
22     [PARSEROP_NODEREF]  = {HCS_NODEREF_OP,  DWORD_SIZE, "NodeRef"}, /* RefHashCode - DWORD */
23 };
24 
HcsGetOpCodeMap(void)25 const OpCodeMapEntry *HcsGetOpCodeMap(void)
26 {
27     return g_byteCodeMap;
28 }
29 
HcsParserObjectTypeToByteCode(uint32_t objectType)30 const OpCodeMapEntry *HcsParserObjectTypeToByteCode(uint32_t objectType)
31 {
32     if (objectType >= PARSEROP_COUNT) {
33         return NULL;
34     }
35     return &g_byteCodeMap[objectType];
36 }
37 
HcsOpcodeToStr(uint16_t objectType)38 const char *HcsOpcodeToStr(uint16_t objectType)
39 {
40     if (objectType >= PARSEROP_COUNT) {
41         return "illegal OpCode, out of range";
42     }
43 
44     return g_byteCodeMap[objectType].opStr;
45 }
46 
HcsCalculateOpcodeSize(ParserObject * object)47 void HcsCalculateOpcodeSize(ParserObject *object)
48 {
49     const OpCodeMapEntry *byteCodeMap = HcsGetOpCodeMap();
50     uint32_t size = HcsAlign(OPCODE_BYTE_WIDTH) + HcsAlign(byteCodeMap[object->objectBase.type].size);
51     switch (object->objectBase.opCode) {
52         case HCS_NODE_OP: /* fall-through */
53         case HCS_TERM_OP:
54             /* name string */
55             size += HcsAlign(strlen(object->objectBase.name) + 1); // add 1 for '\0'
56             break;
57         case HCS_STRING_OP:
58             size += HcsAlign(strlen(object->objectBase.stringValue) + 1);
59             break;
60         default:
61             break;
62     }
63 
64     ParserObjectBase *child = object->objectBase.child;
65     uint32_t subSize = 0;
66     while (child != NULL) {
67         subSize += child->size;
68         child = child->next;
69     }
70 
71     object->objectBase.size += subSize + size;
72     object->objectBase.subSize = subSize;
73 }