1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verification-time map of data section items
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _LIBDEX_DEXDATAMAP
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _LIBDEX_DEXDATAMAP
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "DexFile.h"
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct DexDataMap {
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 count;    /* number of items currently in the map */
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 max;      /* maximum number of items that may be held */
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4* offsets; /* array of item offsets */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2* types;   /* corresponding array of item types */
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} DexDataMap;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate and initialize a DexDataMap. Returns NULL on failure.
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDexDataMap* dexDataMapAlloc(u4 maxCount);
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a DexDataMap.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexDataMapFree(DexDataMap* map);
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Add a new element to the map. The offset must be greater than the
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * all previously added offsets.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexDataMapAdd(DexDataMap* map, u4 offset, u2 type);
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the type associated with the given offset. This returns -1 if
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * there is no entry for the given offset.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dexDataMapGet(DexDataMap* map, u4 offset);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Verify that there is an entry in the map, mapping the given offset to
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the given type. This will return true if such an entry exists and
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return false as well as log an error if not.
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dexDataMapVerify(DexDataMap* map, u4 offset, u2 type);
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Like dexDataMapVerify(), but also accept a 0 offset as valid.
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE bool dexDataMapVerify0Ok(DexDataMap* map, u4 offset, u2 type) {
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (offset == 0) {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return true;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexDataMapVerify(map, offset, type);
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_LIBDEX_DEXDATAMAP*/
74