VirtualBox

source: vbox/trunk/include/iprt/bldprog-strtab.h@ 60547

Last change on this file since 60547 was 59728, checked in by vboxsync, 9 years ago

asn1-dump: Made it a lot less painful to add new OID to the asn.1 dumper. This generalize the string table code used for the USB database in main.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.5 KB
Line 
1/** @file
2 * IPRT - Build Program - String Table Generator, Accessors.
3 */
4
5/*
6 * Copyright (C) 2006-2016 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_bldprog_strtab_h
27#define ___iprt_bldprog_strtab_h
28
29#include <iprt/string.h>
30#include <iprt/assert.h>
31
32
33/**
34 * The default build program string table reference.
35 */
36typedef struct RTBLDPROGSTRREF
37{
38 /** Offset of the string in the string table. */
39 uint32_t off : 22;
40 /** The length of the string. */
41 uint32_t cch : 10;
42} RTBLDPROGSTRREF;
43AssertCompileSize(RTBLDPROGSTRREF, sizeof(uint32_t));
44/** Pointer to a build program string table reference. */
45typedef RTBLDPROGSTRREF const *PCRTBLDPROGSTRREF;
46
47
48typedef struct RTBLDPROGSTRTAB
49{
50 const char *pchStrTab;
51 uint32_t cchStrTab;
52 uint8_t cCompDict;
53 PCRTBLDPROGSTRREF paCompDict;
54} RTBLDPROGSTRTAB;
55typedef const RTBLDPROGSTRTAB *PCRTBLDPROGSTRTAB;
56
57
58/**
59 * Retrieves the decompressed string.
60 *
61 * @returns The string size on success, IPRT status code on failure.
62 * @param pStrTab The string table.
63 * @param offString The offset of the string.
64 * @param cchString The length of the string.
65 * @param pszDst The return buffer.
66 * @param cbDst The size of the return buffer.
67 */
68DECLINLINE(ssize_t) RTBldProgStrTabQueryString(PCRTBLDPROGSTRTAB pStrTab, uint32_t offString, size_t cchString,
69 char *pszDst, size_t cbDst)
70{
71 AssertReturn(offString < pStrTab->cchStrTab, VERR_OUT_OF_RANGE);
72 AssertReturn(offString + cchString <= pStrTab->cchStrTab, VERR_OUT_OF_RANGE);
73
74 if (pStrTab->cCompDict)
75 {
76 /*
77 * Could be compressed, decompress it.
78 */
79 const char *pchSrc = &pStrTab->pchStrTab[offString];
80 while (cchString-- > 0)
81 {
82 unsigned char uch = *pchSrc++;
83 if (!(uch & 0x80))
84 {
85 /*
86 * Plain text.
87 */
88 AssertReturn(cbDst > 1, VERR_BUFFER_OVERFLOW);
89 *pszDst++ = (char)uch;
90 Assert(uch != 0);
91 }
92 else if (uch != 0xff)
93 {
94 /*
95 * Dictionary reference. (No UTF-8 unescaping necessary here.)
96 */
97 PCRTBLDPROGSTRREF pWord = &pStrTab->paCompDict[uch & 0x7f];
98 size_t const cchWord = pWord->cch;
99 AssertReturn((size_t)pWord->off + cchWord <= pStrTab->cchStrTab, VERR_INVALID_PARAMETER);
100 AssertReturn(cbDst > cchWord, VERR_BUFFER_OVERFLOW);
101
102 memcpy(pszDst, &pStrTab->pchStrTab[pWord->off], cchWord);
103 pszDst += cchWord;
104 cbDst -= cchWord;
105 }
106 else
107 {
108 /*
109 * UTF-8 encoded unicode codepoint.
110 */
111 size_t cchCp;
112 RTUNICP uc = ' ';
113 int rc = RTStrGetCpNEx(&pchSrc, &cchString, &uc);
114 AssertStmt(RT_SUCCESS(rc), (uc = '?', pchSrc++, cchString--));
115
116 cchCp = RTStrCpSize(uc);
117 AssertReturn(cbDst > cchCp, VERR_BUFFER_OVERFLOW);
118
119 RTStrPutCp(pszDst, uc);
120 pszDst += cchCp;
121 cbDst -= cchCp;
122 }
123 }
124 AssertReturn(cbDst > 0, VERR_BUFFER_OVERFLOW);
125 *pszDst = '\0';
126 return VINF_SUCCESS;
127 }
128
129 /*
130 * Not compressed.
131 */
132 AssertReturn(cbDst > cchString, VERR_BUFFER_OVERFLOW);
133 memcpy(pszDst, &pStrTab->pchStrTab[offString], cchString);
134 pszDst[cchString] = '\0';
135 return VINF_SUCCESS;
136}
137
138
139#endif
140
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette