⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grammar.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* if not found - return the default value */    return reg->data;}/*    emit type typedef*/typedef enum emit_type_{    et_byte,            /* explicit number */    et_stream,          /* eaten character */    et_position         /* current position */} emit_type;/*    emit destination typedef*/typedef enum emit_dest_{    ed_output,          /* write to the output buffer */    ed_regbyte          /* write a particular regbyte */} emit_dest;/*    emit typedef*/typedef struct emit_{    emit_dest m_emit_dest;    emit_type m_emit_type;      /* ed_output */    byte m_byte;                /* et_byte */    map_byte *m_regbyte;        /* ed_regbyte */    byte *m_regname;            /* ed_regbyte - temporary */    struct emit_ *m_next;} emit;static void emit_create (emit **em){    *em = (emit *) mem_alloc (sizeof (emit));    if (*em)    {        (**em).m_emit_dest = ed_output;        (**em).m_emit_type = et_byte;        (**em).m_byte = '\0';        (**em).m_regbyte = NULL;        (**em).m_regname = NULL;        (**em).m_next = NULL;    }}static void emit_destroy (emit **em){    if (*em)    {        emit_destroy (&(**em).m_next);        mem_free ((void **) &(**em).m_regname);        mem_free ((void **) em);    }}static unsigned int emit_size (emit *_E){    unsigned int n = 0;    while (_E != NULL)    {        if (_E->m_emit_dest == ed_output)        {            if (_E->m_emit_type == et_position)                n += 4;     /* position is a 32-bit unsigned integer */            else                n++;        }        _E = _E->m_next;    }    return n;}static int emit_push (emit *_E, byte *_P, byte c, unsigned int _Pos, regbyte_ctx **_Ctx){    while (_E != NULL)    {        if (_E->m_emit_dest == ed_output)        {            if (_E->m_emit_type == et_byte)                *_P++ = _E->m_byte;            else if (_E->m_emit_type == et_stream)                *_P++ = c;            else /* _Em->type == et_position */            {                *_P++ = (byte) (_Pos);                *_P++ = (byte) (_Pos >> 8);                *_P++ = (byte) (_Pos >> 16);                *_P++ = (byte) (_Pos >> 24);            }        }        else        {            regbyte_ctx *new_rbc;            regbyte_ctx_create (&new_rbc);            if (new_rbc == NULL)                return 1;            new_rbc->m_prev = *_Ctx;            new_rbc->m_regbyte = _E->m_regbyte;            *_Ctx = new_rbc;            if (_E->m_emit_type == et_byte)                new_rbc->m_current_value = _E->m_byte;            else if (_E->m_emit_type == et_stream)                new_rbc->m_current_value = c;        }        _E = _E->m_next;    }    return 0;}/*    error typedef*/typedef struct error_{    byte *m_text;    byte *m_token_name;    struct rule_ *m_token;} error;static void error_create (error **er){    *er = (error *) mem_alloc (sizeof (error));    if (*er)    {        (**er).m_text = NULL;        (**er).m_token_name = NULL;        (**er).m_token = NULL;    }}static void error_destroy (error **er){    if (*er)    {        mem_free ((void **) &(**er).m_text);        mem_free ((void **) &(**er).m_token_name);        mem_free ((void **) er);    }}struct dict_;static byte *error_get_token (error *, struct dict_ *, const byte *, int);/*    condition operand type typedef*/typedef enum cond_oper_type_{    cot_byte,               /* constant 8-bit unsigned integer */    cot_regbyte             /* pointer to byte register containing the current value */} cond_oper_type;/*    condition operand typedef*/typedef struct cond_oper_{    cond_oper_type m_type;    byte m_byte;            /* cot_byte */    map_byte *m_regbyte;    /* cot_regbyte */    byte *m_regname;        /* cot_regbyte - temporary */} cond_oper;/*    condition type typedef*/typedef enum cond_type_{    ct_equal,    ct_not_equal} cond_type;/*    condition typedef*/typedef struct cond_{    cond_type m_type;    cond_oper m_operands[2];} cond;static void cond_create (cond **co){    *co = (cond *) mem_alloc (sizeof (cond));    if (*co)    {        (**co).m_operands[0].m_regname = NULL;        (**co).m_operands[1].m_regname = NULL;    }}static void cond_destroy (cond **co){    if (*co)    {        mem_free ((void **) &(**co).m_operands[0].m_regname);        mem_free ((void **) &(**co).m_operands[1].m_regname);        mem_free ((void **) co);    }}/*    specifier type typedef*/typedef enum spec_type_{    st_false,    st_true,    st_byte,    st_byte_range,    st_string,    st_identifier,    st_identifier_loop,    st_debug} spec_type;/*    specifier typedef*/typedef struct spec_{    spec_type m_spec_type;    byte m_byte[2];                 /* st_byte, st_byte_range */    byte *m_string;                 /* st_string */    struct rule_ *m_rule;           /* st_identifier, st_identifier_loop */    emit *m_emits;    error *m_errtext;    cond *m_cond;    struct spec_ *next;} spec;static void spec_create (spec **sp){    *sp = (spec *) mem_alloc (sizeof (spec));    if (*sp)    {        (**sp).m_spec_type = st_false;        (**sp).m_byte[0] = '\0';        (**sp).m_byte[1] = '\0';        (**sp).m_string = NULL;        (**sp).m_rule = NULL;        (**sp).m_emits = NULL;        (**sp).m_errtext = NULL;        (**sp).m_cond = NULL;        (**sp).next = NULL;    }}static void spec_destroy (spec **sp){    if (*sp)    {        spec_destroy (&(**sp).next);        emit_destroy (&(**sp).m_emits);        error_destroy (&(**sp).m_errtext);        mem_free ((void **) &(**sp).m_string);        cond_destroy (&(**sp).m_cond);        mem_free ((void **) sp);    }}GRAMMAR_IMPLEMENT_LIST_APPEND(spec)/*    operator typedef*/typedef enum oper_{    op_none,    op_and,    op_or} oper;/*    rule typedef*/typedef struct rule_{    oper m_oper;    spec *m_specs;    struct rule_ *next;    int m_referenced;} rule;static void rule_create (rule **ru){    *ru = (rule *) mem_alloc (sizeof (rule));    if (*ru)    {        (**ru).m_oper = op_none;        (**ru).m_specs = NULL;        (**ru).next = NULL;        (**ru).m_referenced = 0;    }}static void rule_destroy (rule **ru){    if (*ru)    {        rule_destroy (&(**ru).next);        spec_destroy (&(**ru).m_specs);        mem_free ((void **) ru);    }}GRAMMAR_IMPLEMENT_LIST_APPEND(rule)/*    returns unique grammar id*/static grammar next_valid_grammar_id (void){    static grammar id = 0;    return ++id;}/*    dictionary typedef*/typedef struct dict_{    rule *m_rulez;    rule *m_syntax;    rule *m_string;    map_byte *m_regbytes;    grammar m_id;    struct dict_ *next;} dict;static void dict_create (dict **di){    *di = (dict *) mem_alloc (sizeof (dict));    if (*di)    {        (**di).m_rulez = NULL;        (**di).m_syntax = NULL;        (**di).m_string = NULL;        (**di).m_regbytes = NULL;        (**di).m_id = next_valid_grammar_id ();        (**di).next = NULL;    }}static void dict_destroy (dict **di){    if (*di)    {        rule_destroy (&(**di).m_rulez);        map_byte_destroy (&(**di).m_regbytes);        mem_free ((void **) di);    }}GRAMMAR_IMPLEMENT_LIST_APPEND(dict)static void dict_find (dict **di, grammar key, dict **data){    while (*di)    {        if ((**di).m_id == key)        {            *data = *di;            return;        }        di = &(**di).next;    }    *data = NULL;}static dict *g_dicts = NULL;/*    byte array typedef*/typedef struct barray_{    byte *data;    unsigned int len;} barray;static void barray_create (barray **ba){    *ba = (barray *) mem_alloc (sizeof (barray));    if (*ba)    {        (**ba).data = NULL;        (**ba).len = 0;    }}static void barray_destroy (barray **ba){    if (*ba)    {        mem_free ((void **) &(**ba).data);        mem_free ((void **) ba);    }}/*    reallocates byte array to requested size,    returns 0 on success,    returns 1 otherwise*/static int barray_resize (barray **ba, unsigned int nlen){    byte *new_pointer;    if (nlen == 0)    {        mem_free ((void **) &(**ba).data);        (**ba).data = NULL;        (**ba).len = 0;        return 0;    }    else    {        new_pointer = (byte *) mem_realloc ((**ba).data, (**ba).len * sizeof (byte),            nlen * sizeof (byte));        if (new_pointer)        {            (**ba).data = new_pointer;            (**ba).len = nlen;            return 0;        }    }    return 1;}/*    adds byte array pointed by *nb to the end of array pointed by *ba,    returns 0 on success,    returns 1 otherwise*/static int barray_append (barray **ba, barray **nb){    const unsigned int len = (**ba).len;    if (barray_resize (ba, (**ba).len + (**nb).len))        return 1;    mem_copy ((**ba).data + len, (**nb).data, (**nb).len);    return 0;}/*    adds emit chain pointed by em to the end of array pointed by *ba,    returns 0 on success,    returns 1 otherwise*/static int barray_push (barray **ba, emit *em, byte c, unsigned int pos, regbyte_ctx **rbc){    unsigned int count = emit_size (em);    if (barray_resize (ba, (**ba).len + count))        return 1;    return emit_push (em, (**ba).data + ((**ba).len - count), c, pos, rbc);}/*    byte pool typedef*/typedef struct bytepool_{    byte *_F;    unsigned int _Siz;} bytepool;static void bytepool_destroy (bytepool **by){    if (*by != NULL)    {        mem_free ((void **) &(**by)._F);        mem_free ((void **) by);    }}static void bytepool_create (bytepool **by, int len){    *by = (bytepool *) (mem_alloc (sizeof (bytepool)));    if (*by != NULL)    {        (**by)._F = (byte *) (mem_alloc (sizeof (byte) * len));        (**by)._Siz = len;        if ((**by)._F == NULL)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -