VirtualBox

source: vbox/trunk/src/bldprogs/scm.h@ 95000

Last change on this file since 95000 was 94905, checked in by vboxsync, 3 years ago

scm: Introduce a check to force the use of either hrc for COM status codes or vrc for IPRT ones instead of using rc for both causing confusion when to use which, bugref:10223

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.1 KB
Line 
1/* $Id: scm.h 94905 2022-05-07 16:10:49Z vboxsync $ */
2/** @file
3 * IPRT Testcase / Tool - Source Code Massager.
4 */
5
6/*
7 * Copyright (C) 2010-2022 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef VBOX_INCLUDED_SRC_bldprogs_scm_h
19#define VBOX_INCLUDED_SRC_bldprogs_scm_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24#include "scmstream.h"
25
26RT_C_DECLS_BEGIN
27
28/** Pointer to the rewriter state. */
29typedef struct SCMRWSTATE *PSCMRWSTATE;
30/** Pointer to const massager settings. */
31typedef struct SCMSETTINGSBASE const *PCSCMSETTINGSBASE;
32
33
34/** @name Subversion Access
35 * @{ */
36
37/**
38 * SVN property.
39 */
40typedef struct SCMSVNPROP
41{
42 /** The property. */
43 char *pszName;
44 /** The value.
45 * When used to record updates, this can be set to NULL to trigger the
46 * deletion of the property. */
47 char *pszValue;
48} SCMSVNPROP;
49/** Pointer to a SVN property. */
50typedef SCMSVNPROP *PSCMSVNPROP;
51/** Pointer to a const SVN property. */
52typedef SCMSVNPROP const *PCSCMSVNPROP;
53
54
55void ScmSvnInit(void);
56void ScmSvnTerm(void);
57bool ScmSvnIsDirInWorkingCopy(const char *pszDir);
58bool ScmSvnIsInWorkingCopy(PSCMRWSTATE pState);
59int ScmSvnQueryProperty(PSCMRWSTATE pState, const char *pszName, char **ppszValue);
60int ScmSvnQueryParentProperty(PSCMRWSTATE pState, const char *pszName, char **ppszValue);
61int ScmSvnSetProperty(PSCMRWSTATE pState, const char *pszName, const char *pszValue);
62int ScmSvnDelProperty(PSCMRWSTATE pState, const char *pszName);
63int ScmSvnDisplayChanges(PSCMRWSTATE pState);
64int ScmSvnApplyChanges(PSCMRWSTATE pState);
65
66/** @} */
67
68
69/** @name Code Parsing
70 * @{ */
71
72/**
73 * Comment style.
74 */
75typedef enum SCMCOMMENTSTYLE
76{
77 kScmCommentStyle_Invalid = 0,
78 kScmCommentStyle_C,
79 kScmCommentStyle_Hash,
80 kScmCommentStyle_Python, /**< Same as hash, except for copyright/license. */
81 kScmCommentStyle_Semicolon,
82 kScmCommentStyle_Rem_Upper,
83 kScmCommentStyle_Rem_Lower,
84 kScmCommentStyle_Rem_Camel,
85 kScmCommentStyle_Sql,
86 kScmCommentStyle_Tick,
87 kScmCommentStyle_End
88} SCMCOMMENTSTYLE;
89
90/**
91 * Comment types.
92 */
93typedef enum SCMCOMMENTTYPE
94{
95 kScmCommentType_Invalid = 0, /**< Customary invalid zero value. */
96 kScmCommentType_Line, /**< Line comment. */
97 kScmCommentType_Line_JavaDoc, /**< Line comment, JavaDoc style. */
98 kScmCommentType_Line_JavaDoc_After, /**< Line comment, JavaDoc after-member style. */
99 kScmCommentType_Line_Qt, /**< Line comment, JavaDoc style. */
100 kScmCommentType_Line_Qt_After, /**< Line comment, JavaDoc after-member style. */
101 kScmCommentType_MultiLine, /**< Multi-line comment (e.g. ansi C). */
102 kScmCommentType_MultiLine_JavaDoc, /**< Multi-line comment, JavaDoc style. */
103 kScmCommentType_MultiLine_JavaDoc_After, /**< Multi-line comment, JavaDoc after-member style. */
104 kScmCommentType_MultiLine_Qt, /**< Multi-line comment, Qt style. */
105 kScmCommentType_MultiLine_Qt_After, /**< Multi-line comment, Qt after-member style. */
106 kScmCommentType_DocString, /**< Triple quoted python doc string. */
107 kScmCommentType_End /**< Customary exclusive end value. */
108} SCMCOMMENTTYPE;
109
110
111/**
112 * Comment information.
113 */
114typedef struct SCMCOMMENTINFO
115{
116 /** Comment type. */
117 SCMCOMMENTTYPE enmType;
118 /** Start line number (0-based). */
119 uint32_t iLineStart;
120 /** Start line offset (0-based). */
121 uint32_t offStart;
122 /** End line number (0-based). */
123 uint32_t iLineEnd;
124 /** End line offset (0-based). */
125 uint32_t offEnd;
126 /** Number of blank lines before the body (@a pszBody). */
127 uint32_t cBlankLinesBefore;
128 /** Number of blank lines after the body (@a pszBody + @a cchBody). */
129 uint32_t cBlankLinesAfter;
130 /** @todo add min/max indent. Raw length. Etc. */
131} SCMCOMMENTINFO;
132/** Pointer to comment info. */
133typedef SCMCOMMENTINFO *PSCMCOMMENTINFO;
134/** Pointer to const comment info. */
135typedef SCMCOMMENTINFO const *PCSCMCOMMENTINFO;
136
137
138/**
139 * Comment enumeration callback function.
140 *
141 * @returns IPRT style status code. Failures causes immediate return. While an
142 * informational status code is saved (first one) and returned later.
143 * @param pInfo Additional comment info.
144 * @param pszBody The comment body. This is somewhat stripped.
145 * @param cchBody The comment body length.
146 * @param pvUser User callback argument.
147 */
148typedef DECLCALLBACKTYPE(int, FNSCMCOMMENTENUMERATOR,(PCSCMCOMMENTINFO pInfo, const char *pszBody, size_t cchBody, void *pvUser));
149/** Poiter to a omment enumeration callback function. */
150typedef FNSCMCOMMENTENUMERATOR *PFNSCMCOMMENTENUMERATOR;
151
152int ScmEnumerateComments(PSCMSTREAM pIn, SCMCOMMENTSTYLE enmCommentStyle, PFNSCMCOMMENTENUMERATOR pfnCallback, void *pvUser);
153
154
155/**
156 * Include directive type.
157 */
158typedef enum SCMINCLUDEDIR
159{
160 kScmIncludeDir_Invalid = 0, /**< Constomary invalid enum value. */
161 kScmIncludeDir_Quoted, /**< \#include \"filename.h\" */
162 kScmIncludeDir_Bracketed, /**< \#include \<filename.h\> */
163 kScmIncludeDir_Macro, /**< \#include MACRO_H */
164 kScmIncludeDir_End /**< End of valid enum values. */
165} SCMINCLUDEDIR;
166
167SCMINCLUDEDIR ScmMaybeParseCIncludeLine(PSCMRWSTATE pState, const char *pchLine, size_t cchLine,
168 const char **ppchFilename, size_t *pcchFilename);
169
170/**
171 * Checks if the given character is a valid C identifier lead character.
172 *
173 * @returns true / false.
174 * @param ch The character to inspect.
175 * @sa vbcppIsCIdentifierLeadChar
176 */
177DECLINLINE(bool) ScmIsCIdentifierLeadChar(char ch)
178{
179 return RT_C_IS_ALPHA(ch)
180 || ch == '_';
181}
182
183
184/**
185 * Checks if the given character is a valid C identifier character.
186 *
187 * @returns true / false.
188 * @param ch The character to inspect.
189 * @sa vbcppIsCIdentifierChar
190 */
191DECLINLINE(bool) ScmIsCIdentifierChar(char ch)
192{
193 return RT_C_IS_ALNUM(ch)
194 || ch == '_';
195}
196
197
198/** @} */
199
200
201/** @name Rewriters
202 * @{ */
203
204/**
205 * Rewriter state.
206 */
207typedef struct SCMRWSTATE
208{
209 /** The filename. */
210 const char *pszFilename;
211 /** Set after the printing the first verbose message about a file under
212 * rewrite. */
213 bool fFirst;
214 /** Set if the file requires manual repair. */
215 bool fNeedsManualRepair;
216 /** Cached ScmSvnIsInWorkingCopy response. 0 indicates not known, 1 means it
217 * is in WC, -1 means it doesn't. */
218 int8_t fIsInSvnWorkingCopy;
219 /** The number of SVN property changes. */
220 size_t cSvnPropChanges;
221 /** Pointer to an array of SVN property changes. */
222 struct SCMSVNPROP *paSvnPropChanges;
223 /** For error propagation. */
224 int32_t rc;
225} SCMRWSTATE;
226
227/**
228 * A rewriter.
229 *
230 * This works like a stream editor, reading @a pIn, modifying it and writing it
231 * to @a pOut.
232 *
233 * @returns true if any changes were made, false if not.
234 * @param pIn The input stream.
235 * @param pOut The output stream.
236 * @param pSettings The settings.
237 */
238typedef bool FNSCMREWRITER(PSCMRWSTATE pState, PSCMSTREAM pIn, PSCMSTREAM pOut, PCSCMSETTINGSBASE pSettings);
239/** Pointer to a rewriter method. */
240typedef FNSCMREWRITER *PFNSCMREWRITER;
241
242FNSCMREWRITER rewrite_StripTrailingBlanks;
243FNSCMREWRITER rewrite_ExpandTabs;
244FNSCMREWRITER rewrite_ForceNativeEol;
245FNSCMREWRITER rewrite_ForceLF;
246FNSCMREWRITER rewrite_ForceCRLF;
247FNSCMREWRITER rewrite_AdjustTrailingLines;
248FNSCMREWRITER rewrite_SvnNoExecutable;
249FNSCMREWRITER rewrite_SvnNoKeywords;
250FNSCMREWRITER rewrite_SvnNoEolStyle;
251FNSCMREWRITER rewrite_SvnBinary;
252FNSCMREWRITER rewrite_SvnKeywords;
253FNSCMREWRITER rewrite_SvnSyncProcess;
254FNSCMREWRITER rewrite_UnicodeChecks;
255FNSCMREWRITER rewrite_PageChecks;
256FNSCMREWRITER rewrite_ForceHrcVrcInsteadOfRc;
257FNSCMREWRITER rewrite_Copyright_CstyleComment;
258FNSCMREWRITER rewrite_Copyright_HashComment;
259FNSCMREWRITER rewrite_Copyright_PythonComment;
260FNSCMREWRITER rewrite_Copyright_RemComment;
261FNSCMREWRITER rewrite_Copyright_SemicolonComment;
262FNSCMREWRITER rewrite_Copyright_SqlComment;
263FNSCMREWRITER rewrite_Copyright_TickComment;
264FNSCMREWRITER rewrite_Makefile_kup;
265FNSCMREWRITER rewrite_Makefile_kmk;
266FNSCMREWRITER rewrite_FixFlowerBoxMarkers;
267FNSCMREWRITER rewrite_Fix_C_and_CPP_Todos;
268FNSCMREWRITER rewrite_Fix_Err_H;
269FNSCMREWRITER rewrite_FixHeaderGuards;
270FNSCMREWRITER rewrite_C_and_CPP;
271
272/**
273 * Rewriter configuration.
274 */
275typedef struct SCMREWRITERCFG
276{
277 /** The rewriter function. */
278 PFNSCMREWRITER pfnRewriter;
279 /** The name of the rewriter. */
280 const char *pszName;
281} SCMREWRITERCFG;
282/** Pointer to a const rewriter config. */
283typedef SCMREWRITERCFG const *PCSCMREWRITERCFG;
284
285/** @} */
286
287
288/** @name Settings
289 * @{ */
290
291/**
292 * Configuration entry.
293 */
294typedef struct SCMCFGENTRY
295{
296 /** Number of rewriters. */
297 size_t cRewriters;
298 /** Pointer to an array of rewriters. */
299 PCSCMREWRITERCFG const *paRewriters;
300 /** Set if the entry handles binaries. */
301 bool fBinary;
302 /** File pattern (simple). */
303 const char *pszFilePattern;
304 /** Name (for treat as). */
305 const char *pszName;
306} SCMCFGENTRY;
307typedef SCMCFGENTRY *PSCMCFGENTRY;
308typedef SCMCFGENTRY const *PCSCMCFGENTRY;
309
310
311/** License update options. */
312typedef enum SCMLICENSE
313{
314 kScmLicense_LeaveAlone = 0, /**< Leave it alone. */
315 kScmLicense_OseGpl, /**< VBox OSE GPL if public. */
316 kScmLicense_OseDualGplCddl, /**< VBox OSE dual GPL & CDDL if public. */
317 kScmLicense_OseCddl, /**< VBox OSE CDDL if public. */
318 kScmLicense_Lgpl, /**< LGPL if public. */
319 kScmLicense_Mit, /**< MIT if public. */
320 kScmLicense_BasedOnMit, /**< Copyright us but based on someone else's MIT. */
321 kScmLicense_End
322} SCMLICENSE;
323
324/**
325 * Source Code Massager Settings.
326 */
327typedef struct SCMSETTINGSBASE
328{
329 bool fConvertEol;
330 bool fConvertTabs;
331 bool fForceFinalEol;
332 bool fForceTrailingLine;
333 bool fStripTrailingBlanks;
334 bool fStripTrailingLines;
335
336 /** Whether to fix C/C++ flower box section markers. */
337 bool fFixFlowerBoxMarkers;
338 /** The minimum number of blank lines we want before flowerbox markers. */
339 uint8_t cMinBlankLinesBeforeFlowerBoxMakers;
340
341 /** Whether to fix C/C++ header guards and \#pragma once directives. */
342 bool fFixHeaderGuards;
343 /** Whether to include a pragma once statement with the header guard. */
344 bool fPragmaOnce;
345 /** Whether to fix the \#endif part of a header guard. */
346 bool fFixHeaderGuardEndif;
347 /** Whether to add a comment on the \#endif part of the header guard. */
348 bool fEndifGuardComment;
349 /** The guard name prefix. */
350 char *pszGuardPrefix;
351 /** Header guards should be normalized using prefix and this directory.
352 * When NULL the guard identifiers found in the header is preserved. */
353 char *pszGuardRelativeToDir;
354
355 /** Whether to fix C/C++ todos. */
356 bool fFixTodos;
357 /** Whether to fix C/C++ err.h/errcore.h usage. */
358 bool fFixErrH;
359 /** No PAGE_SIZE, PAGE_SHIFT, PAGE_OFFSET_MASK allowed in C/C++, only the GUEST_
360 * or HOST_ prefixed versions. */
361 bool fOnlyGuestHostPage;
362 /** No ASMMemIsZeroPage or ASMMemZeroPage calls allowed (C/C++). */
363 bool fNoASMMemPageUse;
364 /** No rc declarations allowed, only hrc or vrc depending on the result type. */
365 bool fOnlyHrcVrcInsteadOfRc;
366
367 /** Update the copyright year. */
368 bool fUpdateCopyrightYear;
369 /** Only external copyright holders. */
370 bool fExternalCopyright;
371 /** Whether there should be a LGPL disclaimer. */
372 bool fLgplDisclaimer;
373 /** How to update the license. */
374 SCMLICENSE enmUpdateLicense;
375
376 /** Only process files that are part of a SVN working copy. */
377 bool fOnlySvnFiles;
378 /** Only recurse into directories containing an .svn dir. */
379 bool fOnlySvnDirs;
380 /** Set svn:eol-style if missing or incorrect. */
381 bool fSetSvnEol;
382 /** Set svn:executable according to type (unusually this means deleting it). */
383 bool fSetSvnExecutable;
384 /** Set svn:keyword if completely or partially missing. */
385 bool fSetSvnKeywords;
386 /** Skip checking svn:sync-process. */
387 bool fSkipSvnSyncProcess;
388 /** Skip the unicode checks. */
389 bool fSkipUnicodeChecks;
390 /** Tab size. */
391 uint8_t cchTab;
392 /** Optimal source code width. */
393 uint8_t cchWidth;
394 /** Free the treat as structure. */
395 bool fFreeTreatAs;
396 /** Prematched config entry. */
397 PCSCMCFGENTRY pTreatAs;
398 /** Only consider files matching these patterns. This is only applied to the
399 * base names. */
400 char *pszFilterFiles;
401 /** Filter out files matching the following patterns. This is applied to base
402 * names as well as the absolute paths. */
403 char *pszFilterOutFiles;
404 /** Filter out directories matching the following patterns. This is applied
405 * to base names as well as the absolute paths. All absolute paths ends with a
406 * slash and dot ("/."). */
407 char *pszFilterOutDirs;
408} SCMSETTINGSBASE;
409/** Pointer to massager settings. */
410typedef SCMSETTINGSBASE *PSCMSETTINGSBASE;
411
412/**
413 * File/dir pattern + options.
414 */
415typedef struct SCMPATRNOPTPAIR
416{
417 char *pszPattern;
418 char *pszOptions;
419 char *pszRelativeTo;
420 bool fMultiPattern;
421} SCMPATRNOPTPAIR;
422/** Pointer to a pattern + option pair. */
423typedef SCMPATRNOPTPAIR *PSCMPATRNOPTPAIR;
424
425
426/** Pointer to a settings set. */
427typedef struct SCMSETTINGS *PSCMSETTINGS;
428/**
429 * Settings set.
430 *
431 * This structure is constructed from the command line arguments or any
432 * .scm-settings file found in a directory we recurse into. When recursing in
433 * and out of a directory, we push and pop a settings set for it.
434 *
435 * The .scm-settings file has two kinds of setttings, first there are the
436 * unqualified base settings and then there are the settings which applies to a
437 * set of files or directories. The former are lines with command line options.
438 * For the latter, the options are preceded by a string pattern and a colon.
439 * The pattern specifies which files (and/or directories) the options applies
440 * to.
441 *
442 * We parse the base options into the Base member and put the others into the
443 * paPairs array.
444 */
445typedef struct SCMSETTINGS
446{
447 /** Pointer to the setting file below us in the stack. */
448 PSCMSETTINGS pDown;
449 /** Pointer to the setting file above us in the stack. */
450 PSCMSETTINGS pUp;
451 /** File/dir patterns and their options. */
452 PSCMPATRNOPTPAIR paPairs;
453 /** The number of entires in paPairs. */
454 uint32_t cPairs;
455 /** The base settings that was read out of the file. */
456 SCMSETTINGSBASE Base;
457} SCMSETTINGS;
458/** Pointer to a const settings set. */
459typedef SCMSETTINGS const *PCSCMSETTINGS;
460
461/** @} */
462
463
464void ScmVerboseBanner(PSCMRWSTATE pState, int iLevel);
465void ScmVerbose(PSCMRWSTATE pState, int iLevel, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);
466bool ScmError(PSCMRWSTATE pState, int rc, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(3, 4);
467bool ScmFixManually(PSCMRWSTATE pState, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(2, 3);
468
469extern const char g_szTabSpaces[16+1];
470extern const char g_szAsterisks[255+1];
471extern const char g_szSpaces[255+1];
472extern uint32_t g_uYear;
473
474RT_C_DECLS_END
475
476#endif /* !VBOX_INCLUDED_SRC_bldprogs_scm_h */
477
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