dbe_comm.c

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

C
593
字号
                    /* If it's not one of the above, it could be a hex                        number (e.g. ed could be edit or 0xED )                    */                    tokens[token].type = TYPE_HEX;                    tokens[token].lval = ln;                    mask = (unsigned char) (0x80 >> ((kwd = HEXNUM) %                            BITS_PER_BYTE));                }            }        }        if (keywords[lastkwd].args[kwd / BITS_PER_BYTE] & mask)        {            tokens[token++].parent = lasttoken;    /* Store it */            if ((error = parse(&p, &token, tokens, max_tok, kwd,                                     errstr, errlen, task)) < 0)            {                break;            }        }        else        {            /* Current token not an argument of last one -               go back up a level            */            break;        }        /* Done this token and its arguments - do next one */        line = p;    }    if (error >= 0)    {        *lineptr = line;                 /* Current position in command line */        *tokenptr = token;               /* Current position in token array */        if (lasttoken < 0)        {            p = gettoken(line, buffer, sizeof(buffer) / sizeof(DB_TCHAR));            if (buffer[0])            {                for ( i = 0, q = buffer;                        *q && i < errlen - 1;                        i++, q++, errstr++)                {                    *errstr = *q;                }                *errstr = 0;                error = UNX_TOK;            }        }    }    return (error);}/* Get first token from input string*/DB_TCHAR *gettoken(DB_TCHAR *string, DB_TCHAR *token, int maxlen){    register int   i;    DB_TCHAR      *p, *q;    p = string;    q = token;    i = 0;    while (*p && *p <= DB_TEXT(' '))        p++;    if (*p)    {        while ((*p > DB_TEXT(' ')) && (*p != DB_TEXT(',')) && (i < maxlen - 1))        {            *q++ = *p++;            i++;        }        if (*p == DB_TEXT(','))            p++;    }    *q = 0;    return (p);}/* Test whether string is a valid keyword - if so return index in kwd array*/int getkwd(DB_TCHAR *string, int check){    register int   i;    size_t         len;    int            n;    len = vtstrlen(string);    for (i = kwd_1; i < n_kwd; i++)    {        if (keywords[i].min_len == 0)            continue;        if (check && (len < (size_t) keywords[i].min_len))            continue;        if ((n = vtstrnicmp(string, keywords[i].id, len)) == 0)            return (i);        if (n < 0)            break;    }    return (-1);}/* Test whether string is a database address (NOT whether it's in valid range)*/int getdba(DB_TCHAR *string, DB_ADDR *dba_ptr){    DB_TCHAR   *p;    int         n;    long        ln;    FILE_NO     fno;    F_ADDR      rno;    p = string;    if (*p == DB_TEXT('['))        p++;    if ((! vstscanf(p, decimal ? DB_TEXT("%d") : DB_TEXT("%x"), &n))     || (n > FILEMASK) || (n < 0))        return (-1);    fno = (FILE_NO) n;    while (*p && *p != DB_TEXT(':'))        p++;    if (!*p)        return (-1);    p++;    if ((! *p)     || (! vstscanf(p, decimal ? DB_TEXT("%ld") : DB_TEXT("%lx"), &ln))     || (ln > MAXRECORDS) || (ln < 0L))    {        return (-1);    }    rno = ln;    d_encode_dba(fno, rno, dba_ptr);    return (0);}/* Test whether string is a valid (positive) decimal number*/long getlong(DB_TCHAR *string){    DB_TCHAR *p;    if (vtstrlen(string) > NUMLEN)        return (-1L);    for (p = string; *p; p++)    {        if ((*p < DB_TEXT('0')) || (*p > DB_TEXT('9')))            return (-1L);    }    return (vttol(string));}/* Test whether string is a valid (positive) hex number*/long gethex(DB_TCHAR *string){    register size_t  i;    long             n = 0L;    DB_TCHAR        *p;    for (p = string, i = 0; *p; p++, i++)    {        if (i >= sizeof(n) * 2)            return (-1L);        n <<= 4;        if ((*p >= DB_TEXT('0')) && (*p <= DB_TEXT('9')))            n += *p - DB_TEXT('0');        else if ((*p >= DB_TEXT('a')) && (*p <= DB_TEXT('f')))            n += *p - DB_TEXT('a') + 10;        else if ((*p >= DB_TEXT('A')) && (*p <= DB_TEXT('F')))            n += *p - DB_TEXT('A') + 10;        else            return (-1L);    }    return (n);}/* Test whether string is a valid (positive) number*/long getnum(DB_TCHAR *string){    while (*string && (*string <= DB_TEXT(' ')))        string++;    return (decimal ? getlong(string) : gethex(string));}/* Test whether string is a file name - return index in task->file_table or -1*/int getfile(DB_TCHAR *name, DB_TASK *task){    register int i;    /* case sensitive search -- UNIX */    for (i = 0; i < task->size_ft; i++)    {        if (psp_fileNameCmp(name, task->file_table[i].ft_name) == 0)            return i;    }    return -1;}/* Test whether string is a record name - return index in task->record_table or -1*/int getrec(DB_TCHAR *name, DB_TASK *task){    register int i;        for (i = 0; i < task->size_rt; i++)    {        if (vtstricmp(name, task->record_names[i]) == 0)            return (i);    }    return (-1);}/* Test whether string is a field name - return index in task->field_table or -1*/int getfld(DB_TCHAR *name, int *key, DB_TASK *task){    register int   i;    DB_TCHAR       SaveChar;    int            rec;    DB_TCHAR      *p = NULL;    int            start = 0, end = 0;    *key = 0;    /* look for record.field */    for (i = 0; i < (int) vtstrlen(name); i++)    {        if (name[i] == DB_TEXT('.'))        {            SaveChar = name[i];            name[i] = 0;            rec = getrec(name, task);            name[i] = SaveChar;            if (rec >= 0)            {                p = name + i + 1;                start = task->record_table[rec].rt_fields;                end = task->record_table[rec].rt_fields + task->record_table[rec].rt_fdtot;                break;            }        }    }    if (i == (int) vtstrlen(name))    {        p = name;        start = 0;        end = task->size_fd;    }    /* must be just a field name */    for (i = start; i < end; i++)    {        if (vtstricmp(p, task->field_names[i]) == 0)        {            if (task->field_table[i].fd_key != 'n')                *key = 1;            return (i);        }    }    return (-1);}/* Test whether string is a set name - return index in task->set_table or -1*/int getset(DB_TCHAR *name, DB_TASK *task){    register int i;    for (i = 0; i < task->size_st; i++)    {        if (vtstricmp(name, task->set_names[i]) == 0)            return (i);    }    return (-1);}

⌨️ 快捷键说明

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