ddltable.c

来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 2,236 行 · 第 1/5 页

C
2,236
字号
CONST_INFO *find_const(DB_TCHAR *name, short *value){    CONST_INFO *p = const_list;    while (p)    {        if (vtstrcmp(p->const_name, name) == 0)        {            *value = p->value;            return (p);        }        p = p->next_const;    }    return (NULL);}/* Add a structure element to the element list*/int add_elem(DB_TCHAR *name, char key, TYPE_INFO *ti, short *dims, CONST_INFO **ci){    ELEM_INFO *p = ddlp_g.elem_list;    unsigned short i, j;    if (ddlp_g.s_flag)        vtstrlwr(name);    while (p)    {        if (vtstrcmp(p->field_name, name) == 0)            return (0);        p = p->next_elem;    }    if ((p = (ELEM_INFO *) psp_cGetMemory(sizeof(ELEM_INFO), 0)) == NULL)    {        ddlp_abort(DB_TEXT("out of memory"));        return (0);    }    if (ddlp_g.elem_last == NULL)        ddlp_g.elem_list = p;    else        ddlp_g.elem_last->next_elem = p;    ddlp_g.elem_last = p;    p->next_elem = NULL;    vtstrcpy(p->field_name, name);    p->field_type = ti;    p->use_count = 0;    p->key = key;    for (i = 0; ti && (i < MAXDIMS) && ti->dims[i]; i++)        p->dims[i] = ti->dims[i];    for (j = 0; i < MAXDIMS; i++, j++)    {        p->dims[i] = dims[j];        p->dim_const[i] = ci[j];    }    return (1);}static void free_elems(ELEM_INFO *elem){    ELEM_INFO *p = elem, *q;    while (p)    {        q = p->next_elem;        psp_freeMemory(p, 0);        p = q;    }}/* Add fields for a predefined structure*/void add_struct_fields(DB_TCHAR *rec_name, int line_num, ELEM_INFO *elem){    int i;    while (elem)    {        ddlp_g.fd_entry.fd_len = elem->field_type->type_size;        ddlp_g.fd_entry.fd_type = elem->field_type->type_char;        ddlp_g.fd_entry.fd_flags = (short) (elem->field_type->type_sign ? UNSIGNEDFLD : 0);        ddlp_g.fd_entry.fd_key = elem->key;        for (i = 0; i < MAXDIMS; i++)        {            ddlp_g.fd_entry.fd_dim[i] = elem->dims[i];            if (ddlp_g.fd_entry.fd_dim[i])                ddlp_g.fd_entry.fd_len *= ddlp_g.fd_entry.fd_dim[i];        }        add_field(rec_name, elem->field_name, line_num, elem->dim_const,                elem->field_type, NULL);        elem = elem->next_elem;    }}/* Find file associated with specified record or field name*/static struct file_info *find_file(DB_TCHAR *rname, DB_TCHAR *name, short *fno){    struct file_info *p;    ID_INFO *q;    for (*fno = 0, p = ddlp_g.file_list; p; p = p->next_file, ++(*fno))    {        for (q = p->name_list; q; q = q->next_id)        {            if (vtstrcmp(name, q->id_name) == 0)            {                if (rname)                {                    if (vtstrcmp(rname, q->id_rec) == 0)                    {                        /* match */                        return (p);                    }                    else if (vtstrlen(q->id_rec) == 0)                    {                        /* be ready to check for future match */                        vtstrcpy(q->id_rec, rname);                        return (p);                    }                }                else                {                    return (p);                }            }        }    }    return (NULL);}/* Find record name in record list*/struct record_info *find_rec(DB_TCHAR *rname, short *rno){    struct record_info *p;    for (*rno = 0, p = ddlp_g.rec_list; p; p = p->next_rec, ++(*rno))    {        if (vtstrcmp(rname, p->rec_name) == 0)            break;    }    return (p);}/* Find field name in field list*/static struct field_info *find_fld(DB_TCHAR *rname, DB_TCHAR *fname, short *fno){    struct field_info *p;    short rno;    if (rname)    {        if (find_rec(rname, &rno) == NULL)            return (struct field_info *) NULL;    }    else    {        rno = -1;    }    for (*fno = 0, p = ddlp_g.field_list; p; p = p->next_field, ++(*fno))    {        if (vtstrcmp(fname, p->fld_name) == 0)        {            if (rno >= 0)            {                if (rno == p->fd.fd_rec)                    break;            }            else            {                break;            }        }    }    return (p);}/* Find set name in set list*/static struct set_info *find_set(DB_TCHAR *sname){    struct set_info *p;    for (p = ddlp_g.set_list; p; p = p->next_set)    {        if (vtstrcmp(p->set_name, sname) == 0)            break;    }    return (p);}static int check_dup_name(    DB_TCHAR *name,   /* name to check */    DB_TCHAR *rname,  /* record name if this is a field, NULL otherwise */    int line_num,     /* ddlp_g.line for error report */    int fatal)        /* 1 if FATAL error, 0 otherwise */{    struct record_info *rec;    struct set_info *set;    struct field_info *field;    short rno;    short fno;    /* Is it a Set name */    for (set = ddlp_g.set_list; set; set = set->next_set)    {        if (vtstrcmp(set->set_name, name) == 0)        {            vstprintf(ddlp_g.msg, DB_TEXT("set type %s previously defined"), name);            if (fatal)                ddlp_abort(ddlp_g.msg);            else                dderror(ddlp_g.msg, line_num);            return (1);        }    }    /* It it a record name */    for (rec = ddlp_g.rec_list; rec; rec = rec->next_rec)    {        if (vtstrcmp(rec->rec_name, name) == 0)        {            vstprintf(ddlp_g.msg, DB_TEXT("record type %s is already defined"), name);            if (fatal)                ddlp_abort(ddlp_g.msg);            else                dderror(ddlp_g.msg, line_num);            return (1);        }    }    /* Is it a Field name */    /* if the ddlp_g.d_flag is not set then check all       records because no dups are allowed    */    if (!ddlp_g.d_flag)    {        for ( fno = 0, field = ddlp_g.field_list;              field;              field = field->next_field, ++fno)        {            if (vtstrcmp(name, field->fld_name) == 0)            {                vstprintf(ddlp_g.msg, DB_TEXT("field '%s' is already defined"), name);                if (fatal)                    ddlp_abort(ddlp_g.msg);                else                    dderror(ddlp_g.msg, line_num);                return (1);            }        }    }    else    {        /* we only need to check the given record name, otherwise OK */        if (rname)        {            if (find_rec(rname, &rno) != NULL)            {                for ( fno = 0, field = ddlp_g.field_list;                      field;                      field = field->next_field, ++fno)                {                    if (vtstrcmp(name, field->fld_name) == 0)                    {                        if (rno == field->fd.fd_rec)                        {                            vstprintf(ddlp_g.msg,                                DB_TEXT("field '%s' is already defined for this record"),                                name);                            if (fatal)                                ddlp_abort(ddlp_g.msg);                            else                                dderror(ddlp_g.msg, line_num);                            return (1);                        }                    }                }            }        }    }    return (0);}/* Copy a file name, checking its format and length*/void cpfile(DB_TCHAR *ft_name, DB_TCHAR *str, int line_num){    /* check the length */    if (vtstrlen(str) > FILENMLEN - 1)    {        vtstrncpy(ft_name, str, FILENMLEN);        ft_name[FILENMLEN-1] = '\0';        vstprintf(ddlp_g.msg, DB_TEXT("file id/name %s is too long"), str);        dderror(ddlp_g.msg, line_num);        return;    }    vtstrcpy(ft_name, str);               /* unix */}/* Add file to file_info*/struct file_info *add_file(DB_TCHAR *fileid, ID_INFO *idlist, int line_num){    short i;    struct file_info *p;    ID_INFO *q;    if (ddlp_g.s_flag)        vtstrlwr(fileid);    if (ddlp_g.tot_files >= (FILEMASK + 1))    {        ddlp_abort(DB_TEXT("too many files defined in database"));        return (NULL);    }    /* check to see if file already defined */    for (p = ddlp_g.file_list; p; p = p->next_file)    {        if (fileid && vtstrcmp(p->fileid, fileid) == 0)        {            vstprintf(ddlp_g.msg, DB_TEXT("file id %s has been previously defined"), fileid);            dderror(ddlp_g.msg, line_num);            return (NULL);        }        if (vtstrcmp(p->ft.ft_name, ddlp_g.ft_entry.ft_name) == 0)        {            vstprintf(ddlp_g.msg, DB_TEXT("file name %s has been previously defined"), ddlp_g.ft_entry.ft_name);            dderror(ddlp_g.msg, line_num);            return (NULL);        }    }    /* verify that rec/field names in idlist are not in other files */    for (q = idlist; q; q = q->next_id)    {        if (find_file(q->id_rec, q->id_name, &i))        {            vstprintf(ddlp_g.msg, DB_TEXT("record/field %s is contained in another file"),                q->id_name);            dderror(ddlp_g.msg, line_num);            return (NULL);        }        if (ddlp_g.x_flag)        {            add_xref(q->id_rec, q->id_name,                (char) ((ddlp_g.ft_entry.ft_type == 'd') ? 'r' : 'f'), q->id_line);        }    }    /* allocate space and fill file info */    p = (struct file_info *) psp_cGetMemory(sizeof(struct file_info), 0);    if (p == NULL)    {        ddlp_abort(DB_TEXT("out of memory"));        return (NULL);    }    if (ddlp_g.file_last == NULL)        ddlp_g.file_list = p;    else        ddlp_g.file_last->next_file = p;    ddlp_g.file_last = p;    p->next_file = NULL;    p->name_list = idlist;    if (fileid)        vtstrcpy(p->fileid, fileid);    else        p->fileid[0] = 0;    memcpy(&(p->ft), &ddlp_g.ft_entry, sizeof(FILE_ENTRY));    p->ft.ft_status = 'c';    ++ddlp_g.tot_files;    return (p);}/* Add record definition*/struct record_info *add_record(DB_TCHAR *rname, int line_num){    short fno;    struct file_info *f;    struct record_info *p;    if (ddlp_g.s_flag)        vtstrlwr(rname);    /* Ensure record not previously defined */    check_dup_name(rname, NULL, line_num, FATAL);    /* Ensure record contained in specified file */    if ((f = find_file(NULL, rname, &fno)) == NULL)    {        vstprintf(ddlp_g.msg, DB_TEXT("record type %s is not contained in a file"), rname);        ddlp_abort(ddlp_g.msg);        return (NULL);    }    if (f->ft.ft_type != 'd')    {        vstprintf(ddlp_g.msg,            DB_TEXT("record type %s needs to be contained in a data file, not a key file"),            rname);        ddlp_abort(ddlp_g.msg);        return (NULL);    }    /* allocate space and initialize record */    p = (struct record_info *) psp_cGetMemory(sizeof(struct record_info), 0);    if (p == NULL)    {        ddlp_abort(DB_TEXT("out of memory"));        return (NULL);    }    if (ddlp_g.last_rec == NULL)        ddlp_g.rec_list = p;    else        ddlp_g.last_rec->next_rec = p;    ddlp_g.last_rec = p;    vtstrncpy(p->rec_name, rname, NAMELEN - 1);    p->rec_name[NAMELEN - 1] = 0;    memcpy(&(p->rt), &ddlp_g.rt_entry, sizeof(RECORD_ENTRY));    p->rt.rt_data = 0;    p->rt.rt_len = 0;    p->rt.rt_fdtot = (short) (vtstricmp(rname, DB_TEXT("system")) ? 0 : -1);    p->rt.rt_fields = ddlp_g.tot_fields;    p->rt.rt_file = fno;    if (ts_all_recs)        p->rt.rt_flags |= TIMESTAMPED;    p->totown = 0;

⌨️ 快捷键说明

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