You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
8.4 KiB
281 lines
8.4 KiB
/**
|
|
* @file uncrustify_types.h
|
|
*
|
|
* Defines some types for the uncrustify program
|
|
*
|
|
* @author Ben Gardner
|
|
* @license GPL v2+
|
|
*/
|
|
|
|
#ifndef UNCRUSTIFY_TYPES_H_INCLUDED
|
|
#define UNCRUSTIFY_TYPES_H_INCLUDED
|
|
|
|
#include "options.h"
|
|
#include "pcf_flags.h"
|
|
#include "token_enum.h" // E_Token
|
|
#include "unc_text.h"
|
|
#include "uncrustify_limits.h"
|
|
|
|
#include <assert.h>
|
|
#include <cstddef> // to get size_t
|
|
|
|
#ifdef HAVE_UTIME_H
|
|
#include <utime.h>
|
|
#endif
|
|
|
|
|
|
/**
|
|
* abbreviations used:
|
|
* SS = star style
|
|
*/
|
|
|
|
/**
|
|
* special strings to mark a part of the input file where
|
|
* uncrustify shall not change anything
|
|
*/
|
|
#define UNCRUSTIFY_OFF_TEXT " *INDENT-OFF*"
|
|
#define UNCRUSTIFY_ON_TEXT " *INDENT-ON*"
|
|
|
|
/**
|
|
* @brief Macro to inform the compiler that a variable is intentionally
|
|
* not in use.
|
|
*
|
|
* @param [in] variableName: The unused variable.
|
|
*/
|
|
#define UNUSED(variableName) ((void)variableName)
|
|
|
|
|
|
//! Brace stage enum used in brace_cleanup
|
|
enum class E_BraceStage : unsigned int
|
|
{
|
|
NONE,
|
|
PAREN1, //! expected paren after if/catch (C++)/for/switch/synchronized/while
|
|
OP_PAREN1, //! optional paren after catch (C#)
|
|
WOD_PAREN, //! while of do parens
|
|
WOD_SEMI, //! semicolon after while of do
|
|
BRACE_DO, //! do
|
|
BRACE2, //! if/catch/else/finally/for/switch/synchronized/while
|
|
ELSE, //! expecting 'else' after 'if'
|
|
ELSEIF, //! expecting 'if' after 'else'
|
|
WHILE, //! expecting 'while' after 'do'
|
|
CATCH, //! expecting 'catch' or 'finally' after 'try'
|
|
CATCH_WHEN, //! optional 'when' after 'catch'
|
|
};
|
|
|
|
|
|
enum class char_encoding_e : unsigned int
|
|
{
|
|
e_ASCII, //! 0-127
|
|
e_BYTE, //! 0-255, not UTF-8
|
|
e_UTF8, //! utf 8 bit wide
|
|
e_UTF16_LE, //! utf 16 bit wide, little endian
|
|
e_UTF16_BE //! utf 16 bit wide, big endian
|
|
};
|
|
|
|
enum class tracking_type_e : unsigned int
|
|
{
|
|
TT_NONE,
|
|
TT_SPACE,
|
|
TT_NEWLINE,
|
|
TT_START
|
|
};
|
|
|
|
const char *get_tracking_type_e_name(tracking_type_e type);
|
|
|
|
class Chunk; //forward declaration
|
|
|
|
|
|
/**
|
|
* Sort of like the aligning stuff, but the token indent is relative to the
|
|
* indent of another chunk. This is needed, as that chunk may be aligned and
|
|
* so the indent cannot be determined in the indent code.
|
|
*/
|
|
struct IndentationData
|
|
{
|
|
Chunk *ref;
|
|
int delta;
|
|
};
|
|
|
|
|
|
struct AlignmentData
|
|
{
|
|
Chunk *next; //! Chunk::NullChunkPtr or the chunk that should be under this one
|
|
bool right_align; //! AlignStack.m_right_align
|
|
size_t star_style; //! AlignStack.m_star_style
|
|
size_t amp_style; //! AlignStack.m_amp_style
|
|
int gap; //! AlignStack.m_gap
|
|
|
|
/*
|
|
* col_adj is the amount to alter the column for the token.
|
|
* For example, a dangling '*' would be set to -1.
|
|
* A right-aligned word would be a positive value.
|
|
*/
|
|
int col_adj;
|
|
Chunk *ref;
|
|
Chunk *start;
|
|
};
|
|
|
|
|
|
// for debugging purpose only
|
|
typedef std::pair<size_t, char *> TrackNumber; // track for "trackNumber" and "rule"
|
|
typedef std::vector<TrackNumber> TrackList; // list of tracks
|
|
|
|
////! list of all programming languages Uncrustify supports
|
|
//enum lang_flag_e
|
|
//{
|
|
// LANG_C = 0x0001,
|
|
// LANG_CPP = 0x0002,
|
|
// LANG_D = 0x0004,
|
|
// LANG_CS = 0x0008, //! C# (C-Sharp)
|
|
// LANG_JAVA = 0x0010,
|
|
// LANG_OC = 0x0020, //! Objective-C
|
|
// LANG_VALA = 0x0040,
|
|
// LANG_PAWN = 0x0080,
|
|
// LANG_ECMA = 0x0100, //! ECMA Script (JavaScript)
|
|
//
|
|
// LANG_ALLC = 0x017f, /** LANG_C | LANG_CPP | LANG_D | LANG_CS |
|
|
// * LANG_JAVA | LANG_OC | LANG_VALA | LANG_ECMA */
|
|
// LANG_ALL = 0x0fff, //! applies to all languages
|
|
//
|
|
// FLAG_HDR = 0x2000, /*<< Header file for C family languages */
|
|
// FLAG_DIG = 0x4000, //! digraph/trigraph
|
|
// FLAG_PP = 0x8000, //! only appears in a preprocessor
|
|
//};
|
|
|
|
//! Pattern classes for special keywords
|
|
enum class pattern_class_e : unsigned int
|
|
{
|
|
NONE,
|
|
BRACED, /** keyword + braced statement:
|
|
* do, try, finally, body, unittest, unsafe, volatile
|
|
* add, get, remove, set */
|
|
PBRACED, /** keyword + parens + braced statement:
|
|
* if, elseif, switch, for, while, synchronized,
|
|
* using, lock, with, version, CT_D_SCOPE_IF */
|
|
OPBRACED, /** keyword + optional parens + braced statement:
|
|
* catch, version, debug */
|
|
VBRACED, /** keyword + value + braced statement:
|
|
* namespace */
|
|
PAREN, /** keyword + parens:
|
|
* while-of-do */
|
|
OPPAREN, /** keyword + optional parens:
|
|
* invariant (D lang) */
|
|
ELSE, /** Special case of pattern_class_e::BRACED for handling CT_IF
|
|
* else */
|
|
};
|
|
|
|
//! used to link language keywords with some addition information
|
|
struct chunk_tag_t
|
|
{
|
|
const char *tag; //! name of the keyword e.g. "bool"
|
|
E_Token type; //! uncrustify type assigned to that keyword
|
|
size_t lang_flags; //! programming language that uses this keyword
|
|
};
|
|
|
|
|
|
struct align_t
|
|
{
|
|
size_t col;
|
|
E_Token type;
|
|
size_t len; //! length of the token + space
|
|
Chunk *ref; // Issue #3786
|
|
};
|
|
|
|
//! holds information and data of a file
|
|
struct file_mem
|
|
{
|
|
std::vector<UINT8> raw; //! raw content of file
|
|
std::deque<int> data; //! processed content of file
|
|
bool bom;
|
|
char_encoding_e enc; //! character encoding of file ASCII, utf, etc.
|
|
#ifdef HAVE_UTIME_H
|
|
struct utimbuf utb;
|
|
#endif
|
|
};
|
|
|
|
enum class unc_stage_e : unsigned int
|
|
{
|
|
TOKENIZE,
|
|
HEADER,
|
|
TOKENIZE_CLEANUP,
|
|
BRACE_CLEANUP,
|
|
FIX_SYMBOLS,
|
|
MARK_COMMENTS,
|
|
COMBINE_LABELS,
|
|
OTHER,
|
|
CLEANUP
|
|
};
|
|
|
|
struct cp_data_t
|
|
{
|
|
std::deque<UINT8> *bout;
|
|
FILE *fout;
|
|
int last_char;
|
|
bool do_check;
|
|
unc_stage_e unc_stage;
|
|
int check_fail_cnt; //! total failure count
|
|
bool if_changed;
|
|
|
|
std::string filename;
|
|
|
|
file_mem file_hdr; // for cmt_insert_file_header
|
|
file_mem file_ftr; // for cmt_insert_file_footer
|
|
file_mem func_hdr; // for cmt_insert_func_header
|
|
file_mem oc_msg_hdr; // for cmt_insert_oc_msg_header
|
|
file_mem class_hdr; // for cmt_insert_class_header
|
|
file_mem reflow_fold_regex; // for cmt_reflow_fold_regex_file
|
|
|
|
size_t lang_flags; //! defines the language of the source input
|
|
bool lang_forced; //! overwrites automatic language detection
|
|
|
|
bool unc_off;
|
|
bool unc_off_used; //! true if the `disable_processing_cmt` option was actively used in the processed file
|
|
UINT32 line_number;
|
|
size_t column; //! column for parsing
|
|
UINT16 spaces; //! space count on output
|
|
|
|
int ifdef_over_whole_file;
|
|
|
|
bool frag; //! activates code fragment option
|
|
UINT32 frag_cols;
|
|
|
|
// stuff to auto-detect line endings
|
|
UINT32 le_counts[uncrustify::line_end_styles];
|
|
UncText newline;
|
|
|
|
bool did_newline; //! flag indicates if a newline was added or converted
|
|
E_Token in_preproc;
|
|
int preproc_ncnl_count;
|
|
bool output_trailspace;
|
|
bool output_tab_as_space;
|
|
|
|
bool bom;
|
|
char_encoding_e enc;
|
|
|
|
// bumped up when a line is split or indented
|
|
int changes;
|
|
int pass_count; //! indicates how often the chunk list shall be processed
|
|
|
|
align_t al[uncrustify::limits::AL_SIZE];
|
|
size_t al_cnt;
|
|
bool al_c99_array;
|
|
|
|
bool warned_unable_string_replace_tab_chars;
|
|
|
|
int pp_level; // TODO: can this ever be -1?
|
|
|
|
const char *phase_name;
|
|
const char *dumped_file;
|
|
// for debugging purpose only
|
|
tracking_type_e html_type = tracking_type_e::TT_NONE;
|
|
const char *html_file = nullptr;
|
|
};
|
|
|
|
extern cp_data_t cpd; // TODO: can we avoid this external variable?
|
|
|
|
const char *get_brace_stage_name(E_BraceStage brace_stage);
|
|
|
|
const char *get_unc_stage_name(unc_stage_e unc_stage);
|
|
|
|
#endif /* UNCRUSTIFY_TYPES_H_INCLUDED */
|