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 + -
显示快捷键?