Lines Matching +full:ref +full:- +full:weight
1 /*-
6 * provided under BSD-style license terms by Nexenta Systems, Inc.
102 * This is done by creating a "weight" structure for the item. The
105 * The third pass walks over all the weight structures, in priority
107 * weight value to them. These are the values that will actually be
119 * for collating-symbols, this is the value assigned for them until the
123 * numeric weight.
126 * this is used for forward references. A collating-symbol can never
139 typedef struct weight { struct
142 RB_ENTRY(weight) entry; argument
160 int32_t ref; member
170 int32_t ref[COLL_WEIGHTS_MAX]; member
183 int32_t ref[COLL_WEIGHTS_MAX]; member
193 int32_t ref[COLL_WEIGHTS_MAX]; member
205 int32_t ref[COLLATE_STR_LEN]; member
217 static RB_HEAD(weights, weight) weights[COLL_WEIGHTS_MAX];
224 * starting point is exclusive -- i.e. the starting point is not
276 return (-1); in new_pri()
288 get_pri(int32_t ref) in get_pri() argument
290 if ((ref < 0) || (ref > numpri)) { in get_pri()
294 return (&prilist[ref]); in get_pri()
298 set_pri(int32_t ref, int32_t v, res_t res) in set_pri() argument
302 pri = get_pri(ref); in set_pri()
309 if ((res == REFER) && (ref == v)) { in set_pri()
314 if (pri->res != UNKNOWN) { in set_pri()
316 pri->lineno); in set_pri()
319 pri->lineno = lineno; in set_pri()
320 pri->pri = v; in set_pri()
321 pri->res = res; in set_pri()
325 resolve_pri(int32_t ref) in resolve_pri() argument
330 pri = get_pri(ref); in resolve_pri()
332 while (pri->res == REFER) { in resolve_pri()
333 if (pri->pass == pass) { in resolve_pri()
335 lineno = pri->lineno; in resolve_pri()
337 return (-1); in resolve_pri()
339 if ((pri->pri < 0) || (pri->pri >= numpri)) { in resolve_pri()
341 return (-1); in resolve_pri()
343 pri->pass = pass; in resolve_pri()
344 pri = &prilist[pri->pri]; in resolve_pri()
347 if (pri->res == UNKNOWN) { in resolve_pri()
348 return (-1); in resolve_pri()
350 if (pri->res != RESOLVED) in resolve_pri()
353 return (pri->pri); in resolve_pri()
359 int32_t k1 = ((const weight_t *)n1)->pri; in weight_compare()
360 int32_t k2 = ((const weight_t *)n2)->pri; in weight_compare()
362 return (k1 < k2 ? -1 : k1 > k2 ? 1 : 0); in weight_compare()
365 RB_GENERATE_STATIC(weights, weight, entry, weight_compare);
374 rv = strcmp(c1->name, c2->name); in collsym_compare()
375 return ((rv < 0) ? -1 : (rv > 0) ? 1 : 0); in collsym_compare()
387 rv = strcmp(c1->name, c2->name); in collundef_compare()
388 return ((rv < 0) ? -1 : (rv > 0) ? 1 : 0); in collundef_compare()
400 rv = strcmp(c1->symbol, c2->symbol); in element_compare_symbol()
401 return ((rv < 0) ? -1 : (rv > 0) ? 1 : 0); in element_compare_symbol()
413 rv = wcscmp(c1->expand, c2->expand); in element_compare_expand()
414 return ((rv < 0) ? -1 : (rv > 0) ? 1 : 0); in element_compare_expand()
422 wchar_t k1 = ((const collchar_t *)n1)->wc; in collchar_compare()
423 wchar_t k2 = ((const collchar_t *)n2)->wc; in collchar_compare()
433 int32_t k1 = ((const subst_t *)n1)->key; in subst_compare()
434 int32_t k2 = ((const subst_t *)n2)->key; in subst_compare()
436 return (k1 < k2 ? -1 : k1 > k2 ? 1 : 0); in subst_compare()
444 const wchar_t *c1 = ((const subst_t *)n1)->ref; in subst_compare_ref()
445 const wchar_t *c2 = ((const subst_t *)n2)->ref; in subst_compare_ref()
449 return ((rv < 0) ? -1 : (rv > 0) ? 1 : 0); in subst_compare_ref()
500 sym->name = name; in define_collsym()
501 sym->ref = new_pri(); in define_collsym()
543 ((ud->name = strdup(name)) == NULL)) { in get_collundef()
549 ud->ref[i] = new_pri(); in get_collundef()
572 cc->ref[i] = new_pri(); in get_collchar()
574 cc->wc = wc; in get_collchar()
584 /* update the weight */ in end_order_collsym()
586 set_pri(sym->ref, nextpri, RESOLVED); in end_order_collsym()
595 int32_t ref; in end_order() local
598 /* advance the priority/weight */ in end_order()
604 if (((ref = order_weights[i]) < 0) || in end_order()
605 ((p = get_pri(ref)) == NULL) || in end_order()
606 (p->pri == -1)) { in end_order()
607 /* unspecified weight is a self reference */ in end_order()
608 set_pri(currchar->ref[i], pri, RESOLVED); in end_order()
610 set_pri(currchar->ref[i], ref, REFER); in end_order()
612 order_weights[i] = -1; in end_order()
616 ellipsis_start = currchar->wc + 1; in end_order()
624 order_weights[i] = -1; in end_order()
634 if (((ref = order_weights[i]) < 0) || in end_order()
635 ((p = get_pri(ref)) == NULL) || in end_order()
636 (p->pri == -1)) { in end_order()
637 set_pri(currelem->ref[i], pri, in end_order()
640 set_pri(currelem->ref[i], ref, REFER); in end_order()
642 order_weights[i] = -1; in end_order()
649 if (((ref = order_weights[i]) < 0) || in end_order()
650 ((p = get_pri(ref)) == NULL) || in end_order()
651 (p->pri == -1)) { in end_order()
652 set_pri(pri_undefined[i], -1, RESOLVED); in end_order()
654 set_pri(pri_undefined[i], ref, REFER); in end_order()
656 order_weights[i] = -1; in end_order()
662 if (((ref = order_weights[i]) < 0) || in end_order()
663 ((p = get_pri(ref)) == NULL) || in end_order()
664 (p->pri == -1)) { in end_order()
665 set_pri(currundef->ref[i], pri, RESOLVED); in end_order()
667 set_pri(currundef->ref[i], ref, REFER); in end_order()
669 order_weights[i] = -1; in end_order()
694 order_weights[i] = -1; in start_order()
716 int32_t ref; in start_order_char() local
737 * ellipsis. note that -1 encodes for the in start_order_char()
747 if (((ref = ellipsis_weights[i]) == -1) || in start_order_char()
748 ((p = get_pri(ref)) == NULL) || in start_order_char()
749 (p->pri == -1)) { in start_order_char()
750 set_pri(cc->ref[i], nextpri, RESOLVED); in start_order_char()
752 set_pri(cc->ref[i], ref, REFER); in start_order_char()
803 e->expand = wcs; in define_collelem()
804 e->symbol = name; in define_collelem()
809 * for each possible weight. Not a big deal, as collating-elements in define_collelem()
813 e->ref[i] = new_pri(); in define_collelem()
860 add_order_pri(int32_t ref) in add_order_pri() argument
866 order_weights[curr_weight] = ref; in add_order_pri()
873 add_order_pri(s->ref); in add_order_collsym()
886 add_order_pri(cc->ref[curr_weight]); in add_order_char()
892 add_order_pri(e->ref[curr_weight]); in add_order_collelem()
909 add_order_pri(c->ref[curr_weight]); in add_order_symbol()
928 srch.ref[i] = subst_weights[i]; in add_order_subst()
938 s->key = new_pri(); in add_order_subst()
948 set_pri(s->key, in add_order_subst()
954 s->ref[i] = srch.ref[i]; in add_order_subst()
972 add_order_pri(s->key); in add_order_subst()
976 add_subst_pri(int32_t ref) in add_subst_pri() argument
982 subst_weights[curr_subst] = ref; in add_subst_pri()
993 (cc->wc != wc)) { in add_subst_char()
997 /* we take the weight for the character at that position */ in add_subst_char()
998 add_subst_pri(cc->ref[curr_weight]); in add_subst_char()
1004 add_subst_pri(e->ref[curr_weight]); in add_subst_collelem()
1010 add_subst_pri(s->ref); in add_subst_collsym()
1019 add_subst_pri(cu->ref[curr_weight]); in add_subst_symbol()
1024 add_weight(int32_t ref, int pass) in add_weight() argument
1029 srch.pri = resolve_pri(ref); in add_weight()
1046 w->pri = srch.pri; in add_weight()
1060 get_weight(int32_t ref, int pass) in get_weight() argument
1066 pri = resolve_pri(ref); in get_weight()
1076 return (-1); in get_weight()
1078 return (w->opt); in get_weight()
1087 while (--n > 0 && (*s1++ = htote(*s2++)) != 0) in wsncpy()
1090 while (--n > 0) in wsncpy()
1136 for (j = 0; sb->ref[j]; j++) { in dump_collate()
1137 add_weight(sb->ref[j], i); in dump_collate()
1142 add_weights(ce->ref); in dump_collate()
1145 add_weights(cc->ref); in dump_collate()
1156 w->opt = nweight[i]; in dump_collate()
1170 * to show up. Also, set the total weight counts. in dump_collate()
1173 if (resolve_pri(pri_undefined[i]) == -1) { in dump_collate()
1174 set_pri(pri_undefined[i], -1, RESOLVED); in dump_collate()
1192 htote(get_weight(cc->ref[j], j)); in dump_collate()
1222 if ((st[n].key = resolve_pri(sb->key)) < 0) { in dump_collate()
1230 for (j = 0; sb->ref[j]; j++) { in dump_collate()
1231 st[n].pri[j] = htote(get_weight(sb->ref[j], in dump_collate()
1253 (void) wsncpy(chain[n].str, ce->expand, COLLATE_STR_LEN); in dump_collate()
1255 chain[n].pri[i] = htote(get_weight(ce->ref[i], i)); in dump_collate()
1276 if ((uint32_t)cc->wc <= UCHAR_MAX) in dump_collate()
1279 if ((pri = get_weight(cc->ref[j], j)) < 0) { in dump_collate()
1290 large[i].val = htote(cc->wc); in dump_collate()