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 }