#ifndef _MAP_DOT_H
#define _MAP_DOT_H
#ifdef __cplusplus
extern "C" {
#endif
#define KW_NAME_SIZE(_size) (_size##_SIZE + 2)
#define isspace_nonl(_s) (isspace(_s) && ((_s) != '\n'))
typedef struct {
char *np_ptr;
char np_ch;
} ld_map_npatch_t;
typedef const char mf_tokdisp_t[128];
#define TKID_ATTR_B_START 1
#define TKID_ATTR_B_CONT 2
#define TKID_ATTR_START(_ver) (TKID_ATTR_B_START << (_ver * 2))
#define TKID_ATTR_CONT(_ver) (TKID_ATTR_B_CONT << (_ver * 2))
#define TKID_ATTR(_ver) ((TKID_ATTR_B_START | TKID_ATTR_B_CONT) << (_ver * 2))
typedef struct {
Ofl_desc *mf_ofl;
char *mf_name;
Ifl_desc *mf_ifl;
char *mf_text;
char *mf_next;
const char *mf_tokdisp;
Lineno mf_lineno;
int mf_version;
int mf_tkid_start;
int mf_tkid_cont;
int mf_next_ch;
Aliste mf_ec_insndx;
} Mapfile;
#define mf_fatal0(_mf, _fmt) \
ld_eprintf((_mf)->mf_ofl, ERR_FATAL, _fmt, (_mf)->mf_name, \
EC_LINENO((_mf)->mf_lineno))
#define mf_fatal(_mf, _fmt, ...) \
ld_eprintf((_mf)->mf_ofl, ERR_FATAL, _fmt, (_mf)->mf_name, \
EC_LINENO((_mf)->mf_lineno), __VA_ARGS__)
#define mf_warn0(_mf, _fmt) \
ld_eprintf((_mf)->mf_ofl, ERR_WARNING, _fmt, (_mf)->mf_name, \
EC_LINENO((_mf)->mf_lineno))
#define mf_warn(_mf, _fmt, ...) \
ld_eprintf((_mf)->mf_ofl, ERR_WARNING, _fmt, (_mf)->mf_name, \
EC_LINENO((_mf)->mf_lineno), __VA_ARGS__)
typedef enum {
TK_ERROR = -1,
TK_EOF = 0,
TK_STRING = 1,
TK_COLON = 2,
TK_SEMICOLON = 3,
TK_EQUAL = 4,
TK_PLUSEQ = 5,
TK_MINUSEQ = 6,
TK_ATSIGN = 7,
TK_DASH = 8,
TK_LEFTBKT = 9,
TK_RIGHTBKT = 10,
TK_PIPE = 11,
TK_INT = 12,
TK_STAR = 13,
TK_BANG = 14,
TK_LEFTSQR = 15,
TK_RIGHTSQR = 16,
TK_OP_EOF,
TK_OP_ILLCHR,
TK_OP_BADCHR,
TK_OP_WS,
TK_OP_NL,
TK_OP_SIMQUOTE,
TK_OP_CQUOTE,
TK_OP_CMT,
TK_OP_CDIR,
TK_OP_NUM,
TK_OP_ID,
TK_OP_CEQUAL,
} Token;
typedef union {
char *tkv_str;
struct {
char *tkvi_str;
size_t tkvi_cnt;
Xword tkvi_value;
} tkv_int;
} ld_map_tkval_t;
#define TK_F_EOFOK 0x1
#define TK_F_STRLC 0x2
#define TK_F_KEYWORD 0x4
#define TK_F_MULOK 0x8
typedef enum {
STRTOXWORD_OK,
STRTOXWORD_TOOBIG,
STRTOXWORD_BAD
} ld_map_strtoxword_t;
typedef enum {
SEG_INS_OK = 0,
SEG_INS_FAIL = 1,
SEG_INS_SKIP = 2
} ld_map_seg_ins_t;
typedef enum {
FLG_SCOPE_HIDD,
FLG_SCOPE_DFLT,
FLG_SCOPE_PROT,
FLG_SCOPE_EXPT,
FLG_SCOPE_SNGL,
FLG_SCOPE_ELIM
} ld_map_scope_t;
typedef struct {
const char *mv_name;
Ver_desc *mv_vdp;
ld_map_scope_t mv_scope;
size_t mv_errcnt;
} ld_map_ver_t;
typedef struct {
const char *ms_name;
sd_flag_t ms_sdflags;
Word ms_shndx;
uchar_t ms_type;
Addr ms_value;
Addr ms_size;
Boolean ms_size_set;
const char *ms_filtee;
Boolean ms_value_set;
Word ms_dft_flag;
} ld_map_sym_t;
#if defined(_ELF64)
#define ld_map_cap_sanitize ld64_map_cap_sanitize
#define ld_map_cap_set_ovflag ld64_map_cap_set_ovflag
#define ld_map_dv ld64_map_dv
#define ld_map_dv_entry ld64_map_dv_entry
#define ld_map_gettoken ld64_map_gettoken
#define ld_map_ifl ld64_map_ifl
#define ld_map_parse_v1 ld64_map_parse_v1
#define ld_map_parse_v2 ld64_map_parse_v2
#define ld_map_peektoken ld64_map_peektoken
#define ld_map_seg_alloc ld64_map_seg_alloc
#define ld_map_seg_ent_add ld64_map_seg_ent_add
#define ld_map_seg_ent_files ld64_map_seg_ent_files
#define ld_map_seg_index ld64_map_seg_index
#define ld_map_seg_insert ld64_map_seg_insert
#define ld_map_seg_lookup ld64_map_seg_lookup
#define ld_map_seg_os_order_add ld64_map_seg_os_order_add
#define ld_map_seg_size_symbol ld64_map_seg_size_symbol
#define ld_map_seg_stack ld64_map_seg_stack
#define ld_map_strtoxword ld64_map_strtoxword
#define ld_map_sym_enter ld64_map_sym_enter
#define ld_map_sym_filtee ld64_map_sym_filtee
#define ld_map_sym_scope ld64_map_sym_scope
#define ld_map_sym_autoreduce ld64_map_sym_autoreduce
#define ld_map_sym_ver_fini ld64_map_sym_ver_fini
#define ld_map_sym_ver_init ld64_map_sym_ver_init
#define ld_map_tokenstr ld64_map_tokenstr
#else
#define ld_map_cap_sanitize ld32_map_cap_sanitize
#define ld_map_cap_set_ovflag ld32_map_cap_set_ovflag
#define ld_map_dv ld32_map_dv
#define ld_map_dv_entry ld32_map_dv_entry
#define ld_map_gettoken ld32_map_gettoken
#define ld_map_ifl ld32_map_ifl
#define ld_map_parse_v1 ld32_map_parse_v1
#define ld_map_parse_v2 ld32_map_parse_v2
#define ld_map_peektoken ld32_map_peektoken
#define ld_map_seg_alloc ld32_map_seg_alloc
#define ld_map_seg_ent_add ld32_map_seg_ent_add
#define ld_map_seg_ent_files ld32_map_seg_ent_files
#define ld_map_seg_index ld32_map_seg_index
#define ld_map_seg_insert ld32_map_seg_insert
#define ld_map_seg_lookup ld32_map_seg_lookup
#define ld_map_seg_os_order_add ld32_map_seg_os_order_add
#define ld_map_seg_size_symbol ld32_map_seg_size_symbol
#define ld_map_seg_stack ld32_map_seg_stack
#define ld_map_strtoxword ld32_map_strtoxword
#define ld_map_sym_enter ld32_map_sym_enter
#define ld_map_sym_filtee ld32_map_sym_filtee
#define ld_map_sym_scope ld32_map_sym_scope
#define ld_map_sym_autoreduce ld32_map_sym_autoreduce
#define ld_map_sym_ver_fini ld32_map_sym_ver_fini
#define ld_map_sym_ver_init ld32_map_sym_ver_init
#define ld_map_tokenstr ld32_map_tokenstr
#endif
extern void ld_map_lowercase(char *);
extern Token ld_map_gettoken(Mapfile *, int, ld_map_tkval_t *);
extern Token ld_map_peektoken(Mapfile *);
extern Boolean ld_map_parse_v1(Mapfile *);
extern Boolean ld_map_parse_v2(Mapfile *);
extern ld_map_strtoxword_t ld_map_strtoxword(const char *restrict,
char **restrict, Xword *);
extern const char *ld_map_tokenstr(Token, ld_map_tkval_t *,
Conv_inv_buf_t *);
extern Boolean ld_map_cap_sanitize(Mapfile *, Word, Capmask *);
extern void ld_map_cap_set_ovflag(Mapfile *, Word);
extern void *ld_map_kwfind(const char *, void *, size_t, size_t);
extern char *ld_map_kwnames(void *, size_t, size_t, char *, size_t);
extern Sdf_desc *ld_map_dv(Mapfile *, const char *);
extern Boolean ld_map_dv_entry(Mapfile *, Sdf_desc *, Boolean,
const char *);
extern Ifl_desc *ld_map_ifl(Mapfile *);
extern Sg_desc *ld_map_seg_alloc(const char *, Word, sg_flags_t);
extern Ent_desc *ld_map_seg_ent_add(Mapfile *, Sg_desc *, const char *);
extern Boolean ld_map_seg_ent_files(Mapfile *mf, Ent_desc *,
Word, const char *);
extern Xword ld_map_seg_index(Mapfile *, Sg_desc *);
extern ld_map_seg_ins_t ld_map_seg_insert(Mapfile *, dbg_state_t, Sg_desc *,
avl_index_t where);
extern Boolean ld_map_seg_os_order_add(Mapfile *, Sg_desc *,
const char *);
extern Boolean ld_map_seg_size_symbol(Mapfile *, Sg_desc *, Token,
const char *symname);
extern Sg_desc *ld_map_seg_stack(Mapfile *);
extern Boolean ld_map_sym_enter(Mapfile *, ld_map_ver_t *,
ld_map_sym_t *, Ass_desc *);
extern void ld_map_sym_filtee(Mapfile *, ld_map_ver_t *,
ld_map_sym_t *, Word, const char *);
extern void ld_map_sym_scope(Mapfile *, const char *,
ld_map_ver_t *);
extern void ld_map_sym_autoreduce(Mapfile *, ld_map_ver_t *);
extern Boolean ld_map_sym_ver_fini(Mapfile *, ld_map_ver_t *);
extern Boolean ld_map_sym_ver_init(Mapfile *, char *, ld_map_ver_t *);
#ifdef __cplusplus
}
#endif
#endif