mapchar.c

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

C
168
字号
/*************************************************************************** *                                                                         * * db.*                                                                    * * open source database kernel                                             * *                                                                         * * 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"/* ======================================================================    Map ASCII-Characters for output and sorting*/int INTERNAL_FCN dmapchar(    unsigned char inchar,        /* value of character to be mapped */    unsigned char outchar,       /* output character as    ... */    const char   *sort_str,      /* sort string (max. len = 2) */    unsigned char subsort,       /* subsort value, to distinguish                                  * between two equal values                                  * (e.g. 'a' and 'A', if necessary) */    DB_TASK *task ){    int indx;        if (strlen(sort_str) > 2)        return (dberr(S_INVSORT));    /* Is character-set table already installed? */    if (!task->ctbl_activ)    {        if (ctbl_alloc(task) != S_OKAY)            return (task->db_status);        task->ctbl_activ = TRUE;    }    /* Modify table for inchar specifications */    indx = inchar;    task->country_tbl[indx].out_chr = outchar;    task->country_tbl[indx].sort_as1 = sort_str[0];    task->country_tbl[indx].sort_as2 = sort_str[1];    task->country_tbl[indx].sub_sort = subsort;    return (task->db_status);}/* ======================================================================    read MAP_FILE and make appropriate d_mapchar-calls*/int INTERNAL_FCN ctb_init(DB_TASK *task){    PSP_FH        *ctb;    unsigned char  inchar;    unsigned char  outchar;    unsigned char  subsort;    char     p[80];    char    *ptr;    char     sortas[3];    int      subs_i;    DB_TCHAR ctb_name[FILENMLEN * 2];    vtstrcpy(ctb_name, task->ctbpath);    vtstrcat(ctb_name, CTBNAME);    ctb = psp_fileOpen(ctb_name, O_RDONLY, PSP_FLAG_DENYNO | PSP_FLAG_STREAM);    if (ctb != NULL)    {        while (psp_fileGets(ctb, p, sizeof(p)) != NULL)        {            ptr = p;            if (stricmp(ptr, "ignorecase") == 0)            {                if (ctbl_ignorecase(task) != S_OKAY)                    break;            }            else            {                inchar = ptr[0];                outchar = ptr[2];                subs_i = ptr[4] - '0';                ptr = strchr(&ptr[4], ',');                sortas[0] = (char)(ptr ? *(ptr + 1) : '\0');                sortas[1] = (char)(ptr ? *(ptr + 2) : '\0');                sortas[2] = '\0';                subsort = (unsigned char) subs_i;                if (dmapchar(inchar, outchar, sortas, subsort, task) != S_OKAY)                    break;            }        }        psp_fileClose(ctb);    }    return task->db_status;}/* ======================================================================    Ignore case in string comparisons by mapping lower case to upper case*/int INTERNAL_FCN ctbl_ignorecase(DB_TASK *task){    int i;        if (!task->ctbl_activ)    {        if (ctbl_alloc(task) != S_OKAY)            return task->db_status;        task->ctbl_activ = TRUE;    }    for (i = 'a'; i <= 'z'; i++)        task->country_tbl[i].sort_as1 = (char) (i - (int)'a' + (int)'A');    task->dboptions |= IGNORECASE;    return S_OKAY;}/* ======================================================================    Use case in string comparisons*/int INTERNAL_FCN ctbl_usecase(DB_TASK *task){    int i;        if (task->ctbl_activ)    {        for (i = 'a'; i <= 'z'; i++)            task->country_tbl[i].sort_as1 = (char) i;    }    task->dboptions &= ~IGNORECASE;    return S_OKAY;}/* ======================================================================    Allocate and initialize country_table*/int INTERNAL_FCN ctbl_alloc(DB_TASK *task){    task->country_tbl = (CNTRY_TBL *) psp_cGetMemory(256 * sizeof(CNTRY_TBL) + 1, 0);    if (task->country_tbl == NULL)        dberr(S_NOMEMORY);    return (task->db_status);}/* ======================================================================    Free country table*/void EXTERNAL_FCN ctbl_free(DB_TASK *task){    psp_freeMemory(task->country_tbl, 0);    task->ctbl_activ = FALSE;}

⌨️ 快捷键说明

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