cnvfld.c

来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 342 行

C
342
字号
/*************************************************************************** *                                                                         * * db.*                                                                    * * open source database, utility programs                                  * *                                                                         * * Copyright (c) 2000 Centura Software Corporation. All rights reserved.   * *                                                                         * * Use of this software, whether in source code format, or in executable,  * * binary object code form, is governed by the CENTURA OPEN SOURCE LICENSE * * which is fully described in the LICENSE.TXT file, included within this  * * distribution of source code files.                                      *  *                                                                         * **************************************************************************/#include "db.star.h"#include "cnvfld.h"#define MAXTEXT 1600static int txtcpy(int *, DB_TCHAR *, void *, int, DB_TASK *);static int wtxtcpy(int *, DB_TCHAR *, void *, int, DB_TASK *);#if defined(UNICODE)#define ttxtcpy wtxtcpy#else#define ttxtcpy txtcpy#endif/* temporary struct text buffer */static DB_TCHAR sbuf[MAXTEXT];/* Convert data field to text */DB_TCHAR *fldtotxt(    int fld,                            /* task->field_table index */    char *data,                         /* pointer to contents of field */    DB_TCHAR *txt,                      /* pointer to text buffer */    int hex,                            /* non-zero for db_addr's in hex */    DB_TASK *task){    /* field value variables */    DB_ADDR           f_db_addr;    unsigned int      f_uint;    unsigned short    f_ushort;    unsigned long     f_ulong;    int               f_int;    short             f_short;    long              f_long;    float             f_float;    double            f_double;    int               txtp;    short             fno;    DB_ULONG          rno;    DB_TCHAR          buf[40];       /* temporary formatted spec. buffer */    int               fd_type;       /* field type */    int               fd_len;        /* total length of field */    int               fd_size;       /* size of each entry in field */    int               fd_elts;       /* number of array elements in field */    int               fd_dims;       /* number of array dimensions in field */    char             *fd_pos;        /* points to start of next data element */    char             *sm_pos;        /* points to struct member data element */    char             *r_base;        /* base address of record */    int               cnt;    register int      elt,                      i;    /* get pertinent info from task->field_table */    fd_type = task->field_table[fld].fd_type;    fd_len = task->field_table[fld].fd_len;    /* compute number of array elements */    for ( fd_elts = 1, fd_dims = 0;          fd_dims < 4 && task->field_table[fld].fd_dim[fd_dims];          ++fd_dims)    {        fd_elts = fd_elts * task->field_table[fld].fd_dim[fd_dims];    }    if (fd_type == CHARACTER)        fd_elts = 1;    if (fd_type == WIDECHAR)        fd_elts = 1;    fd_size = fd_len / fd_elts;    txtp = 0;    *txt = 0;                        /* initialize display text buffer */    for (elt = 0; elt < fd_elts; ++elt)    {        fd_pos = data + (elt * fd_size);        if (fd_type != CHARACTER && fd_type != WIDECHAR)        {            for (cnt = 1, i = elt + 1; i < fd_elts; ++i, ++cnt)            {                /* compute repitition factor */                if (memcmp(fd_pos, data + (i * fd_size), fd_size))                    break;            }            if (elt)                ttxtcpy(&txtp, txt, DB_TEXT(","), 0, task);            if (cnt > 2)            {                vstprintf(buf, DB_TEXT("%d*"), cnt);                ttxtcpy(&txtp, txt, buf, 0, task);                elt = i - 1;                fd_pos = data + (elt * fd_size);            }        }        switch (fd_type)        {            case GROUPED:                r_base = fd_pos - task->field_table[fld].fd_ptr;                ttxtcpy(&txtp, txt, DB_TEXT("{"), 0, task);                for ( i = fld + 1;                      i < task->size_fd && (STRUCTFLD & task->field_table[i].fd_flags);                      ++i)                {                    if (i - (fld + 1))                        ttxtcpy(&txtp, txt, DB_TEXT(","), 0, task);                    sm_pos = r_base + task->field_table[i].fd_ptr;                    if (task->field_table[i].fd_type == CHARACTER                     || task->field_table[i].fd_type == WIDECHAR)                    {                        ttxtcpy(&txtp, txt, DB_TEXT("\""), 0, task);                        ttxtcpy(&txtp, txt, fldtotxt(i, sm_pos, sbuf, hex, task),                                0, task);                        ttxtcpy(&txtp, txt, DB_TEXT("\""), 0, task);                    }                    else                    {                        ttxtcpy(&txtp, txt, fldtotxt(i, sm_pos, sbuf, hex, task),                                0, task);                    }                }                ttxtcpy(&txtp, txt, DB_TEXT("}"), 0, task);                break;            case COMKEY:                ttxtcpy(&txtp, txt, DB_TEXT("{"), 0, task);                for (i = task->field_table[fld].fd_ptr;                     (i < task->size_kt) && (fld == task->key_table[i].kt_key);                     i++)                {                    if (i > task->field_table[fld].fd_ptr)                        ttxtcpy(&txtp, txt, DB_TEXT(","), 0, task);                    sm_pos = data + task->key_table[i].kt_ptr;                    if (task->field_table[task->key_table[i].kt_field].fd_type == CHARACTER                     || task->field_table[task->key_table[i].kt_field].fd_type == WIDECHAR)                    {                        ttxtcpy(&txtp, txt, DB_TEXT("\""), 0, task);                        ttxtcpy(&txtp, txt, fldtotxt(task->key_table[i].kt_field,                                sm_pos, sbuf, hex, task), 0, task);                        ttxtcpy(&txtp, txt, DB_TEXT("\""), 0, task);                    }                    else                    {                        ttxtcpy(&txtp, txt, fldtotxt(task->key_table[i].kt_field,                                sm_pos, sbuf, hex, task), 0, task);                    }                }                ttxtcpy(&txtp, txt, DB_TEXT("}"), 0, task);                break;            case CHARACTER:                if (fd_len == 1 || fd_dims > 1)                    txtcpy(&txtp, txt, fd_pos, (int) fd_len, task);                else                    txtcpy(&txtp, txt, fd_pos, 0, task);                break;            case WIDECHAR:                if ((fd_len / sizeof(wchar_t)) == 1 || fd_dims > 1)                    wtxtcpy(&txtp, txt, fd_pos, (int) (fd_len / sizeof(wchar_t)), task);                else                    wtxtcpy(&txtp, txt, fd_pos, 0, task);                break;            case DBADDR:                memcpy(&f_db_addr, fd_pos, DB_ADDR_SIZE);                d_decode_dba(f_db_addr, &fno, &rno);                vstprintf(buf, hex ? DB_TEXT("[%x:%lx]") : DB_TEXT("[%d:%ld]"),                             fno, rno);                ttxtcpy(&txtp, txt, buf, 0, task);                break;            case REGINT:                if (task->field_table[fld].fd_flags & UNSIGNEDFLD)                {                    memcpy(&f_uint, fd_pos, INT_SIZE);                    vstprintf(buf, DB_TEXT("%u"), f_uint);                }                else                {                    memcpy(&f_int, fd_pos, INT_SIZE);                    vstprintf(buf, DB_TEXT("%d"), f_int);                }                ttxtcpy(&txtp, txt, buf, 0, task);                break;            case SHORTINT:                if (task->field_table[fld].fd_flags & UNSIGNEDFLD)                {                    memcpy(&f_ushort, fd_pos, SHORT_SIZE);                    vstprintf(buf, DB_TEXT("%u"), f_ushort);                }                else                {                    memcpy(&f_short, fd_pos, SHORT_SIZE);                    vstprintf(buf, DB_TEXT("%d"), f_short);                }                ttxtcpy(&txtp, txt, buf, 0, task);                break;            case LONGINT:                if (task->field_table[fld].fd_flags & UNSIGNEDFLD)                {                    memcpy(&f_ulong, fd_pos, LONG_SIZE);                    vstprintf(buf, DB_TEXT("%lu"), f_ulong);                }                else                {                    memcpy(&f_long, fd_pos, LONG_SIZE);                    vstprintf(buf, DB_TEXT("%ld"), f_long);                }                ttxtcpy(&txtp, txt, buf, 0, task);                break;            case FLOAT:                memcpy(&f_float, fd_pos, FLOAT_SIZE);                vstprintf(buf, DB_TEXT("%.20g"), f_float);                ttxtcpy(&txtp, txt, buf, 0, task);                break;            case DOUBLE:                memcpy(&f_double, fd_pos, DOUBLE_SIZE);                vstprintf(buf, DB_TEXT("%.20g"), f_double);                ttxtcpy(&txtp, txt, buf, 0, task);                break;            default:                break;        }    }    return (txt);}/* Copy data field display text string*/static int txtcpy(    int      *txtp,        /* next text buffer position */    DB_TCHAR *txt,         /* text buffer */    void     *str,         /* character array */    int       len,         /* length of str 0 => stop when */    DB_TASK  *task)        /* null byte encountered */{    register int  i;    unsigned char k;    char         *p = (char *)str;    DB_TCHAR      buf[10];#if defined(UNICODE)    char          s[2];    s[0] = s[1] = '\0';#endif    for ( i = 0;          (*txtp < MAXTEXT - 1) && ((len && i < len) || (!len && p[i]));          ++i, ++(*txtp))    {        if ((p[i] < ' ') || (p[i] > '~') || (p[i] == '\\'))        {            k = (unsigned char) p[i];            if (task->ctbl_activ && task->country_tbl[k].out_chr)            {#if defined(UNICODE)                s[0] = (char) task->country_tbl[k].out_chr;		atow(s, &txt[*txtp], 2);#else                txt[*txtp] = task->country_tbl[k].out_chr;#endif            }            else            {                /* translate into \ codes */                txt[(*txtp)++] = DB_TEXT('\\');                switch (p[i])                {                    case '\n':  txt[*txtp] = DB_TEXT('n');    break;                    case '\r':  txt[*txtp] = DB_TEXT('r');    break;                    case '\t':  txt[*txtp] = DB_TEXT('t');    break;                    case '\f':  txt[*txtp] = DB_TEXT('f');    break;                    case '\b':  txt[*txtp] = DB_TEXT('b');    break;                    case '\\':  txt[*txtp] = DB_TEXT('\\');   break;                    case '\0':  txt[*txtp] = DB_TEXT('0');    break;                    default:                        /* convert to \ddd form */                        vstprintf(buf, DB_TEXT("%03o"), (0xff & (int) p[i]));                        vtstrcpy(txt + (*txtp), buf);                        *txtp += vtstrlen(buf) - 1;                        break;                }            }        }        else        {#if defined(UNICODE)            s[0] = p[i];	    atow(s, &txt[*txtp], 2);#else            txt[*txtp] = p[i];#endif        }    }    txt[*txtp] = 0;    return (0);}static int wtxtcpy(int *txtp, DB_TCHAR *txt, void *str, int len, DB_TASK *task){    wchar_t *p = (wchar_t *) str;    if (!len)        len = vwcslen(p);#if defined(UNICODE)    wcsncpy(&txt[*txtp], p, len);#else    wtoa(p, &txt[*txtp], len+1);#endif    *txtp += len;    txt[*txtp] = '\0';    return (0);}

⌨️ 快捷键说明

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