⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucgendat.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    if (i < *pdecomps_used && code != (*pdecomps)[i].code) {        /*         * Shift the decomps up by one if the codes don't match.         */        for (j = *pdecomps_used; j > i; j--)          (void) AC_MEMCPY((char *) &(*pdecomps)[j], (char *) &(*pdecomps)[j - 1],                        sizeof(_decomp_t));    }    /*     * Insert or replace a decomposition.     */    size = dectmp_size + (4 - (dectmp_size & 3));    if ((*pdecomps)[i].size < size) {        if ((*pdecomps)[i].size == 0)          (*pdecomps)[i].decomp = (ac_uint4 *)              malloc(sizeof(ac_uint4) * size);        else          (*pdecomps)[i].decomp = (ac_uint4 *)              realloc((char *) (*pdecomps)[i].decomp,                      sizeof(ac_uint4) * size);        (*pdecomps)[i].size = size;    }    if ((*pdecomps)[i].code != code)      (*pdecomps_used)++;    (*pdecomps)[i].code = code;    (*pdecomps)[i].used = dectmp_size;    (void) AC_MEMCPY((char *) (*pdecomps)[i].decomp, (char *) dectmp,                  sizeof(ac_uint4) * dectmp_size);    /*     * NOTICE: This needs changing later so it is more general than simply     * pairs.  This calculation is done here to simplify allocation elsewhere.     */    if (!compat && dectmp_size == 2)      comps_used++;}static voidadd_title(ac_uint4 code){    ac_uint4 i, j;    /*     * Always map the code to itself.     */    cases[2] = code;    if (title_used == title_size) {        if (title_size == 0)          title = (_case_t *) malloc(sizeof(_case_t) << 3);        else          title = (_case_t *) realloc((char *) title,                                      sizeof(_case_t) * (title_size + 8));        title_size += 8;    }    /*     * Locate the insertion point.     */    for (i = 0; i < title_used && code > title[i].key; i++) ;    if (i < title_used) {        /*         * Shift the array up by one.         */        for (j = title_used; j > i; j--)          (void) AC_MEMCPY((char *) &title[j], (char *) &title[j - 1],                        sizeof(_case_t));    }    title[i].key = cases[2];    /* Title */    title[i].other1 = cases[0]; /* Upper */    title[i].other2 = cases[1]; /* Lower */    title_used++;}static voidadd_upper(ac_uint4 code){    ac_uint4 i, j;    /*     * Always map the code to itself.     */    cases[0] = code;    /*     * If the title case character is not present, then make it the same as     * the upper case.     */    if (cases[2] == 0)      cases[2] = code;    if (upper_used == upper_size) {        if (upper_size == 0)          upper = (_case_t *) malloc(sizeof(_case_t) << 3);        else          upper = (_case_t *) realloc((char *) upper,                                      sizeof(_case_t) * (upper_size + 8));        upper_size += 8;    }    /*     * Locate the insertion point.     */    for (i = 0; i < upper_used && code > upper[i].key; i++) ;    if (i < upper_used) {        /*         * Shift the array up by one.         */        for (j = upper_used; j > i; j--)          (void) AC_MEMCPY((char *) &upper[j], (char *) &upper[j - 1],                        sizeof(_case_t));    }    upper[i].key = cases[0];    /* Upper */    upper[i].other1 = cases[1]; /* Lower */    upper[i].other2 = cases[2]; /* Title */    upper_used++;}static voidadd_lower(ac_uint4 code){    ac_uint4 i, j;    /*     * Always map the code to itself.     */    cases[1] = code;    /*     * If the title case character is empty, then make it the same as the     * upper case.     */    if (cases[2] == 0)      cases[2] = cases[0];    if (lower_used == lower_size) {        if (lower_size == 0)          lower = (_case_t *) malloc(sizeof(_case_t) << 3);        else          lower = (_case_t *) realloc((char *) lower,                                      sizeof(_case_t) * (lower_size + 8));        lower_size += 8;    }    /*     * Locate the insertion point.     */    for (i = 0; i < lower_used && code > lower[i].key; i++) ;    if (i < lower_used) {        /*         * Shift the array up by one.         */        for (j = lower_used; j > i; j--)          (void) AC_MEMCPY((char *) &lower[j], (char *) &lower[j - 1],                        sizeof(_case_t));    }    lower[i].key = cases[1];    /* Lower */    lower[i].other1 = cases[0]; /* Upper */    lower[i].other2 = cases[2]; /* Title */    lower_used++;}static voidordered_ccl_insert(ac_uint4 c, ac_uint4 ccl_code){    ac_uint4 i, j;    if (ccl_used == ccl_size) {        if (ccl_size == 0)          ccl = (ac_uint4 *) malloc(sizeof(ac_uint4) * 24);        else          ccl = (ac_uint4 *)              realloc((char *) ccl, sizeof(ac_uint4) * (ccl_size + 24));        ccl_size += 24;    }    /*     * Optimize adding the first item.     */    if (ccl_used == 0) {        ccl[0] = ccl[1] = c;        ccl[2] = ccl_code;        ccl_used += 3;        return;    }    /*     * Handle the special case of extending the range on the end.  This     * requires that the combining class codes are the same.     */    if (ccl_code == ccl[ccl_used - 1] && c == ccl[ccl_used - 2] + 1) {        ccl[ccl_used - 2] = c;        return;    }    /*     * Handle the special case of adding another range on the end.     */    if (c > ccl[ccl_used - 2] + 1 ||        (c == ccl[ccl_used - 2] + 1 && ccl_code != ccl[ccl_used - 1])) {        ccl[ccl_used++] = c;        ccl[ccl_used++] = c;        ccl[ccl_used++] = ccl_code;        return;    }    /*     * Locate either the insertion point or range for the code.     */    for (i = 0; i < ccl_used && c > ccl[i + 1] + 1; i += 3) ;    if (ccl_code == ccl[i + 2] && c == ccl[i + 1] + 1) {        /*         * Extend an existing range.         */        ccl[i + 1] = c;        return;    } else if (c < ccl[i]) {        /*         * Start a new range before the current location.         */        for (j = ccl_used; j > i; j -= 3) {            ccl[j] = ccl[j - 3];            ccl[j - 1] = ccl[j - 4];            ccl[j - 2] = ccl[j - 5];        }        ccl[i] = ccl[i + 1] = c;        ccl[i + 2] = ccl_code;    }}/* * Adds a number if it does not already exist and returns an index value * multiplied by 2. */static ac_uint4make_number(short num, short denom){    ac_uint4 n;    /*     * Determine if the number already exists.     */    for (n = 0; n < nums_used; n++) {        if (nums[n].numerator == num && nums[n].denominator == denom)          return n << 1;    }    if (nums_used == nums_size) {        if (nums_size == 0)          nums = (_num_t *) malloc(sizeof(_num_t) << 3);        else          nums = (_num_t *) realloc((char *) nums,                                    sizeof(_num_t) * (nums_size + 8));        nums_size += 8;    }    n = nums_used++;    nums[n].numerator = num;    nums[n].denominator = denom;    return n << 1;}static voidadd_number(ac_uint4 code, short num, short denom){    ac_uint4 i, j;    /*     * Insert the code in order.     */    for (i = 0; i < ncodes_used && code > ncodes[i].code; i++) ;    /*     * Handle the case of the codes matching and simply replace the number     * that was there before.     */    if (i < ncodes_used && code == ncodes[i].code) {        ncodes[i].idx = make_number(num, denom);        return;    }    /*     * Resize the array if necessary.     */    if (ncodes_used == ncodes_size) {        if (ncodes_size == 0)          ncodes = (_codeidx_t *) malloc(sizeof(_codeidx_t) << 3);        else          ncodes = (_codeidx_t *)              realloc((char *) ncodes, sizeof(_codeidx_t) * (ncodes_size + 8));        ncodes_size += 8;    }    /*     * Shift things around to insert the code if necessary.     */    if (i < ncodes_used) {        for (j = ncodes_used; j > i; j--) {            ncodes[j].code = ncodes[j - 1].code;            ncodes[j].idx = ncodes[j - 1].idx;        }    }    ncodes[i].code = code;    ncodes[i].idx = make_number(num, denom);    ncodes_used++;}/* * This routine assumes that the line is a valid Unicode Character Database * entry. */static voidread_cdata(FILE *in){    ac_uint4 i, lineno, skip, code, ccl_code;    short wnum, neg, number[2], compat;    char line[512], *s, *e;    lineno = skip = 0;    while (fgets(line, sizeof(line), in)) {	if( (s=strchr(line, '\n')) ) *s = '\0';        lineno++;        /*         * Skip blank lines and lines that start with a '#'.         */        if (line[0] == 0 || line[0] == '#')          continue;        /*         * If lines need to be skipped, do it here.         */        if (skip) {            skip--;            continue;        }        /*         * Collect the code.  The code can be up to 6 hex digits in length to         * allow surrogates to be specified.         */        for (s = line, i = code = 0; *s != ';' && i < 6; i++, s++) {            code <<= 4;            if (*s >= '0' && *s <= '9')              code += *s - '0';            else if (*s >= 'A' && *s <= 'F')              code += (*s - 'A') + 10;            else if (*s >= 'a' && *s <= 'f')              code += (*s - 'a') + 10;        }        /*         * Handle the following special cases:         * 1. 4E00-9FA5 CJK Ideographs.         * 2. AC00-D7A3 Hangul Syllables.         * 3. D800-DFFF Surrogates.         * 4. E000-F8FF Private Use Area.         * 5. F900-FA2D Han compatibility.	 * ...Plus additional ranges in newer Unicode versions...         */        switch (code) {	  case 0x3400:	    /* CJK Ideograph Extension A */            add_range(0x3400, 0x4db5, "Lo", "L");            add_range(0x3400, 0x4db5, "Cp", 0);	    skip = 1;	    break;          case 0x4e00:            /*             * The Han ideographs.             */            add_range(0x4e00, 0x9fff, "Lo", "L");            /*             * Add the characters to the defined category.             */            add_range(0x4e00, 0x9fa5, "Cp", 0);            skip = 1;            break;          case 0xac00:            /*             * The Hangul syllables.             */            add_range(0xac00, 0xd7a3, "Lo", "L");            /*             * Add the characters to the defined category.             */            add_range(0xac00, 0xd7a3, "Cp", 0);            skip = 1;            break;          case 0xd800:            /*             * Make a range of all surrogates and assume some default             * properties.             */            add_range(0x010000, 0x10ffff, "Cs", "L");            skip = 5;            break;          case 0xe000:            /*             * The Private Use area.  Add with a default set of properties.             */            add_range(0xe000, 0xf8ff, "Co", "L");            skip = 1;            break;          case 0xf900:            /*             * The CJK compatibility area.             */            add_range(0xf900, 0xfaff, "Lo", "L");            /*             * Add the characters to the defined category.             */            add_range(0xf900, 0xfaff, "Cp", 0);            skip = 1;	    break;	  case 0x20000:	    /* CJK Ideograph Extension B */            add_range(0x20000, 0x2a6d6, "Lo", "L");            add_range(0x20000, 0x2a6d6, "Cp", 0);	    skip = 1;	    break;	  case 0xf0000:	    /* Plane 15 private use */	    add_range(0xf0000, 0xffffd, "Co", "L");	    skip = 1;	    break;	  case 0x100000:	    /* Plane 16 private use */	    add_range(0x100000, 0x10fffd, "Co", "L");	    skip = 1;	    break;        }        if (skip)          continue;        /*         * Add the code to the defined category.         */        ordered_range_insert(code, "Cp", 2);        /*         * Locate the first character property field.         */        for (i = 0; *s != 0 && i < 2; s++) {            if (*s == ';')              i++;        }        for (e = s; *e && *e != ';'; e++) ;            ordered_range_insert(code, s, e - s);        /*         * Locate the combining class code.         */        for (s = e; *s != 0 && i < 3; s++) {            if (*s == ';')              i++;        }        /*

⌨️ 快捷键说明

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