altprintf 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 30fe21097d8d96fc45f13bf03bc0c66c73cabd30e27d9a5829d33022e54d21fb
4
- data.tar.gz: 2e3974374ac51f2f6750cdf48b660711ac9c4de60c14a9ba3c239a345cf9541d
3
+ metadata.gz: f63f172e7adfa43e47580f1c3372cbfb47b5ef09a019b75867ad2e22bbeb40df
4
+ data.tar.gz: 1ffef927437beb637f22e4a6661ceb07d328debf699a88fcc26154d13dd4b118
5
5
  SHA512:
6
- metadata.gz: 5dfa57f474993381bd7c9c5704b09a867d02795abaa10f6fda6bc6a64a76b6c970bc80af41f225ef6dd98b610013b75eb2b101661dddea7e7407f06f3dc21bb2
7
- data.tar.gz: 95b00d639a18eaccb25105c80129cab7f651c7f3cb5bcc0836177c06ad0170548e8abd6849e48efed84fca54c1750b411f5f736c87e4e1940488e41a1d5c5b67
6
+ metadata.gz: 99ff97d971d496a5696a54bbaf2b91ae382beb829977e50b01b53fa02d258d60f1ebe575fc237e1ec0026dc78aa7ca843c0493425f9e29d1f422c09f36b78c8b
7
+ data.tar.gz: a4ffaab4d5e5af7f0fa97cefb52783acbab60de1d98579ea8a6063be1f4b60c1d01cef532fa5fbefe4ddfd04a1587120cee8dbad782722d0dfb99ab77989396a
@@ -1,26 +1,27 @@
1
1
  require 'date'
2
2
  require_relative 'lib/altprintf/version'
3
3
 
4
- Altprintf::SPEC = Gem::Specification.new do |s|
5
- s.name = 'altprintf'
6
- s.version = Altprintf::VERSION.join('.')
7
- s.date = Date.today.strftime('%Y-%m-%d')
8
- s.summary = 'A powerful printf-like template language'
9
- s.authors = ['Stone Tickle']
10
- s.email = 'lattis@mochiro.moe'
11
- s.homepage = 'https://github.com/annacrombie/altprintf/tree/master/gem'
12
- s.license = 'MIT'
4
+ module Altprintf
5
+ SPEC ||=
6
+ Gem::Specification.new do |s|
7
+ s.name = 'altprintf'
8
+ s.version = ::Altprintf::VERSION.join('.')
9
+ s.date = Date.today.strftime('%Y-%m-%d')
10
+ s.summary = 'A powerful printf-like template language'
11
+ s.authors = ['Stone Tickle']
12
+ s.email = 'lattis@mochiro.moe'
13
+ s.homepage = 'https://github.com/annacrombie/altprintf/tree/master/gem'
14
+ s.license = 'MIT'
13
15
 
14
- s.files = Dir['{**/*}'] - ['Rakefile']
16
+ s.files = Dir['{**/*}']
17
+ s.extensions = Dir["ext/**/extconf.rb"]
18
+ s.require_paths = ['lib']
15
19
 
16
- s.platform = Gem::Platform::RUBY
17
- s.extensions = Dir["ext/**/extconf.rb"]
18
- s.require_paths = ['lib']
19
-
20
- s.required_ruby_version = '>= 2.5.7'
21
-
22
- s.add_development_dependency 'benchmark-ips', '~> 2.7'
23
- s.add_development_dependency 'rake-compiler', '~> 1.0'
24
- s.add_development_dependency 'rake', '~> 12.3'
25
- s.add_development_dependency 'rspec', '~> 3.9'
26
- end unless Altprintf.const_defined?(:'SPEC')
20
+ s.platform = Gem::Platform::RUBY
21
+ s.required_ruby_version = '>= 2.5.7'
22
+ s.add_development_dependency 'benchmark-ips', '~> 2.7'
23
+ s.add_development_dependency 'rake-compiler', '~> 1.0'
24
+ s.add_development_dependency 'rake', '~> 12.3'
25
+ s.add_development_dependency 'rspec', '~> 3.9'
26
+ end
27
+ end
@@ -0,0 +1,277 @@
1
+ /*
2
+ * This is an implementation of wcwidth() and wcswidth() (defined in
3
+ * IEEE Std 1002.1-2001) for Unicode.
4
+ *
5
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
6
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
7
+ *
8
+ * In fixed-width output devices, Latin characters all occupy a single
9
+ * "cell" position of equal width, whereas ideographic CJK characters
10
+ * occupy two such cells. Interoperability between terminal-line
11
+ * applications and (teletype-style) character terminals using the
12
+ * UTF-8 encoding requires agreement on which character should advance
13
+ * the cursor by how many cell positions. No established formal
14
+ * standards exist at present on which Unicode character shall occupy
15
+ * how many cell positions on character terminals. These routines are
16
+ * a first attempt of defining such behavior based on simple rules
17
+ * applied to data provided by the Unicode Consortium.
18
+ *
19
+ * For some graphical characters, the Unicode standard explicitly
20
+ * defines a character-cell width via the definition of the East Asian
21
+ * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes.
22
+ * In all these cases, there is no ambiguity about which width a
23
+ * terminal shall use. For characters in the East Asian Ambiguous (A)
24
+ * class, the width choice depends purely on a preference of backward
25
+ * compatibility with either historic CJK or Western practice.
26
+ * Choosing single-width for these characters is easy to justify as
27
+ * the appropriate long-term solution, as the CJK practice of
28
+ * displaying these characters as double-width comes from historic
29
+ * implementation simplicity (8-bit encoded characters were displayed
30
+ * single-width and 16-bit ones double-width, even for Greek,
31
+ * Cyrillic, etc.) and not any typographic considerations.
32
+ *
33
+ * Much less clear is the choice of width for the Not East Asian
34
+ * (Neutral) class. Existing practice does not dictate a width for any
35
+ * of these characters. It would nevertheless make sense
36
+ * typographically to allocate two character cells to characters such
37
+ * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be
38
+ * represented adequately with a single-width glyph. The following
39
+ * routines at present merely assign a single-cell width to all
40
+ * neutral characters, in the interest of simplicity. This is not
41
+ * entirely satisfactory and should be reconsidered before
42
+ * establishing a formal standard in this area. At the moment, the
43
+ * decision which Not East Asian (Neutral) characters should be
44
+ * represented by double-width glyphs cannot yet be answered by
45
+ * applying a simple rule from the Unicode database content. Setting
46
+ * up a proper standard for the behavior of UTF-8 character terminals
47
+ * will require a careful analysis not only of each Unicode character,
48
+ * but also of each presentation form, something the author of these
49
+ * routines has avoided to do so far.
50
+ *
51
+ * http://www.unicode.org/unicode/reports/tr11/
52
+ *
53
+ * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
54
+ *
55
+ * Permission to use, copy, modify, and distribute this software
56
+ * for any purpose and without fee is hereby granted. The author
57
+ * disclaims all warranties with regard to this software.
58
+ *
59
+ * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
60
+ *
61
+ * ---
62
+ *
63
+ * Stone Tickle -- 2019 - 10 - 16
64
+ *
65
+ *
66
+ * Removal of *_cjk functions
67
+ * Functions altered to take long codepoint rather than wchar_t
68
+ * Function added to convert utf8 string to codepoint
69
+ * Functions added to get width of utf8 strings / chars
70
+ */
71
+
72
+ #include <string.h>
73
+ #include <stdlib.h>
74
+
75
+ struct interval {
76
+ int first;
77
+ int last;
78
+ };
79
+
80
+ /* auxiliary function for binary search in interval table */
81
+ static int bisearch(long ucs, const struct interval *table, int max)
82
+ {
83
+ int min = 0;
84
+ int mid;
85
+
86
+ if (ucs < table[0].first || ucs > table[max].last)
87
+ return 0;
88
+ while (max >= min) {
89
+ mid = (min + max) / 2;
90
+ if (ucs > table[mid].last)
91
+ min = mid + 1;
92
+ else if (ucs < table[mid].first)
93
+ max = mid - 1;
94
+ else
95
+ return 1;
96
+ }
97
+
98
+ return 0;
99
+ }
100
+
101
+
102
+ /* The following two functions define the column width of an ISO 10646
103
+ * character as follows:
104
+ *
105
+ * - The null character (U+0000) has a column width of 0.
106
+ *
107
+ * - Other C0/C1 control characters and DEL will lead to a return
108
+ * value of -1.
109
+ *
110
+ * - Non-spacing and enclosing combining characters (general
111
+ * category code Mn or Me in the Unicode database) have a
112
+ * column width of 0.
113
+ *
114
+ * - SOFT HYPHEN (U+00AD) has a column width of 1.
115
+ *
116
+ * - Other format characters (general category code Cf in the Unicode
117
+ * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
118
+ *
119
+ * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
120
+ * have a column width of 0.
121
+ *
122
+ * - Spacing characters in the East Asian Wide (W) or East Asian
123
+ * Full-width (F) category as defined in Unicode Technical
124
+ * Report #11 have a column width of 2.
125
+ *
126
+ * - All remaining characters (including all printable
127
+ * ISO 8859-1 and WGL4 characters, Unicode control characters,
128
+ * etc.) have a column width of 1.
129
+ *
130
+ * This implementation assumes that wchar_t characters are encoded
131
+ * in ISO 10646.
132
+ */
133
+
134
+ static int cpwidth(long ucs)
135
+ {
136
+ /* sorted list of non-overlapping intervals of non-spacing characters */
137
+ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
138
+ static const struct interval combining[] = {
139
+ { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
140
+ { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
141
+ { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 },
142
+ { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 },
143
+ { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
144
+ { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
145
+ { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 },
146
+ { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D },
147
+ { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 },
148
+ { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD },
149
+ { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C },
150
+ { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D },
151
+ { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
152
+ { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
153
+ { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
154
+ { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D },
155
+ { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 },
156
+ { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
157
+ { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC },
158
+ { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
159
+ { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
160
+ { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
161
+ { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
162
+ { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
163
+ { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
164
+ { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
165
+ { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
166
+ { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
167
+ { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
168
+ { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F },
169
+ { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
170
+ { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
171
+ { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
172
+ { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
173
+ { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
174
+ { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
175
+ { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
176
+ { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
177
+ { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
178
+ { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
179
+ { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
180
+ { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
181
+ { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
182
+ { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
183
+ { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
184
+ { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
185
+ { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
186
+ { 0xE0100, 0xE01EF }
187
+ };
188
+
189
+ /* test for 8-bit control characters */
190
+ if (ucs == 0)
191
+ return 0;
192
+ if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0))
193
+ return -1;
194
+
195
+ /* binary search in table of non-spacing characters */
196
+ if (bisearch(ucs, combining,
197
+ sizeof(combining) / sizeof(struct interval) - 1))
198
+ return 0;
199
+
200
+ /* if we arrive here, ucs is not a combining or C0/C1 control character */
201
+
202
+ return 1 +
203
+ (ucs >= 0x1100 &&
204
+ (ucs <= 0x115f || /* Hangul Jamo init. consonants */
205
+ ucs == 0x2329 || ucs == 0x232a ||
206
+ (ucs >= 0x2e80 && ucs <= 0xa4cf &&
207
+ ucs != 0x303f) || /* CJK ... Yi */
208
+ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
209
+ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
210
+ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */
211
+ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
212
+ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */
213
+ (ucs >= 0xffe0 && ucs <= 0xffe6) ||
214
+ (ucs >= 0x20000 && ucs <= 0x2fffd) ||
215
+ (ucs >= 0x30000 && ucs <= 0x3fffd)));
216
+ }
217
+
218
+ static int codepoint(const char *utf8, long *res)
219
+ {
220
+ int bytes, i;
221
+ unsigned char c;
222
+ unsigned long cp;
223
+
224
+ bytes = 0;
225
+ c = utf8[0];
226
+
227
+ if ((c & 0x7f) == c) {
228
+ cp = c & 0x7f;
229
+ bytes = 0;
230
+ } else if ((c & 0xdf) == c) {
231
+ cp = c & 0x1f;
232
+ bytes = 1;
233
+ } else if ((c & 0xef) == c) {
234
+ cp = c & 0x0f;
235
+ bytes = 2;
236
+ } else if ((c & 0xf7) == c) {
237
+ cp = c & 0x07;
238
+ bytes = 3;
239
+ } else {
240
+ return 0;
241
+ }
242
+
243
+ for (i = 0; i < bytes; i++) {
244
+ cp <<= 6;
245
+ cp |= ((unsigned char)utf8[i + 1] & 0x3f);
246
+ }
247
+
248
+ *res = cp;
249
+ return bytes + 1;
250
+ }
251
+
252
+ int cwidth(const char* utf8)
253
+ {
254
+ long cp;
255
+
256
+ codepoint(utf8, &cp);
257
+ return cpwidth(cp);
258
+ }
259
+
260
+ int cswidth(const char *utf8, size_t maxlen)
261
+ {
262
+ int w = 0;
263
+ long cp;
264
+ size_t i, len;
265
+
266
+ len = strlen(utf8);
267
+
268
+ for (i = 0; i < len;) {
269
+ i += codepoint(&utf8[i], &cp);
270
+ w += cpwidth(cp);
271
+
272
+ if (i > maxlen)
273
+ break;
274
+ }
275
+
276
+ return w;
277
+ }
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative 'extconf_helper'
4
+ ExtconfHelper.setup
@@ -33,6 +33,6 @@ module ExtconfHelper
33
33
  end
34
34
 
35
35
  create_header
36
- create_makefile('altprintf')
36
+ create_makefile('altprintf/altprintf')
37
37
  end
38
38
  end
@@ -1,3 +1,3 @@
1
1
  module Altprintf
2
- VERSION = [0, 3, 0]
2
+ VERSION ||= [0, 3, 1]
3
3
  end
data/readme.md CHANGED
@@ -14,3 +14,33 @@ argument is accepted:
14
14
 
15
15
  + `<val>` - access the value of the given hash with key `val` rather than
16
16
  try to read the next argument.
17
+
18
+ ## Setup
19
+
20
+ ``sh
21
+ $ bundle install
22
+ ``
23
+
24
+ ## Compiling
25
+
26
+ First, you must build `libaltprintf` with the build directory set to `build`.
27
+
28
+ Then,
29
+
30
+ ```sh
31
+ $ rake compile
32
+ ```
33
+
34
+ ## Running tests
35
+
36
+ Note: You must also have built the cli.
37
+
38
+ ```sh
39
+ $ rspec
40
+ ```
41
+
42
+ ## Building the gem
43
+
44
+ ```sh
45
+ $ rake gem:build
46
+ ```
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: altprintf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stone Tickle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-19 00:00:00.000000000 Z
11
+ date: 2019-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -69,7 +69,8 @@ dependencies:
69
69
  description:
70
70
  email: lattis@mochiro.moe
71
71
  executables: []
72
- extensions: []
72
+ extensions:
73
+ - ext/altprintf/extconf.rb
73
74
  extra_rdoc_files: []
74
75
  files:
75
76
  - altprintf.gemspec
@@ -82,16 +83,16 @@ files:
82
83
  - ext/altprintf/altprintf/parsef.h
83
84
  - ext/altprintf/altprintf/strbuf.h
84
85
  - ext/altprintf/altprintf/syntax.h
86
+ - ext/altprintf/cwidth.c
85
87
  - ext/altprintf/ext.c
86
88
  - ext/altprintf/extconf.h
89
+ - ext/altprintf/extconf.rb
87
90
  - ext/altprintf/extconf_helper.rb
88
91
  - ext/altprintf/fmt.c
89
92
  - ext/altprintf/fmte.c
90
93
  - ext/altprintf/parsef.c
91
94
  - ext/altprintf/strbuf.c
92
95
  - lib/altprintf.rb
93
- - lib/altprintf/alt_printf.so
94
- - lib/altprintf/altprintf.so
95
96
  - lib/altprintf/version.rb
96
97
  - readme.md
97
98
  homepage: https://github.com/annacrombie/altprintf/tree/master/gem
Binary file
Binary file