fld_move.c

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

C
968
字号
                    wnum[1] = 0;                    wtoa(wnum, cnum, sizeof(cnum));                    num = cnum[0];#else                    num = fld[i];#endif                    break;            }        }    }    if (fld[i + 1])        vftprintf(stderr,            DB_TEXT("**WARNING** invalid character value - %s\n"), fld);    return (char) num;}/**************************************************************************/static wchar_t read_wchar(DB_TCHAR *fld){    int num = 0, i = 0, escape = 0;#if !defined(UNICODE)    wchar_t wnum[2];    char cnum[2];#endif    if (fld[0] != DB_TEXT('\''))    {        vstscanf(fld, DB_TEXT("%d"), &num);        return (wchar_t) num;    }    while ((fld[++i] != DB_TEXT('\'')) || (escape == 1))    {        if (escape == 0)    /* No '\' yet. */        {            if (fld[i] == DB_TEXT('\\'))   /* We found a '\' character */                escape = 1;            else    /* Just a regular character */            {#if defined(UNICODE)                num = fld[i];#else                cnum[0] = fld[i];                cnum[1] = 0;                atow(cnum, wnum, sizeof(wnum));                num = wnum[0];#endif                escape = -1;            }        }        else if (escape == -1)        {            /* a valid character has been found, but no closing "'" */            vftprintf(stderr, DB_TEXT("**WARNING** invalid char %s\n"), fld);            return (wchar_t) num;        }        else if (fld[i] >= DB_TEXT('0') && fld[i] < DB_TEXT('8'))  /* octal */        {            do            {                if (i > 4)  /* too many digits */                {                    vftprintf(stderr,                        DB_TEXT("**WARNING** invalid octal value: %s\n"), fld);                    return (wchar_t) num;                }                num *= 8;                num += fld[i] - DB_TEXT('0');                if (fld[++i] == DB_TEXT('\''))                    escape = -1;            } while (fld[i] >= DB_TEXT('0') && fld[i] < DB_TEXT('8'));            if (fld[i] != DB_TEXT('\''))            {                vftprintf(stderr,                    DB_TEXT("**WARNING** invalid octal value: %s\n"), fld);                return (wchar_t) num;            }            i--;        }        else        {            escape = -1;            switch (fld[i])            {                case DB_TEXT('n'):   num = L'\n';   break;                case DB_TEXT('r'):   num = L'\r';   break;                case DB_TEXT('f'):   num = L'\f';   break;                case DB_TEXT('t'):   num = L'\t';   break;                case DB_TEXT('b'):   num = L'\b';   break;                case DB_TEXT('v'):   num = L'\v';   break;                default:#if defined(UNICODE)                    num = fld[i];#else                    cnum[0] = fld[i];                    cnum[1] = 0;                    atow(cnum, wnum, sizeof(wnum));                    num = wnum[0];#endif                    break;            }        }    }    if (fld[i + 1])        vftprintf(stderr,            DB_TEXT("**WARNING** invalid character value - %s\n"), fld);    return (wchar_t) num;}/**************************************************************************/static DB_ADDR read_dba(DB_TCHAR *fld){    int bracket = 0, colon = 0, i = 0;    unsigned long fno = 0L;  /* need an ulong cuz may be a number instead */    unsigned long rno = 0L;  /* of [fno:rno] */    static DB_ADDR temp_dba;    if (fld[i] == DB_TEXT('['))    {        bracket = 1;        i++;    }    while ((bracket == 1) || (fld[i] != 0))    {        if (vistdigit(fld[i]))        {            if (colon)                rno = rno * 10 + (fld[i] - DB_TEXT('0'));            else                fno = fno * 10 + (fld[i] - DB_TEXT('0'));        }        else        {            if (fld[i] == DB_TEXT(':'))                colon = 1;            else            {                if (fld[i] == DB_TEXT(']'))                    bracket = -1;            }        }        i++;    }    if ((bracket == 1) || (fld[i] != 0))        vftprintf(stderr,            DB_TEXT("**WARNING** invalid database address - %s\n"), fld);    if ((bracket == -1) && (colon == 0))        vftprintf(stderr,            DB_TEXT("**WARNING** invalid database address - %s\n"), fld);    if (colon == 0) /* Just a number, no [fno:rno] */        temp_dba = fno;    else        d_encode_dba((short) fno, rno, &temp_dba);    return temp_dba;}/**************************************************************************//* move one field */int mv_fld(char *record, int offset, int ndx, DB_TCHAR *line){    DB_TCHAR *fld_cont;    int width;    int blank;    char   chnum;    wchar_t wchnum;    short  shnum;    int    inum;    long   lnum = 0;    float  fnum;    double dnum = 0.0;    DB_ADDR dbanum = 0L;    DB_TASK *task = imp_g.dbtask;    fld_cont = find_fld(asc_fld, line, &width);    if (fld_cont == NULL)        return FAILURE;    blank = blanks(fld_cont, width);    switch (task->field_table[ndx].fd_type)    {        case CHARACTER:            if (blank)                chnum = 0;            else                chnum = read_char(fld_cont);            memcpy(record + offset, &chnum, sizeof(char));            break;        case WIDECHAR:            if (blank)                wchnum = 0;            else                wchnum = read_wchar(fld_cont);            memcpy(record + offset, &wchnum, sizeof(wchar_t));            break;        case SHORTINT:            if (!blank)                vstscanf(fld_cont, DB_TEXT("%ld"), &lnum);            shnum = (short) lnum;            memcpy(record + offset, &shnum, sizeof(short));            break;        case REGINT:            if (!blank)                vstscanf(fld_cont, DB_TEXT("%ld"), &lnum);            inum = (int) lnum;            memcpy(record + offset, &inum, sizeof(int));            break;        case DBADDR:            if (blank)                d_encode_dba(0, 0L, &dbanum);            else                dbanum = read_dba(fld_cont);            memcpy(record + offset, &dbanum, sizeof(DB_ADDR));            break;        case LONGINT:            if (!blank)                vstscanf(fld_cont, DB_TEXT("%ld"), &lnum);            memcpy(record + offset, &lnum, sizeof(long));            break;        case FLOAT:            if (!blank)                vstscanf(fld_cont, DB_TEXT("%lf"), &dnum);            fnum = (float) dnum;            memcpy(record + offset, &fnum, sizeof(float));            break;        case DOUBLE:            if (!blank)                vstscanf(fld_cont, DB_TEXT("%lf"), &dnum);            memcpy(record + offset, &dnum, sizeof(double));            break;        default:            if (!imp_g.silent)            {                vftprintf(stderr,                    DB_TEXT("**WARNING**  unable to transfer into db.* data type %c\n"),                    task->field_table[ndx].fd_type);            }            break;    }    asc_fld++;    return OK;}/**************************************************************************/static DB_TCHAR fld_cont[1024];DB_TCHAR *find_fld(int fld, DB_TCHAR *line, int *width){    int i, j, commas, nquotes, escaped, new_fld;    DB_TCHAR *fc, c;    i = 0;    commas = 0;    (*width) = 0;    fc = fld_cont;    fld_cont[0] = 0;    nquotes = 0;    new_fld = 0;    /* IF A CHAR FIELD HAS QUOTES AROUND IT, THE CONTENTS OF THE FIELD       WILL BE WHAT IS BETWEEN THE QUOTES WHILE THE WHITE SPACE OUTSIDE       THE QUOTES IS IGNORED.  IF THE CHAR FIELD HAS NO QUOTES, EVERYTHING       INCLUDING THE WHITE SPACE BETWEEN THE COMMAS WILL BE THE CONTENTS       OF THE FIELD.    */    while (commas < fld)    {        switch ((c = next_ch(line, &i, &escaped)))        {            case DB_TEXT('"'):                if (escaped)                {                    *fc++ = c;                    *fc = 0;                    (*width)++;                }                else if (nquotes == 1)                {                    /* end of quoted string */                    nquotes = 0;                    /* IF THERE IS SPACE BETWEEN THE QUOTE AND THE NEXT COMMA,                        SKIP IT SO THAT IT IS NOT ADDED TO THE STRING.                    */                    do                    {                        c = next_ch(line, &i, &escaped);                    } while ((! escaped) && (c != imp_g.sep_char) &&                                ((c == DB_TEXT(' ')) || (c == DB_TEXT('\t'))));                    if (c)                        i--;  /* let the switch handle the non-white char */                }                else                {                    /* beginning of quoted string */                    nquotes = 1;                    (*width) = 0;                    fld_cont[0] = 0;                    fc = fld_cont;                    new_fld = 0;                }                break;            case 0:                if (nquotes == 1)                {                    for (j = 0; j < i - 1; j++)                        vfputtc(DB_TEXT(' '), stderr);                    vftprintf(stderr, DB_TEXT("^\n**ERROR** no ending quote\n"));                    return NULL;                }                if (commas <= fld - 2)                {                    for (j = 0; j < i - 1; j++)                        vfputtc(' ', stderr);                    vftprintf(stderr,                        DB_TEXT("^\n**ERROR** not enough fields in input record\n"));                    return NULL;                }                if (new_fld)                {                    fld_cont[0] = 0;                    (*width) = 0;                    fc = fld_cont;                }                commas++;                break;            default:                if (c == imp_g.sep_char)                {                    if (nquotes == 1)                    {                        *fc++ = c;                        *fc = 0;                        (*width)++;                    }                    else                    {                        commas++;                        if (commas < fld)                        {                            (*width) = 0;                            fld_cont[0] = 0;                            fc = fld_cont;                        }                        new_fld = 1;                    }                }                else                {                    if (new_fld)                    {                        (*width) = 0;                        fld_cont[0] = 0;                        fc = fld_cont;                        new_fld = 0;                    }                    *fc++ = c;                    *fc = 0;                    (*width)++;                }                break;        }    }    return fld_cont;}/**************************************************************************/static DB_TCHAR next_ch(DB_TCHAR *line, int *pos, int *escaped){    DB_TCHAR retchar, oct[4];    int i, octint;    retchar = line[(*pos)];    *escaped = 0;    if (retchar == imp_g.esc_char)    {        *escaped = 1;        (*pos)++;        switch (line[(*pos)])        {            case DB_TEXT('n'):   retchar = DB_TEXT('\n');   break;            case DB_TEXT('r'):   retchar = DB_TEXT('\r');   break;            case DB_TEXT('t'):   retchar = DB_TEXT('\t');   break;            case DB_TEXT('f'):   retchar = DB_TEXT('\f');   break;            case DB_TEXT('b'):   retchar = DB_TEXT('\b');   break;            default:                /* convert from \ooo form */                oct[0] = 0;                for (i = 0;                      i < 3 && line[(*pos)] >= DB_TEXT('0') && line[(*pos)] <= DB_TEXT('7');                      i++, (*pos)++)                {                    oct[i] = line[(*pos)];                    oct[i + 1] = 0;                }                if (vtstrlen(oct) > 0)                {                    vstscanf(oct, DB_TEXT("%o"), &octint);                    retchar = (DB_TCHAR) octint;                    (*pos)--;                    /* done below, causes too far */                }                else                {                    retchar = line[(*pos)];                }                break;        }    }    else if (!retchar)        return retchar;    (*pos)++;    return retchar;}/**************************************************************************/int blanks(DB_TCHAR *s, int n){    while (n--)    {        if (*s++ != DB_TEXT(' '))            return 0;    }    return 1;}/**************************************************************************//* convert vector into index */int vec_idx(int ndim, short *dim, int *vec, int *idx){    register int i, j, prod;    *idx = 0;    if (ndim <= 0)        return 0;    for (i = 0; i < ndim - 1; i++)    {        prod = 1;        for (j = i + 1; j < ndim; j++)            prod *= dim[j];        *idx += vec[i] * prod;    }    *idx += vec[ndim - 1];    return 0;}

⌨️ 快捷键说明

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