1 |
|
|
/* $OpenBSD: bwstring.h,v 1.2 2015/12/31 16:09:31 millert Exp $ */ |
2 |
|
|
|
3 |
|
|
/*- |
4 |
|
|
* Copyright (C) 2009 Gabor Kovesdan <gabor@FreeBSD.org> |
5 |
|
|
* Copyright (C) 2012 Oleg Moskalenko <mom040267@gmail.com> |
6 |
|
|
* All rights reserved. |
7 |
|
|
* |
8 |
|
|
* Redistribution and use in source and binary forms, with or without |
9 |
|
|
* modification, are permitted provided that the following conditions |
10 |
|
|
* are met: |
11 |
|
|
* 1. Redistributions of source code must retain the above copyright |
12 |
|
|
* notice, this list of conditions and the following disclaimer. |
13 |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
14 |
|
|
* notice, this list of conditions and the following disclaimer in the |
15 |
|
|
* documentation and/or other materials provided with the distribution. |
16 |
|
|
* |
17 |
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
18 |
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
19 |
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
20 |
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
21 |
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
22 |
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
23 |
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
24 |
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
25 |
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
26 |
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
27 |
|
|
* SUCH DAMAGE. |
28 |
|
|
*/ |
29 |
|
|
|
30 |
|
|
#if !defined(__BWSTRING_H__) |
31 |
|
|
#define __BWSTRING_H__ |
32 |
|
|
|
33 |
|
|
#include <stdbool.h> |
34 |
|
|
#include <stdio.h> |
35 |
|
|
#include <errno.h> |
36 |
|
|
#include <wchar.h> |
37 |
|
|
|
38 |
|
|
#include "mem.h" |
39 |
|
|
|
40 |
|
|
extern bool byte_sort; |
41 |
|
|
extern size_t sort_mb_cur_max; |
42 |
|
|
|
43 |
|
|
/* wchar_t is of 4 bytes: */ |
44 |
|
|
#define SIZEOF_WCHAR_STRING(LEN) ((LEN)*sizeof(wchar_t)) |
45 |
|
|
|
46 |
|
|
/* |
47 |
|
|
* Binary "wide" string |
48 |
|
|
*/ |
49 |
|
|
struct bwstring { |
50 |
|
|
size_t len; |
51 |
|
|
union |
52 |
|
|
{ |
53 |
|
|
wchar_t wstr[0]; |
54 |
|
|
unsigned char cstr[0]; |
55 |
|
|
} data; |
56 |
|
|
}; |
57 |
|
|
|
58 |
|
|
struct reader_buffer { |
59 |
|
|
wchar_t *fgetwln_z_buffer; |
60 |
|
|
size_t fgetwln_z_buffer_size; |
61 |
|
|
}; |
62 |
|
|
|
63 |
|
|
typedef void *bwstring_iterator; |
64 |
|
|
|
65 |
|
|
#define BWSLEN(s) ((s)->len) |
66 |
|
|
|
67 |
|
|
struct bwstring *bwsalloc(size_t sz); |
68 |
|
|
|
69 |
|
|
size_t bwsrawlen(const struct bwstring *bws); |
70 |
|
|
const void* bwsrawdata(const struct bwstring *bws); |
71 |
|
|
void bws_setlen(struct bwstring *bws, size_t newlen); |
72 |
|
|
size_t bws_memsize(const struct bwstring *bws); |
73 |
|
|
double bwstod(struct bwstring *s0, bool *empty); |
74 |
|
|
int bws_month_score(const struct bwstring *s0); |
75 |
|
|
|
76 |
|
|
struct bwstring *ignore_leading_blanks(struct bwstring *str); |
77 |
|
|
struct bwstring *ignore_nonprinting(struct bwstring *str); |
78 |
|
|
struct bwstring *dictionary_order(struct bwstring *str); |
79 |
|
|
struct bwstring *ignore_case(struct bwstring *str); |
80 |
|
|
|
81 |
|
|
void bwsprintf(FILE*, struct bwstring*, const char *prefix, const char *suffix); |
82 |
|
|
void bws_disorder_warnx(struct bwstring *s, const char *fn, size_t pos); |
83 |
|
|
|
84 |
|
|
struct bwstring *bwsdup(const struct bwstring *s); |
85 |
|
|
struct bwstring *bwssbdup(const wchar_t *str, size_t size); |
86 |
|
|
struct bwstring *bwscsbdup(const unsigned char *str, size_t size); |
87 |
|
|
void bwsfree(struct bwstring *s); |
88 |
|
|
size_t bwscpy(struct bwstring *dst, const struct bwstring *src); |
89 |
|
|
struct bwstring *bwsncpy(struct bwstring *dst, const struct bwstring *src, size_t size); |
90 |
|
|
struct bwstring *bwsnocpy(struct bwstring *dst, const struct bwstring *src, size_t offset, size_t size); |
91 |
|
|
int bwscmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset); |
92 |
|
|
int bwsncmp(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset, size_t len); |
93 |
|
|
int bwscoll(const struct bwstring *bws1, const struct bwstring *bws2, size_t offset); |
94 |
|
|
size_t bwsfwrite(struct bwstring *bws, FILE *f, bool zero_ended); |
95 |
|
|
struct bwstring *bwsfgetln(FILE *file, size_t *len, bool zero_ended, struct reader_buffer *rb); |
96 |
|
|
|
97 |
|
|
static inline bwstring_iterator |
98 |
|
|
bws_begin(struct bwstring *bws) |
99 |
|
|
{ |
100 |
|
|
|
101 |
|
57160610 |
return (bwstring_iterator) (&(bws->data)); |
102 |
|
|
} |
103 |
|
|
|
104 |
|
|
static inline bwstring_iterator |
105 |
|
|
bws_end(struct bwstring *bws) |
106 |
|
|
{ |
107 |
|
|
|
108 |
|
|
return ((sort_mb_cur_max == 1) ? |
109 |
|
|
(bwstring_iterator) (bws->data.cstr + bws->len) : |
110 |
|
|
(bwstring_iterator) (bws->data.wstr + bws->len)); |
111 |
|
|
} |
112 |
|
|
|
113 |
|
|
static inline bwstring_iterator |
114 |
|
|
bws_iterator_inc(bwstring_iterator iter, size_t pos) |
115 |
|
|
{ |
116 |
|
|
|
117 |
✓✗ |
457337838 |
if (sort_mb_cur_max == 1) |
118 |
|
228668919 |
return ((unsigned char *) iter) + pos; |
119 |
|
|
else |
120 |
|
|
return ((wchar_t*) iter) + pos; |
121 |
|
228668919 |
} |
122 |
|
|
|
123 |
|
|
static inline wchar_t |
124 |
|
|
bws_get_iter_value(bwstring_iterator iter) |
125 |
|
|
{ |
126 |
|
|
|
127 |
✓✗ |
1257787800 |
if (sort_mb_cur_max == 1) |
128 |
|
628893900 |
return *((unsigned char *) iter); |
129 |
|
|
else |
130 |
|
|
return *((wchar_t*) iter); |
131 |
|
628893900 |
} |
132 |
|
|
|
133 |
|
|
int |
134 |
|
|
bws_iterator_cmp(bwstring_iterator iter1, bwstring_iterator iter2, size_t len); |
135 |
|
|
|
136 |
|
|
#define BWS_GET(bws, pos) ((sort_mb_cur_max == 1) ? ((bws)->data.cstr[(pos)]) : (bws)->data.wstr[(pos)]) |
137 |
|
|
|
138 |
|
|
void initialise_months(void); |
139 |
|
|
|
140 |
|
|
#endif /* __BWSTRING_H__ */ |