1*50fc853eSJohn Marino /* $FreeBSD: head/usr.bin/sort/coll.h 264744 2014-04-21 22:52:18Z pfg $ */ 2*50fc853eSJohn Marino 3*50fc853eSJohn Marino /*- 4*50fc853eSJohn Marino * Copyright (C) 2009 Gabor Kovesdan <gabor@FreeBSD.org> 5*50fc853eSJohn Marino * Copyright (C) 2012 Oleg Moskalenko <mom040267@gmail.com> 6*50fc853eSJohn Marino * All rights reserved. 7*50fc853eSJohn Marino * 8*50fc853eSJohn Marino * Redistribution and use in source and binary forms, with or without 9*50fc853eSJohn Marino * modification, are permitted provided that the following conditions 10*50fc853eSJohn Marino * are met: 11*50fc853eSJohn Marino * 1. Redistributions of source code must retain the above copyright 12*50fc853eSJohn Marino * notice, this list of conditions and the following disclaimer. 13*50fc853eSJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 14*50fc853eSJohn Marino * notice, this list of conditions and the following disclaimer in the 15*50fc853eSJohn Marino * documentation and/or other materials provided with the distribution. 16*50fc853eSJohn Marino * 17*50fc853eSJohn Marino * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*50fc853eSJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*50fc853eSJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*50fc853eSJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*50fc853eSJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*50fc853eSJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*50fc853eSJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*50fc853eSJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*50fc853eSJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*50fc853eSJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*50fc853eSJohn Marino * SUCH DAMAGE. 28*50fc853eSJohn Marino */ 29*50fc853eSJohn Marino 30*50fc853eSJohn Marino #if !defined(__COLL_H__) 31*50fc853eSJohn Marino #define __COLL_H__ 32*50fc853eSJohn Marino 33*50fc853eSJohn Marino #include "bwstring.h" 34*50fc853eSJohn Marino #include "sort.h" 35*50fc853eSJohn Marino 36*50fc853eSJohn Marino /* 37*50fc853eSJohn Marino * Sort hint data for -n 38*50fc853eSJohn Marino */ 39*50fc853eSJohn Marino struct n_hint 40*50fc853eSJohn Marino { 41*50fc853eSJohn Marino unsigned long long n1; 42*50fc853eSJohn Marino unsigned char si; 43*50fc853eSJohn Marino bool empty; 44*50fc853eSJohn Marino bool neg; 45*50fc853eSJohn Marino }; 46*50fc853eSJohn Marino 47*50fc853eSJohn Marino /* 48*50fc853eSJohn Marino * Sort hint data for -g 49*50fc853eSJohn Marino */ 50*50fc853eSJohn Marino struct g_hint 51*50fc853eSJohn Marino { 52*50fc853eSJohn Marino double d; 53*50fc853eSJohn Marino bool nan; 54*50fc853eSJohn Marino bool notnum; 55*50fc853eSJohn Marino }; 56*50fc853eSJohn Marino 57*50fc853eSJohn Marino /* 58*50fc853eSJohn Marino * Sort hint data for -M 59*50fc853eSJohn Marino */ 60*50fc853eSJohn Marino struct M_hint 61*50fc853eSJohn Marino { 62*50fc853eSJohn Marino int m; 63*50fc853eSJohn Marino }; 64*50fc853eSJohn Marino 65*50fc853eSJohn Marino /* 66*50fc853eSJohn Marino * Status of a sort hint object 67*50fc853eSJohn Marino */ 68*50fc853eSJohn Marino typedef enum 69*50fc853eSJohn Marino { 70*50fc853eSJohn Marino HS_ERROR = -1, HS_UNINITIALIZED = 0, HS_INITIALIZED = 1 71*50fc853eSJohn Marino } hint_status; 72*50fc853eSJohn Marino 73*50fc853eSJohn Marino /* 74*50fc853eSJohn Marino * Sort hint object 75*50fc853eSJohn Marino */ 76*50fc853eSJohn Marino struct key_hint 77*50fc853eSJohn Marino { 78*50fc853eSJohn Marino hint_status status; 79*50fc853eSJohn Marino union 80*50fc853eSJohn Marino { 81*50fc853eSJohn Marino struct n_hint nh; 82*50fc853eSJohn Marino struct g_hint gh; 83*50fc853eSJohn Marino struct M_hint Mh; 84*50fc853eSJohn Marino } v; 85*50fc853eSJohn Marino }; 86*50fc853eSJohn Marino 87*50fc853eSJohn Marino /* 88*50fc853eSJohn Marino * Key value 89*50fc853eSJohn Marino */ 90*50fc853eSJohn Marino struct key_value 91*50fc853eSJohn Marino { 92*50fc853eSJohn Marino struct bwstring *k; /* key string */ 93*50fc853eSJohn Marino struct key_hint hint[0]; /* key sort hint */ 94*50fc853eSJohn Marino }; 95*50fc853eSJohn Marino 96*50fc853eSJohn Marino /* 97*50fc853eSJohn Marino * Set of keys container object. 98*50fc853eSJohn Marino */ 99*50fc853eSJohn Marino struct keys_array 100*50fc853eSJohn Marino { 101*50fc853eSJohn Marino struct key_value key[0]; 102*50fc853eSJohn Marino }; 103*50fc853eSJohn Marino 104*50fc853eSJohn Marino /* 105*50fc853eSJohn Marino * Parsed -k option data 106*50fc853eSJohn Marino */ 107*50fc853eSJohn Marino struct key_specs 108*50fc853eSJohn Marino { 109*50fc853eSJohn Marino struct sort_mods sm; 110*50fc853eSJohn Marino size_t c1; 111*50fc853eSJohn Marino size_t c2; 112*50fc853eSJohn Marino size_t f1; 113*50fc853eSJohn Marino size_t f2; 114*50fc853eSJohn Marino bool pos1b; 115*50fc853eSJohn Marino bool pos2b; 116*50fc853eSJohn Marino }; 117*50fc853eSJohn Marino 118*50fc853eSJohn Marino /* 119*50fc853eSJohn Marino * Single entry in sort list. 120*50fc853eSJohn Marino */ 121*50fc853eSJohn Marino struct sort_list_item 122*50fc853eSJohn Marino { 123*50fc853eSJohn Marino struct bwstring *str; 124*50fc853eSJohn Marino struct keys_array ka; 125*50fc853eSJohn Marino }; 126*50fc853eSJohn Marino 127*50fc853eSJohn Marino /* 128*50fc853eSJohn Marino * Function type, used to compare two list objects 129*50fc853eSJohn Marino */ 130*50fc853eSJohn Marino typedef int (*listcoll_t)(struct sort_list_item **ss1, struct sort_list_item **ss2); 131*50fc853eSJohn Marino 132*50fc853eSJohn Marino extern struct key_specs *keys; 133*50fc853eSJohn Marino extern size_t keys_num; 134*50fc853eSJohn Marino 135*50fc853eSJohn Marino /* 136*50fc853eSJohn Marino * Main localised symbols. These must be wint_t as they may hold WEOF. 137*50fc853eSJohn Marino */ 138*50fc853eSJohn Marino extern wint_t symbol_decimal_point; 139*50fc853eSJohn Marino extern wint_t symbol_thousands_sep; 140*50fc853eSJohn Marino extern wint_t symbol_negative_sign; 141*50fc853eSJohn Marino extern wint_t symbol_positive_sign; 142*50fc853eSJohn Marino 143*50fc853eSJohn Marino /* funcs */ 144*50fc853eSJohn Marino 145*50fc853eSJohn Marino cmpcoll_t get_sort_func(struct sort_mods *sm); 146*50fc853eSJohn Marino 147*50fc853eSJohn Marino struct keys_array *keys_array_alloc(void); 148*50fc853eSJohn Marino size_t keys_array_size(void); 149*50fc853eSJohn Marino void set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind); 150*50fc853eSJohn Marino void clean_keys_array(const struct bwstring *s, struct keys_array *ka); 151*50fc853eSJohn Marino 152*50fc853eSJohn Marino struct sort_list_item *sort_list_item_alloc(void); 153*50fc853eSJohn Marino void sort_list_item_set(struct sort_list_item *si, struct bwstring *str); 154*50fc853eSJohn Marino void sort_list_item_clean(struct sort_list_item *si); 155*50fc853eSJohn Marino size_t sort_list_item_size(struct sort_list_item *si); 156*50fc853eSJohn Marino 157*50fc853eSJohn Marino int preproc(struct bwstring *s, struct keys_array *ka); 158*50fc853eSJohn Marino int top_level_str_coll(const struct bwstring *, const struct bwstring *); 159*50fc853eSJohn Marino int key_coll(struct keys_array *ks1, struct keys_array *ks2, size_t offset); 160*50fc853eSJohn Marino int str_list_coll(struct bwstring *str1, struct sort_list_item **ss2); 161*50fc853eSJohn Marino int list_coll_by_str_only(struct sort_list_item **ss1, struct sort_list_item **ss2); 162*50fc853eSJohn Marino int list_coll(struct sort_list_item **ss1, struct sort_list_item **ss2); 163*50fc853eSJohn Marino int list_coll_offset(struct sort_list_item **ss1, struct sort_list_item **ss2, size_t offset); 164*50fc853eSJohn Marino 165*50fc853eSJohn Marino listcoll_t get_list_call_func(size_t offset); 166*50fc853eSJohn Marino 167*50fc853eSJohn Marino #endif /* __COLL_H__ */ 168