/* tree_types.h - types for the parse tree that are used in many places */
#ifndef TREE_TYPES_H
#define TREE_TYPES_H
/* Copyright 2010-2023 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
#include
#include
#include "command_ids.h"
#include "element_types.h"
#include "text.h"
enum extra_type {
extra_element,
extra_element_oot,
extra_contents,
extra_text,
extra_misc_args,
extra_string,
extra_integer,
extra_deleted
};
/* the *_none enums are not necessarily used, they may also
be there to avoid using 0, for a code easier to debug */
#define SM_TYPES_LIST \
sm_type(none) \
sm_type(include) \
sm_type(setfilename) \
sm_type(delcomment) \
sm_type(defline_continuation) \
sm_type(macro_expansion) \
sm_type(linemacro_expansion) \
sm_type(value_expansion) \
sm_type(ignored_conditional_block) \
sm_type(expanded_conditional_command) \
enum source_mark_type {
#define sm_type(name) SM_type_ ## name,
SM_TYPES_LIST
#undef sm_type
};
enum source_mark_status {
SM_status_none,
SM_status_start,
SM_status_end,
};
typedef struct KEY_PAIR {
char *key;
enum extra_type type;
intptr_t value;
} KEY_PAIR;
typedef struct ELEMENT_LIST {
struct ELEMENT **list;
size_t number;
size_t space;
} ELEMENT_LIST;
typedef struct SOURCE_INFO {
int line_nr;
char *file_name;
char *macro;
} SOURCE_INFO;
typedef struct ASSOCIATED_INFO {
KEY_PAIR *info;
size_t info_number;
size_t info_space;
} ASSOCIATED_INFO;
typedef struct SOURCE_MARK {
enum source_mark_type type;
enum source_mark_status status;
size_t position;
int counter;
struct ELEMENT *element; /* needed for elements removed
from the tree */
char *line; /* used when the information is not available as
an element, for DEL comments, for instance */
} SOURCE_MARK;
typedef struct SOURCE_MARK_LIST {
struct SOURCE_MARK **list;
size_t number;
size_t space;
} SOURCE_MARK_LIST;
typedef struct ELEMENT {
/* Used when building Perl tree only. This should be HV *hv,
but we don't want to include the Perl headers everywhere; */
void *hv;
enum element_type type;
enum command_id cmd;
TEXT text;
ELEMENT_LIST args;
ELEMENT_LIST contents;
struct ELEMENT *parent;
SOURCE_INFO source_info;
ASSOCIATED_INFO extra_info;
ASSOCIATED_INFO info_info;
SOURCE_MARK_LIST source_mark_list;
} ELEMENT;
typedef struct IGNORED_CHARS {
int backslash;
int hyphen;
int lessthan;
int atsign;
} IGNORED_CHARS;
typedef struct {
char *index_name; /* kept with the entry as the indices may be merged */
ELEMENT *command;
} INDEX_ENTRY;
typedef struct INDEX {
char *name;
char *prefix;
int in_code;
struct INDEX *merged_in; /* Index this index is merged into, if any. */
INDEX_ENTRY *index_entries;
size_t index_number;
size_t index_space;
/********* Used when building Perl hash value ********************/
void *hv;
void *contained_hv;
} INDEX;
/* See parse_node_manual function. */
typedef struct {
ELEMENT *manual_content;
ELEMENT *node_content;
ELEMENT **out_of_tree_elements;
} NODE_SPEC_EXTRA;
typedef struct {
char *arg_type;
ELEMENT *element;
} DEF_ARG;
#endif