VirtualBox

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

Last change on this file since 78415 was 76585, checked in by vboxsync, 6 years ago

*: scm --fix-header-guard-endif

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1/** @file
2 * IPRT - Build Program - String Table Generator, Accessors.
3 */
4
5/*
6 * Copyright (C) 2006-2019 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_INCLUDED_bldprog_strtab_h
27#define IPRT_INCLUDED_bldprog_strtab_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32#include <iprt/assert.h>
33#include <iprt/err.h>
34#include <iprt/string.h>
35
36
37/**
38 * The default build program string table reference.
39 */
40typedef struct RTBLDPROGSTRREF
41{
42 /** Offset of the string in the string table. */
43 uint32_t off : 22;
44 /** The length of the string. */
45 uint32_t cch : 10;
46} RTBLDPROGSTRREF;
47AssertCompileSize(RTBLDPROGSTRREF, sizeof(uint32_t));
48/** Pointer to a build program string table reference. */
49typedef RTBLDPROGSTRREF const *PCRTBLDPROGSTRREF;
50
51
52typedef struct RTBLDPROGSTRTAB
53{
54 const char *pchStrTab;
55 uint32_t cchStrTab;
56 uint8_t cCompDict;
57 PCRTBLDPROGSTRREF paCompDict;
58} RTBLDPROGSTRTAB;
59typedef const RTBLDPROGSTRTAB *PCRTBLDPROGSTRTAB;
60
61
62/**
63 * Retrieves the decompressed string.
64 *
65 * @returns The string size on success, IPRT status code on failure.
66 * @param pStrTab The string table.
67 * @param offString The offset of the string.
68 * @param cchString The length of the string.
69 * @param pszDst The return buffer.
70 * @param cbDst The size of the return buffer.
71 */
72DECLINLINE(ssize_t) RTBldProgStrTabQueryString(PCRTBLDPROGSTRTAB pStrTab, uint32_t offString, size_t cchString,
73 char *pszDst, size_t cbDst)
74{
75 AssertReturn(offString < pStrTab->cchStrTab, VERR_OUT_OF_RANGE);
76 AssertReturn(offString + cchString <= pStrTab->cchStrTab, VERR_OUT_OF_RANGE);
77
78 if (pStrTab->cCompDict)
79 {
80 /*
81 * Could be compressed, decompress it.
82 */
83 char * const pchDstStart = pszDst;
84 const char *pchSrc = &pStrTab->pchStrTab[offString];
85 while (cchString-- > 0)
86 {
87 unsigned char uch = *pchSrc++;
88 if (!(uch & 0x80))
89 {
90 /*
91 * Plain text.
92 */
93 AssertReturn(cbDst > 1, VERR_BUFFER_OVERFLOW);
94 *pszDst++ = (char)uch;
95 Assert(uch != 0);
96 }
97 else if (uch != 0xff)
98 {
99 /*
100 * Dictionary reference. (No UTF-8 unescaping necessary here.)
101 */
102 PCRTBLDPROGSTRREF pWord = &pStrTab->paCompDict[uch & 0x7f];
103 size_t const cchWord = pWord->cch;
104 AssertReturn((size_t)pWord->off + cchWord <= pStrTab->cchStrTab, VERR_INVALID_PARAMETER);
105 AssertReturn(cbDst > cchWord, VERR_BUFFER_OVERFLOW);
106
107 memcpy(pszDst, &pStrTab->pchStrTab[pWord->off], cchWord);
108 pszDst += cchWord;
109 cbDst -= cchWord;
110 }
111 else
112 {
113 /*
114 * UTF-8 encoded unicode codepoint.
115 */
116 size_t cchCp;
117 RTUNICP uc = ' ';
118 int rc = RTStrGetCpNEx(&pchSrc, &cchString, &uc);
119 AssertStmt(RT_SUCCESS(rc), (uc = '?', pchSrc++, cchString--));
120
121 cchCp = RTStrCpSize(uc);
122 AssertReturn(cbDst > cchCp, VERR_BUFFER_OVERFLOW);
123
124 RTStrPutCp(pszDst, uc);
125 pszDst += cchCp;
126 cbDst -= cchCp;
127 }
128 }
129 AssertReturn(cbDst > 0, VERR_BUFFER_OVERFLOW);
130 *pszDst = '\0';
131 return pszDst - pchDstStart;
132 }
133
134 /*
135 * Not compressed.
136 */
137 AssertReturn(cbDst > cchString, VERR_BUFFER_OVERFLOW);
138 memcpy(pszDst, &pStrTab->pchStrTab[offString], cchString);
139 pszDst[cchString] = '\0';
140 return (ssize_t)cchString;
141}
142
143
144#endif /* !IPRT_INCLUDED_bldprog_strtab_h */
145
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