📄 libexo.h
字号:
/* libexo.h - EXO library interfaces (NEVER write another scanf()!) *//* SimpleScalar(TM) Tool Suite * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. * All Rights Reserved. * * THIS IS A LEGAL DOCUMENT, BY USING SIMPLESCALAR, * YOU ARE AGREEING TO THESE TERMS AND CONDITIONS. * * No portion of this work may be used by any commercial entity, or for any * commercial purpose, without the prior, written permission of SimpleScalar, * LLC (info@simplescalar.com). Nonprofit and noncommercial use is permitted * as described below. * * 1. SimpleScalar is provided AS IS, with no warranty of any kind, express * or implied. The user of the program accepts full responsibility for the * application of the program and the use of any results. * * 2. Nonprofit and noncommercial use is encouraged. SimpleScalar may be * downloaded, compiled, executed, copied, and modified solely for nonprofit, * educational, noncommercial research, and noncommercial scholarship * purposes provided that this notice in its entirety accompanies all copies. * Copies of the modified software can be delivered to persons who use it * solely for nonprofit, educational, noncommercial research, and * noncommercial scholarship purposes provided that this notice in its * entirety accompanies all copies. * * 3. ALL COMMERCIAL USE, AND ALL USE BY FOR PROFIT ENTITIES, IS EXPRESSLY * PROHIBITED WITHOUT A LICENSE FROM SIMPLESCALAR, LLC (info@simplescalar.com). * * 4. No nonprofit user may place any restrictions on the use of this software, * including as modified by the user, by any other authorized user. * * 5. Noncommercial and nonprofit users may distribute copies of SimpleScalar * in compiled or executable form as set forth in Section 2, provided that * either: (A) it is accompanied by the corresponding machine-readable source * code, or (B) it is accompanied by a written offer, with no time limit, to * give anyone a machine-readable copy of the corresponding source code in * return for reimbursement of the cost of distribution. This written offer * must permit verbatim duplication by anyone, or (C) it is distributed by * someone who received only the executable form, and is accompanied by a * copy of the written offer of source code. * * 6. SimpleScalar was developed by Todd M. Austin, Ph.D. The tool suite is * currently maintained by SimpleScalar LLC (info@simplescalar.com). US Mail: * 2395 Timbercrest Court, Ann Arbor, MI 48105. * * Copyright (C) 1994-2003 by Todd M. Austin, Ph.D. and SimpleScalar, LLC. *//* * EXO(-skeletal) definitions: * * The EXO format is used to store and retrieve data structures from text * files. The following BNF definition defines the contents of an EXO file: * * <exo_file> := <exo_term> * * <exo_term> := <exo_term_list> * | INTEGER * | FLOAT * | CHAR * | STRING * * <exo_term_list> := (<exo_term_list> ',' <exo_term>) * | <exo_term> */#ifndef EXO_H#define EXO_H#include "../host.h"#include "../misc.h"#include "../machine.h"/* EXO file format versions */#define EXO_FMT_MAJOR 1#define EXO_FMT_MINOR 0/* EXO term classes, keep this in sync with EXO_CLASS_STR */enum exo_class_t { ec_integer, /* EXO int value */ ec_address, /* EXO address value */ ec_float, /* EXO FP value */ ec_char, /* EXO character value */ ec_string, /* EXO string value */ ec_list, /* EXO list */ ec_array, /* EXO array */ ec_token, /* EXO token value */ ec_blob, /* EXO blob (Binary Large OBject) */ ec_null, /* used internally */ ec_NUM};/* EXO term classes print strings */extern char *exo_class_str[ec_NUM];/* EXO token table entry */struct exo_token_t { struct exo_token_t *next; /* next element in a hash buck chain */ char *str; /* token string */ int token; /* token value */};struct exo_term_t { struct exo_term_t *next; /* next element, when in a list */ enum exo_class_t ec; /* term node class */ union { struct as_integer_t { exo_integer_t val; /* integer value */ } as_integer; struct as_address_t { exo_address_t val; /* address value */ } as_address; struct as_float_t { exo_float_t val; /* floating point value */ } as_float; struct as_char_t { char val; /* character value */ } as_char; struct as_string_t { unsigned char *str; /* string value */ } as_string; struct as_list_t { struct exo_term_t *head; /* list head pointer */ } as_list; struct as_array_t { int size; /* size of the array */ struct exo_term_t **array; /* list head pointer */ } as_array; struct as_token_t { struct exo_token_t *ent; /* token table entry */ } as_token; struct as_blob_t { int size; /* byte size of object */ unsigned char *data; /* pointer to blob data */ } as_blob; } variant;};/* short-cut accessors */#define as_integer variant.as_integer#define as_address variant.as_address#define as_float variant.as_float#define as_char variant.as_char#define as_string variant.as_string#define as_list variant.as_list#define as_array variant.as_array#define as_token variant.as_token#define as_blob variant.as_blob/* EXO array accessor, may be used as an L-value or R-value *//* EXO array accessor, may be used as an L-value or R-value */#define EXO_ARR(E,N) \ ((E)->ec != ec_array \ ? (fatal("not an array"), *(struct exo_term_t **)(NULL)) \ : ((N) >= (E)->as_array.size \ ? (fatal("array bounds error"), *(struct exo_term_t **)(NULL)) \ : (E)->as_array.array[(N)]))#define SET_EXO_ARR(E,N,V) \ ((E)->ec != ec_array \ ? (void)fatal("not an array") \ : ((N) >= (E)->as_array.size \ ? (void)fatal("array bounds error") \ : (void)((E)->as_array.array[(N)] = (V))))/* intern token TOKEN_STR */struct exo_token_t *exo_intern(char *token_str); /* string to intern *//* intern token TOKEN_STR as value TOKEN */struct exo_token_t *exo_intern_as(char *token_str, /* string to intern */ int token); /* internment value *//* * create a new EXO term, usage: * * exo_new(ec_integer, (exo_integer_t)<int>); * exo_new(ec_address, (exo_address_t)<int>); * exo_new(ec_float, (exo_float_t)<float>); * exo_new(ec_char, (int)<char>); * exo_new(ec_string, "<string>"); * exo_new(ec_list, <list_ent>..., NULL); * exo_new(ec_array, <size>, <array_ent>..., NULL); * exo_new(ec_token, "<token>"); * exo_new(ec_blob, <size>, <data_ptr>); */struct exo_term_t *exo_new(enum exo_class_t ec, ...);/* release an EXO term */voidexo_delete(struct exo_term_t *exo);/* chain two EXO lists together, FORE is attached on the end of AFT */struct exo_term_t *exo_chain(struct exo_term_t *fore, struct exo_term_t *aft);/* copy an EXO node */struct exo_term_t *exo_copy(struct exo_term_t *exo);/* deep copy an EXO structure */struct exo_term_t *exo_deepcopy(struct exo_term_t *exo);/* print an EXO term */voidexo_print(struct exo_term_t *exo, FILE *stream);/* read one EXO term from STREAM */struct exo_term_t *exo_read(FILE *stream);/* lexor components */enum lex_t { lex_integer = 256, lex_address, lex_float, lex_char, lex_string, lex_token, lex_byte, lex_eof};#endif /* EXO_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -