altprintf 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/altprintf.gemspec +3 -1
- data/ext/altprintf/altprintf/altprintf.h +8 -0
- data/ext/altprintf/altprintf/cwidth.h +6 -0
- data/ext/altprintf/{enums.h → altprintf/enums.h} +2 -3
- data/ext/altprintf/altprintf/fmt.h +5 -0
- data/ext/altprintf/{fmte.h → altprintf/fmte.h} +8 -11
- data/ext/altprintf/{log.h → altprintf/log.h} +0 -0
- data/ext/altprintf/altprintf/parsef.h +6 -0
- data/ext/altprintf/altprintf/strbuf.h +25 -0
- data/ext/altprintf/{syntax.h → altprintf/syntax.h} +3 -4
- data/ext/altprintf/ext.c +37 -63
- data/ext/altprintf/extconf_helper.rb +14 -11
- data/ext/altprintf/fmt.c +29 -19
- data/ext/altprintf/fmte.c +13 -9
- data/ext/altprintf/parsef.c +32 -30
- data/ext/altprintf/strbuf.c +53 -45
- data/lib/altprintf/altprintf.so +0 -0
- data/lib/altprintf/version.rb +1 -1
- metadata +40 -11
- data/ext/altprintf/altprintf.h +0 -6
- data/ext/altprintf/fmt.h +0 -9
- data/ext/altprintf/parsef.h +0 -10
- data/ext/altprintf/strbuf.h +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30fe21097d8d96fc45f13bf03bc0c66c73cabd30e27d9a5829d33022e54d21fb
|
4
|
+
data.tar.gz: 2e3974374ac51f2f6750cdf48b660711ac9c4de60c14a9ba3c239a345cf9541d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dfa57f474993381bd7c9c5704b09a867d02795abaa10f6fda6bc6a64a76b6c970bc80af41f225ef6dd98b610013b75eb2b101661dddea7e7407f06f3dc21bb2
|
7
|
+
data.tar.gz: 95b00d639a18eaccb25105c80129cab7f651c7f3cb5bcc0836177c06ad0170548e8abd6849e48efed84fca54c1750b411f5f736c87e4e1940488e41a1d5c5b67
|
data/altprintf.gemspec
CHANGED
@@ -17,8 +17,10 @@ Altprintf::SPEC = Gem::Specification.new do |s|
|
|
17
17
|
s.extensions = Dir["ext/**/extconf.rb"]
|
18
18
|
s.require_paths = ['lib']
|
19
19
|
|
20
|
-
s.required_ruby_version = '>= 2.5.
|
20
|
+
s.required_ruby_version = '>= 2.5.7'
|
21
21
|
|
22
|
+
s.add_development_dependency 'benchmark-ips', '~> 2.7'
|
22
23
|
s.add_development_dependency 'rake-compiler', '~> 1.0'
|
23
24
|
s.add_development_dependency 'rake', '~> 12.3'
|
25
|
+
s.add_development_dependency 'rspec', '~> 3.9'
|
24
26
|
end unless Altprintf.const_defined?(:'SPEC')
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#ifndef
|
2
|
-
#define
|
1
|
+
#ifndef _ALTPRINTF_ENUM_H
|
2
|
+
#define _ALTPRINTF_ENUM_H
|
3
3
|
enum arg_type { FMul, FTern, FAlign, FInt, FChar, FDouble, FString, FRaw, FNone,
|
4
4
|
FEnd };
|
5
5
|
enum align { Left, Right, Center };
|
@@ -11,5 +11,4 @@ enum altprintf_err {
|
|
11
11
|
};
|
12
12
|
|
13
13
|
extern enum altprintf_err apf_err;
|
14
|
-
|
15
14
|
#endif
|
@@ -1,23 +1,20 @@
|
|
1
1
|
#ifndef FMTE_H_
|
2
2
|
#define FMTE_H_
|
3
|
-
#include <wchar.h>
|
4
3
|
#include <stdlib.h>
|
5
|
-
#include <
|
6
|
-
#include "enums.h"
|
7
|
-
#include "log.h"
|
4
|
+
#include <altprintf/enums.h>
|
8
5
|
|
9
6
|
struct fmte {
|
10
|
-
|
11
|
-
|
7
|
+
const char *parenarg_start;
|
8
|
+
const char *parenarg_end;
|
12
9
|
size_t parenarg_len;
|
13
10
|
|
14
|
-
|
15
|
-
|
11
|
+
const char *anglearg_start;
|
12
|
+
const char *anglearg_end;
|
16
13
|
size_t anglearg_len;
|
17
14
|
|
18
|
-
|
15
|
+
char chararg;
|
19
16
|
|
20
|
-
|
17
|
+
char padchar;
|
21
18
|
|
22
19
|
enum arg_type type;
|
23
20
|
enum align align;
|
@@ -30,7 +27,7 @@ struct fmte {
|
|
30
27
|
struct fmte *next;
|
31
28
|
};
|
32
29
|
|
33
|
-
struct fmte *fmte_ini();
|
30
|
+
struct fmte *fmte_ini(void);
|
34
31
|
void fmte_inspect(struct fmte *);
|
35
32
|
void fmte_push(struct fmte *, struct fmte *);
|
36
33
|
void fmte_destroy(struct fmte *);
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#ifndef STRBUF_H
|
2
|
+
#define STRBUF_H
|
3
|
+
#include <stdlib.h>
|
4
|
+
|
5
|
+
struct strbuf *strbuf_new(void);
|
6
|
+
void strbuf_destroy(struct strbuf *sb);
|
7
|
+
void strbuf_append(struct strbuf *sb, char);
|
8
|
+
void strbuf_append_char(struct strbuf *sb, const void *);
|
9
|
+
void strbuf_append_str(struct strbuf *, const void *, int);
|
10
|
+
void strbuf_append_int(struct strbuf *sb, const void *);
|
11
|
+
void strbuf_append_double(struct strbuf *, const void *, int);
|
12
|
+
void strbuf_append_strbuf(struct strbuf *, const void *);
|
13
|
+
void strbuf_appendw_strbuf(struct strbuf *, const void *, long);
|
14
|
+
void strbuf_pad(struct strbuf *, char, int);
|
15
|
+
char *strbuf_cstr(struct strbuf *);
|
16
|
+
size_t strbuf_width(struct strbuf *);
|
17
|
+
|
18
|
+
struct strbuf {
|
19
|
+
char *start;
|
20
|
+
char *end;
|
21
|
+
size_t len;
|
22
|
+
size_t width;
|
23
|
+
size_t cap;
|
24
|
+
};
|
25
|
+
#endif
|
@@ -4,7 +4,7 @@
|
|
4
4
|
#define FS_START '%'
|
5
5
|
#define FS_DOUBLE_SEP '.'
|
6
6
|
|
7
|
-
#define FS_ESC
|
7
|
+
#define FS_ESC '\\'
|
8
8
|
#define FS_ESC_NL 'n'
|
9
9
|
#define FS_ESC_ESC 'e'
|
10
10
|
|
@@ -24,12 +24,11 @@
|
|
24
24
|
#define FS_A_CHARARG '~'
|
25
25
|
#define FS_A_LALIGN '-'
|
26
26
|
#define FS_A_CALIGN '^'
|
27
|
-
#define
|
28
|
-
#define FS_A_ZPAD '0'
|
27
|
+
#define FS_A_PAD '_'
|
29
28
|
#define FS_A_PREC '.'
|
30
29
|
|
31
30
|
#define FS_D_PREC 100
|
32
31
|
|
33
|
-
#define EOS
|
32
|
+
#define EOS '\0'
|
34
33
|
|
35
34
|
#endif
|
data/ext/altprintf/ext.c
CHANGED
@@ -9,56 +9,40 @@
|
|
9
9
|
#include "extconf.h"
|
10
10
|
#include <stdio.h>
|
11
11
|
#include <locale.h>
|
12
|
-
#include <wchar.h>
|
13
12
|
#include <ruby.h>
|
14
13
|
#include <ruby/encoding.h>
|
15
|
-
#include
|
16
|
-
#include
|
14
|
+
#include <altprintf/altprintf.h>
|
15
|
+
#include <altprintf/log.h>
|
17
16
|
|
18
17
|
#define MODNAME "Altprintf"
|
19
18
|
|
20
19
|
rb_encoding *enc;
|
21
20
|
|
22
|
-
|
21
|
+
char *rbstocs(VALUE *rbstr)
|
23
22
|
{
|
24
|
-
|
25
|
-
|
26
|
-
size_t len;
|
27
|
-
|
28
|
-
cstr = StringValueCStr(str);
|
29
|
-
|
30
|
-
len = mbsrtowcs(NULL, &cstr, 0, NULL);
|
31
|
-
wstr = calloc(len + 1, sizeof(wchar_t));
|
32
|
-
len = mbsrtowcs(wstr, &cstr, len, NULL);
|
23
|
+
char *p, *tmp;
|
24
|
+
long len;
|
33
25
|
|
34
|
-
|
35
|
-
|
26
|
+
p = StringValuePtr(*rbstr);
|
27
|
+
len = RSTRING_LEN(*rbstr);
|
28
|
+
tmp = calloc(len + 1, sizeof(char));
|
29
|
+
strncpy(tmp, p, len);
|
30
|
+
tmp[len] = '\0';
|
36
31
|
|
37
|
-
return
|
32
|
+
return tmp;
|
38
33
|
}
|
39
34
|
|
40
|
-
VALUE
|
35
|
+
VALUE cstorbs(const char *cstr)
|
41
36
|
{
|
42
37
|
size_t len;
|
43
|
-
char *cstr;
|
44
38
|
VALUE str;
|
45
39
|
|
46
|
-
|
47
|
-
LOG("wcs: '%ls'\n\n", wstr);
|
48
|
-
|
49
|
-
len = wcsrtombs(NULL, &wstr, 0, NULL);
|
50
|
-
LOG("len: %d\n", len);
|
51
|
-
cstr = calloc(len, sizeof(wchar_t));
|
52
|
-
wcsrtombs(cstr, &wstr, len, NULL);
|
53
|
-
LOG("cstr: '%s'\n", cstr);
|
54
|
-
|
55
|
-
LOG("wcs to rbs, len: %d, wcs: %ls, mbs: '%s'\n", len, wstr, cstr);
|
40
|
+
len = strlen(cstr);
|
56
41
|
|
57
42
|
if (len == (size_t)-1)
|
58
43
|
return Qnil;
|
59
44
|
|
60
45
|
str = rb_external_str_new_with_enc(cstr, len, enc);
|
61
|
-
free(cstr);
|
62
46
|
|
63
47
|
return str;
|
64
48
|
}
|
@@ -66,9 +50,6 @@ VALUE wcstorbs(const wchar_t *wstr)
|
|
66
50
|
VALUE get_entry(struct fmte *f, size_t argc, size_t *argi, VALUE *argv, VALUE *hash)
|
67
51
|
{
|
68
52
|
VALUE sym, entry;
|
69
|
-
size_t len;
|
70
|
-
const wchar_t *tmpw;
|
71
|
-
char *cstr;
|
72
53
|
|
73
54
|
LOG("getting entry\n");
|
74
55
|
|
@@ -81,35 +62,22 @@ VALUE get_entry(struct fmte *f, size_t argc, size_t *argi, VALUE *argv, VALUE *h
|
|
81
62
|
return entry;
|
82
63
|
}
|
83
64
|
|
84
|
-
|
85
|
-
|
86
|
-
tmpw = f->anglearg_start;
|
87
|
-
len = wcsnrtombs(NULL, &tmpw, f->anglearg_len, 0, NULL);
|
88
|
-
LOG("allocating %d, maxlen %d\n", len, f->anglearg_len);
|
89
|
-
|
90
|
-
cstr = calloc(len + 1, sizeof(char));
|
91
|
-
wcsnrtombs(cstr, &tmpw, f->anglearg_len, len, NULL);
|
92
|
-
LOG("wrote cstr %s\n", cstr);
|
93
|
-
|
94
|
-
LOG("symbol | cstr: '%s', len %d\n", cstr, len);
|
95
|
-
|
96
|
-
sym = rb_check_symbol_cstr(cstr, len, enc);
|
65
|
+
sym = rb_check_symbol_cstr(f->anglearg_start, f->anglearg_len, enc);
|
97
66
|
entry = rb_hash_lookup2(*hash, sym, Qnil);
|
98
67
|
if (entry == Qnil)
|
99
|
-
rb_raise(rb_eKeyError, "missing key
|
100
|
-
free(cstr);
|
68
|
+
rb_raise(rb_eKeyError, "missing key " PRIsVALUE, sym);
|
101
69
|
|
102
70
|
return entry;
|
103
71
|
}
|
104
72
|
|
105
|
-
|
73
|
+
char *rb_apformat(const char *fmt, size_t argc, size_t *argi, VALUE *argv, VALUE *hash)
|
106
74
|
{
|
107
75
|
struct fmte *f, *head;
|
108
|
-
|
76
|
+
char *final;
|
109
77
|
int loop = 1;
|
110
78
|
long *tmpi;
|
111
|
-
|
112
|
-
|
79
|
+
char *tmpc;
|
80
|
+
char *tmps;
|
113
81
|
double *tmpd;
|
114
82
|
void *tmp;
|
115
83
|
VALUE entry;
|
@@ -131,7 +99,7 @@ wchar_t *rb_apformat(wchar_t *fmt, size_t argc, size_t *argi, VALUE *argv, VALUE
|
|
131
99
|
case FString:
|
132
100
|
Check_Type(entry, T_STRING);
|
133
101
|
|
134
|
-
tmp =
|
102
|
+
tmp = rbstocs(&entry);
|
135
103
|
goto match;
|
136
104
|
case FTern:
|
137
105
|
tmpi = malloc(sizeof(long));
|
@@ -152,9 +120,9 @@ wchar_t *rb_apformat(wchar_t *fmt, size_t argc, size_t *argi, VALUE *argv, VALUE
|
|
152
120
|
case FChar:
|
153
121
|
Check_Type(entry, T_STRING);
|
154
122
|
|
155
|
-
tmpc = malloc(sizeof(
|
156
|
-
tmps =
|
157
|
-
*tmpc =
|
123
|
+
tmpc = malloc(sizeof(char));
|
124
|
+
tmps = StringValueCStr(entry);
|
125
|
+
*tmpc = tmps[0];
|
158
126
|
tmp = tmpc;
|
159
127
|
goto match;
|
160
128
|
case FDouble:
|
@@ -188,6 +156,7 @@ match:
|
|
188
156
|
|
189
157
|
LOG("got all fmt elements\n");
|
190
158
|
final = assemble_fmt(head);
|
159
|
+
LOG("assembled fmt: %s", final);
|
191
160
|
fmte_destroy(head);
|
192
161
|
return final;
|
193
162
|
}
|
@@ -195,9 +164,10 @@ match:
|
|
195
164
|
VALUE rb_altprintf(long passes, size_t argc, VALUE *argv, VALUE self)
|
196
165
|
{
|
197
166
|
VALUE fmt, args, hash, final;
|
198
|
-
|
199
|
-
|
167
|
+
char *wfmt;
|
168
|
+
char *formatted;
|
200
169
|
size_t argi;
|
170
|
+
int free_wfmt;
|
201
171
|
|
202
172
|
apf_err = apfe_none;
|
203
173
|
rb_scan_args(argc, argv, "1*:", &fmt, &args, &hash);
|
@@ -211,24 +181,28 @@ VALUE rb_altprintf(long passes, size_t argc, VALUE *argv, VALUE self)
|
|
211
181
|
if (passes == 0)
|
212
182
|
return fmt;
|
213
183
|
|
214
|
-
|
184
|
+
free_wfmt = 0;
|
185
|
+
wfmt = StringValueCStr(fmt);
|
215
186
|
formatted = NULL;
|
216
187
|
|
217
188
|
argi = 0;
|
218
189
|
for (; passes > 0; passes--) {
|
219
|
-
LOG("wfmt: %
|
190
|
+
LOG("wfmt: %s\n", wfmt);
|
220
191
|
|
221
192
|
formatted = rb_apformat(wfmt, argc, &argi, &args, &hash);
|
222
193
|
|
223
|
-
LOG("formatted result: '%
|
194
|
+
LOG("formatted result: '%s'\n", formatted);
|
224
195
|
|
225
|
-
|
196
|
+
if (free_wfmt)
|
197
|
+
free(wfmt);
|
198
|
+
else
|
199
|
+
free_wfmt = 1;
|
226
200
|
wfmt = formatted;
|
227
201
|
}
|
228
202
|
|
229
203
|
|
230
|
-
LOG("final: '%
|
231
|
-
final =
|
204
|
+
LOG("final: '%s'\n", formatted);
|
205
|
+
final = cstorbs(formatted);
|
232
206
|
|
233
207
|
free(formatted);
|
234
208
|
|
@@ -2,15 +2,23 @@ require 'mkmf'
|
|
2
2
|
|
3
3
|
module ExtconfHelper
|
4
4
|
BASE_DIR = File.join(__dir__, '../../../')
|
5
|
+
SRC_DIR = File.join(BASE_DIR, 'subprojects/libaltprintf/src/')
|
6
|
+
BUILD_DIR = File.join(BASE_DIR, 'build')
|
7
|
+
LIB_DIR = File.join(BUILD_DIR, 'subprojects/libaltprintf/')
|
8
|
+
INC_DIR = File.join(BASE_DIR, 'subprojects/libaltprintf/include')
|
5
9
|
|
6
10
|
module_function
|
7
11
|
|
8
|
-
def
|
9
|
-
find_header('altprintf.h',
|
10
|
-
|
12
|
+
def dev_setup
|
13
|
+
unless find_header('altprintf/altprintf.h', INC_DIR)
|
14
|
+
$stderr.puts("couldn't find header 'altprintf.h'")
|
15
|
+
exit(1)
|
16
|
+
end
|
11
17
|
|
12
|
-
|
13
|
-
|
18
|
+
unless find_library('altprintf', 'parsef', LIB_DIR)
|
19
|
+
$stderr.puts("you haven't built libaltprintf yet")
|
20
|
+
exit(1)
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
16
24
|
def setup(mode = 'release')
|
@@ -19,12 +27,7 @@ module ExtconfHelper
|
|
19
27
|
when 'release'
|
20
28
|
# do nothing
|
21
29
|
when 'dev'
|
22
|
-
|
23
|
-
dev_objs('release')
|
24
|
-
when 'debug'
|
25
|
-
dev_header
|
26
|
-
$defs.push("-DDEBUG")
|
27
|
-
dev_objs('debug')
|
30
|
+
dev_setup
|
28
31
|
else
|
29
32
|
raise(ArgumentError, "invalid mode #{mode}")
|
30
33
|
end
|
data/ext/altprintf/fmt.c
CHANGED
@@ -1,8 +1,17 @@
|
|
1
|
-
#include
|
1
|
+
#include <altprintf/syntax.h>
|
2
|
+
#include <altprintf/strbuf.h>
|
3
|
+
#include <altprintf/fmte.h>
|
4
|
+
#include <altprintf/log.h>
|
5
|
+
#include <altprintf/fmt.h>
|
2
6
|
|
3
7
|
#define BUFNUM 25
|
4
8
|
|
5
|
-
#define CHECKNULL(p)
|
9
|
+
#define CHECKNULL(p) do { \
|
10
|
+
if (p == NULL) { \
|
11
|
+
apf_err = apfe_missing_argument; \
|
12
|
+
return; \
|
13
|
+
} \
|
14
|
+
} while (0)
|
6
15
|
|
7
16
|
enum altprintf_err apf_err;
|
8
17
|
|
@@ -27,10 +36,11 @@ void fmt_tern(struct strbuf *sb, struct fmte *f)
|
|
27
36
|
|
28
37
|
long int *b = f->value;
|
29
38
|
int first_half = 1;
|
30
|
-
|
31
|
-
|
39
|
+
char sep = f->chararg;
|
40
|
+
const char *p = f->parenarg_start;
|
32
41
|
for (; p <= f->parenarg_end; p++) {
|
33
|
-
LOG("*p: %lc, first half? %d, bool: %ld, sep: %lc\n",
|
42
|
+
LOG("*p: %lc, first half? %d, bool: %ld, sep: %lc\n",
|
43
|
+
(char)*p, first_half, *b, (char)sep);
|
34
44
|
if (*p == sep)
|
35
45
|
first_half = 0;
|
36
46
|
else if (*b && first_half)
|
@@ -40,25 +50,25 @@ void fmt_tern(struct strbuf *sb, struct fmte *f)
|
|
40
50
|
}
|
41
51
|
}
|
42
52
|
|
43
|
-
|
53
|
+
char process_escape_seq(char seq)
|
44
54
|
{
|
45
55
|
switch (seq) {
|
46
56
|
case FS_ESC_NL:
|
47
|
-
return
|
57
|
+
return '\n';
|
48
58
|
case FS_ESC_ESC:
|
49
|
-
return
|
59
|
+
return '\e';
|
50
60
|
case 'a':
|
51
|
-
return
|
61
|
+
return '\a';
|
52
62
|
case 'b':
|
53
|
-
return
|
63
|
+
return '\b';
|
54
64
|
case 'f':
|
55
|
-
return
|
65
|
+
return '\f';
|
56
66
|
case 'r':
|
57
|
-
return
|
67
|
+
return '\r';
|
58
68
|
case 't':
|
59
|
-
return
|
69
|
+
return '\t';
|
60
70
|
case 'v':
|
61
|
-
return
|
71
|
+
return '\v';
|
62
72
|
default:
|
63
73
|
return seq;
|
64
74
|
}
|
@@ -68,15 +78,15 @@ void fmt_raw(struct strbuf *sb, struct fmte *f)
|
|
68
78
|
{
|
69
79
|
CHECKNULL(f->parenarg_start);
|
70
80
|
|
71
|
-
|
72
|
-
|
81
|
+
const char *p;
|
82
|
+
char c;
|
73
83
|
long i;
|
74
84
|
|
75
85
|
p = f->parenarg_start;
|
76
86
|
i = f->parenarg_len;
|
77
87
|
|
78
88
|
for (; i > 0; i--) {
|
79
|
-
LOG("p is '%lc' (%ld)\n", (
|
89
|
+
LOG("p is '%lc' (%ld)\n", (char)*p, (long)*p);
|
80
90
|
c = (i > 1 && *p == FS_ESC) ? process_escape_seq(*++p) : *p;
|
81
91
|
|
82
92
|
strbuf_append(sb, c);
|
@@ -150,14 +160,14 @@ void fmt(struct strbuf *sb, struct fmte *f, void (*fmtr)(struct strbuf *, struct
|
|
150
160
|
strbuf_destroy(tmp);
|
151
161
|
}
|
152
162
|
|
153
|
-
|
163
|
+
char *assemble_fmt(struct fmte *head)
|
154
164
|
{
|
155
165
|
struct fmte *f = head;
|
156
166
|
struct strbuf *bufs[BUFNUM];
|
157
167
|
struct fmte *splits[BUFNUM];
|
158
168
|
size_t buf = 0, i;
|
159
169
|
size_t w, tw, rw;
|
160
|
-
|
170
|
+
char *final;
|
161
171
|
|
162
172
|
void (*fmtr)(struct strbuf *, struct fmte *) = NULL;
|
163
173
|
int loop = 1;
|
data/ext/altprintf/fmte.c
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
#include
|
1
|
+
#include <stdlib.h>
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <altprintf/enums.h>
|
4
|
+
#include <altprintf/log.h>
|
5
|
+
#include <altprintf/fmte.h>
|
2
6
|
|
3
|
-
struct fmte *fmte_ini()
|
7
|
+
struct fmte *fmte_ini(void)
|
4
8
|
{
|
5
9
|
struct fmte *f = malloc(sizeof(struct fmte));
|
6
10
|
|
@@ -12,10 +16,10 @@ struct fmte *fmte_ini()
|
|
12
16
|
f->anglearg_end = NULL;
|
13
17
|
f->anglearg_len = 0;
|
14
18
|
|
15
|
-
f->chararg =
|
16
|
-
f->padchar =
|
19
|
+
f->chararg = ' ';
|
20
|
+
f->padchar = ' ';
|
17
21
|
f->type = FNone;
|
18
|
-
f->align =
|
22
|
+
f->align = Left;
|
19
23
|
f->prec = -1;
|
20
24
|
f->pad = 0;
|
21
25
|
f->value = NULL;
|
@@ -49,8 +53,8 @@ void fmte_destroy(struct fmte *f)
|
|
49
53
|
|
50
54
|
void fmte_inspect(struct fmte *f)
|
51
55
|
{
|
52
|
-
|
53
|
-
|
56
|
+
char *parenarg = calloc(f->parenarg_len + 1, sizeof(char));
|
57
|
+
char *anglearg = calloc(f->anglearg_len + 1, sizeof(char));
|
54
58
|
size_t i;
|
55
59
|
|
56
60
|
for (i = 0; i < f->parenarg_len; i++) parenarg[i] = f->parenarg_start[i];
|
@@ -61,11 +65,11 @@ void fmte_inspect(struct fmte *f)
|
|
61
65
|
parenarg_start: %p,\n\
|
62
66
|
parenarg_end: %p,\n\
|
63
67
|
parenarg_len: %ld,\n\
|
64
|
-
(parenarg): %
|
68
|
+
(parenarg): %s,\n\
|
65
69
|
anglearg_start: %p,\n\
|
66
70
|
anglearg_end: %p,\n\
|
67
71
|
anglearg_len: %ld,\n\
|
68
|
-
(anglearg): %
|
72
|
+
(anglearg): %s,\n\
|
69
73
|
chararg: %lc,\n\
|
70
74
|
padchar: %lc,\n\
|
71
75
|
type: %d,\n\
|
data/ext/altprintf/parsef.c
CHANGED
@@ -1,15 +1,33 @@
|
|
1
|
-
#include
|
1
|
+
#include <altprintf/fmte.h>
|
2
|
+
#include <altprintf/syntax.h>
|
3
|
+
#include <altprintf/log.h>
|
4
|
+
#include <altprintf/parsef.h>
|
2
5
|
|
3
|
-
|
6
|
+
char *altprintf_pct = "%";
|
4
7
|
|
5
|
-
|
8
|
+
void get_longarg(const char **s, const char **e, char stop, size_t *size)
|
6
9
|
{
|
7
|
-
|
8
|
-
|
10
|
+
*size = 0;
|
11
|
+
|
12
|
+
while (**s != EOS && **s != stop) {
|
13
|
+
LOG("checking (%c)\n", **s);
|
14
|
+
(*s)++;
|
15
|
+
(*size)++;
|
16
|
+
}
|
17
|
+
|
18
|
+
(*size)--;
|
19
|
+
if (*size > 0)
|
20
|
+
*e = *s - 1;
|
21
|
+
}
|
22
|
+
|
23
|
+
struct fmte *parsef(const char **fmt)
|
24
|
+
{
|
25
|
+
char *w_c;
|
26
|
+
char **w_a = &w_c;
|
9
27
|
struct fmte *f = fmte_ini();
|
10
28
|
long *l_a = &f->pad;
|
11
29
|
|
12
|
-
LOG("processing %
|
30
|
+
LOG("processing %d (%c)\n", **fmt, **fmt);
|
13
31
|
|
14
32
|
if (**fmt != FS_START) {
|
15
33
|
if (**fmt == EOS) {
|
@@ -34,8 +52,8 @@ struct fmte *parsef(wchar_t **fmt)
|
|
34
52
|
(*fmt)++;
|
35
53
|
}
|
36
54
|
|
37
|
-
for (; **fmt !=
|
38
|
-
LOG("scanned char '%
|
55
|
+
for (; **fmt != '\0'; (*fmt)++) {
|
56
|
+
LOG("scanned char '%c'\n", **fmt);
|
39
57
|
switch (**fmt) {
|
40
58
|
case FS_A_CHARARG:
|
41
59
|
(*fmt)++;
|
@@ -55,19 +73,18 @@ struct fmte *parsef(wchar_t **fmt)
|
|
55
73
|
case FS_A_CALIGN:
|
56
74
|
f->align = Center;
|
57
75
|
break;
|
58
|
-
case
|
59
|
-
|
60
|
-
|
61
|
-
case FS_A_ZPAD:
|
62
|
-
f->padchar = '0';
|
76
|
+
case FS_A_PAD:
|
77
|
+
(*fmt)++;
|
78
|
+
f->padchar = **fmt;
|
63
79
|
break;
|
64
80
|
case FS_A_PREC:
|
65
81
|
l_a = &f->prec;
|
66
82
|
break;
|
67
83
|
case '1': case '2': case '3': case '4': case '5':
|
68
|
-
case '6': case '7': case '8': case '9':
|
84
|
+
case '6': case '7': case '8': case '9': case '0':
|
69
85
|
LOG("l_a: %p %ld\n", l_a, *l_a);
|
70
|
-
*l_a =
|
86
|
+
*l_a = strtol(*fmt, w_a, 10);
|
87
|
+
LOG("read num: %ld\n", *l_a);
|
71
88
|
*fmt = *w_a - 1;
|
72
89
|
break;
|
73
90
|
// Psuedo-type
|
@@ -110,18 +127,3 @@ return_format:
|
|
110
127
|
(*fmt)++;
|
111
128
|
return f;
|
112
129
|
}
|
113
|
-
|
114
|
-
void get_longarg(wchar_t **s, wchar_t **e, wchar_t stop, size_t *size)
|
115
|
-
{
|
116
|
-
*size = 0;
|
117
|
-
|
118
|
-
while (**s != EOS && **s != stop) {
|
119
|
-
LOG("checking (%lc)\n", (wint_t)**s);
|
120
|
-
(*s)++;
|
121
|
-
(*size)++;
|
122
|
-
}
|
123
|
-
|
124
|
-
(*size)--;
|
125
|
-
if (*size > 0)
|
126
|
-
*e = *s - 1;
|
127
|
-
}
|
data/ext/altprintf/strbuf.c
CHANGED
@@ -1,8 +1,18 @@
|
|
1
|
-
#
|
1
|
+
#define STRBUF_INI_SIZE 5
|
2
|
+
#define STRBUF_GROW_STEP 100
|
3
|
+
#define TMPLEN 50
|
4
|
+
#define MAXPREC 25
|
5
|
+
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include <stdio.h>
|
8
|
+
#include <string.h>
|
9
|
+
#include <altprintf/log.h>
|
10
|
+
#include <altprintf/strbuf.h>
|
11
|
+
#include <altprintf/cwidth.h>
|
2
12
|
|
3
13
|
extern struct lconv *locale_info;
|
4
14
|
|
5
|
-
struct strbuf *strbuf_new()
|
15
|
+
struct strbuf *strbuf_new(void)
|
6
16
|
{
|
7
17
|
struct strbuf *sb = malloc(sizeof(struct strbuf));
|
8
18
|
|
@@ -11,7 +21,7 @@ struct strbuf *strbuf_new()
|
|
11
21
|
exit(1);
|
12
22
|
}
|
13
23
|
|
14
|
-
sb->start = sb->end = calloc(STRBUF_INI_SIZE, sizeof(
|
24
|
+
sb->start = sb->end = calloc(STRBUF_INI_SIZE, sizeof(char));
|
15
25
|
|
16
26
|
if (NULL == sb->start) {
|
17
27
|
LOG("can't alloc memory for new strbuf string\n");
|
@@ -27,7 +37,7 @@ struct strbuf *strbuf_new()
|
|
27
37
|
size_t strbuf_width(struct strbuf *sb)
|
28
38
|
{
|
29
39
|
if (sb->width == 0)
|
30
|
-
sb->width =
|
40
|
+
sb->width = cswidth(sb->start, sb->len);
|
31
41
|
|
32
42
|
return sb->width;
|
33
43
|
}
|
@@ -38,36 +48,33 @@ void strbuf_destroy(struct strbuf *sb)
|
|
38
48
|
free(sb);
|
39
49
|
}
|
40
50
|
|
41
|
-
void strbuf_append(struct strbuf *sb,
|
51
|
+
void strbuf_append(struct strbuf *sb, char c)
|
42
52
|
{
|
43
|
-
|
53
|
+
char *ns;
|
44
54
|
|
45
55
|
if (sb->cap < sb->len + 2) {
|
46
|
-
ns =
|
56
|
+
ns = realloc(sb->start, (sb->cap + STRBUF_GROW_STEP) * sizeof(char));
|
47
57
|
|
48
58
|
if (ns == NULL) {
|
49
59
|
LOG("can't increase size of strbuf to %d\n", sb->cap + STRBUF_GROW_STEP);
|
50
60
|
exit(1);
|
51
61
|
}
|
52
62
|
|
53
|
-
wcscpy(ns, sb->start);
|
54
|
-
free(sb->start);
|
55
|
-
|
56
63
|
sb->start = ns;
|
57
64
|
sb->cap += STRBUF_GROW_STEP;
|
58
65
|
}
|
59
66
|
|
60
67
|
sb->start[sb->len] = c;
|
61
|
-
sb->start[sb->len + 1] =
|
62
|
-
LOG("string so far: %
|
68
|
+
sb->start[sb->len + 1] = '\0';
|
69
|
+
LOG("string so far: %s\n", sb->start);
|
63
70
|
sb->end = &sb->start[sb->len];
|
64
71
|
sb->len++;
|
65
72
|
}
|
66
73
|
|
67
|
-
void strbuf_append_strbuf(struct strbuf *sb, void *sbuf)
|
74
|
+
void strbuf_append_strbuf(struct strbuf *sb, const void *sbuf)
|
68
75
|
{
|
69
|
-
|
70
|
-
struct strbuf *frm = sbuf;
|
76
|
+
char *pos;
|
77
|
+
const struct strbuf *frm = sbuf;
|
71
78
|
|
72
79
|
LOG("frm->start: %p | frm->end: %p\n", frm->start, frm->end);
|
73
80
|
|
@@ -75,16 +82,16 @@ void strbuf_append_strbuf(struct strbuf *sb, void *sbuf)
|
|
75
82
|
strbuf_append(sb, *pos);
|
76
83
|
}
|
77
84
|
|
78
|
-
void strbuf_appendw_strbuf(struct strbuf *sb, void *sbuf, long w)
|
85
|
+
void strbuf_appendw_strbuf(struct strbuf *sb, const void *sbuf, long w)
|
79
86
|
{
|
80
|
-
|
87
|
+
char *pos;
|
81
88
|
long ws = 0;
|
82
|
-
struct strbuf *frm = sbuf;
|
89
|
+
const struct strbuf *frm = sbuf;
|
83
90
|
|
84
91
|
LOG("frm->start: %p | frm->end: %p\n", frm->start, frm->end);
|
85
92
|
|
86
93
|
for (pos = frm->start; pos <= frm->end; pos++) {
|
87
|
-
ws +=
|
94
|
+
ws += cwidth(pos);
|
88
95
|
LOG("new width would be: %ld, requested width: %ld\n", ws, w);
|
89
96
|
if (ws > w)
|
90
97
|
break;
|
@@ -92,17 +99,17 @@ void strbuf_appendw_strbuf(struct strbuf *sb, void *sbuf, long w)
|
|
92
99
|
}
|
93
100
|
}
|
94
101
|
|
95
|
-
void strbuf_append_char(struct strbuf *sb, void *chr)
|
102
|
+
void strbuf_append_char(struct strbuf *sb, const void *chr)
|
96
103
|
{
|
97
|
-
|
104
|
+
const char *c = chr;
|
98
105
|
|
99
106
|
strbuf_append(sb, *c);
|
100
107
|
}
|
101
108
|
|
102
|
-
void strbuf_append_str(struct strbuf *sb, void *str, int maxwidth)
|
109
|
+
void strbuf_append_str(struct strbuf *sb, const void *str, int maxwidth)
|
103
110
|
{
|
104
|
-
|
105
|
-
|
111
|
+
const char *s = str;
|
112
|
+
const char *end = &s[strlen(s)];
|
106
113
|
int width = 0;
|
107
114
|
int maxlen = -1;
|
108
115
|
|
@@ -115,7 +122,7 @@ void strbuf_append_str(struct strbuf *sb, void *str, int maxwidth)
|
|
115
122
|
if (width > maxlen)
|
116
123
|
return;
|
117
124
|
} else {
|
118
|
-
width +=
|
125
|
+
width += cwidth(s);
|
119
126
|
if (width > maxwidth)
|
120
127
|
return;
|
121
128
|
}
|
@@ -124,55 +131,56 @@ void strbuf_append_str(struct strbuf *sb, void *str, int maxwidth)
|
|
124
131
|
}
|
125
132
|
}
|
126
133
|
|
127
|
-
void strbuf_append_int(struct strbuf *sb, void *in)
|
134
|
+
void strbuf_append_int(struct strbuf *sb, const void *in)
|
128
135
|
{
|
129
|
-
long
|
130
|
-
|
131
|
-
long len =
|
136
|
+
const long *i = in;
|
137
|
+
char wcs[TMPLEN];
|
138
|
+
long len = snprintf(wcs, TMPLEN - 1, "%ld", *i);
|
132
139
|
|
133
140
|
if (len < 0)
|
134
|
-
strbuf_append_str(sb,
|
141
|
+
strbuf_append_str(sb, "error adding int", 16);
|
135
142
|
else
|
136
143
|
strbuf_append_str(sb, wcs, -1 * len);
|
137
144
|
}
|
138
145
|
|
139
|
-
void strbuf_append_double(struct strbuf *sb, void *dub, int prec)
|
146
|
+
void strbuf_append_double(struct strbuf *sb, const void *dub, int prec)
|
140
147
|
{
|
141
|
-
double *d = dub;
|
142
|
-
|
143
|
-
|
148
|
+
const double *d = dub;
|
149
|
+
char wcs[TMPLEN];
|
150
|
+
char format[TMPLEN];
|
144
151
|
int rprec = prec;
|
145
152
|
|
146
153
|
if (rprec > MAXPREC)
|
147
154
|
rprec = MAXPREC;
|
148
155
|
|
149
|
-
|
156
|
+
snprintf(format, TMPLEN - 1, "%%.%df", rprec);
|
150
157
|
|
151
|
-
LOG("format: %
|
158
|
+
LOG("format: %s\n", format);
|
152
159
|
|
153
|
-
long len =
|
160
|
+
long len = snprintf(wcs, TMPLEN - 1, format, *d);
|
154
161
|
if (len < 0) {
|
155
|
-
strbuf_append_str(sb,
|
162
|
+
strbuf_append_str(sb, "error adding float", 18);
|
156
163
|
} else {
|
157
164
|
LOG("inserting double: len: %ld\n", len);
|
158
165
|
strbuf_append_str(sb, wcs, len);
|
159
166
|
|
160
167
|
if (rprec < prec)
|
161
|
-
strbuf_pad(sb,
|
168
|
+
strbuf_pad(sb, '0', rprec - prec);
|
162
169
|
}
|
163
170
|
}
|
164
171
|
|
165
|
-
void strbuf_pad(struct strbuf *sb,
|
172
|
+
void strbuf_pad(struct strbuf *sb, char pc, int amnt)
|
166
173
|
{
|
167
174
|
for (; amnt > 0; amnt--) strbuf_append(sb, pc);
|
168
175
|
}
|
169
176
|
|
170
|
-
|
177
|
+
char *strbuf_cstr(struct strbuf *sb)
|
171
178
|
{
|
172
|
-
|
179
|
+
char *cstr;
|
180
|
+
|
181
|
+
cstr = calloc(sb->len + 1, sizeof(char));
|
173
182
|
|
174
|
-
|
175
|
-
wcscpy(str, sb->start);
|
183
|
+
strncpy(cstr, sb->start, sb->len);
|
176
184
|
|
177
|
-
return
|
185
|
+
return cstr;
|
178
186
|
}
|
data/lib/altprintf/altprintf.so
CHANGED
Binary file
|
data/lib/altprintf/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: altprintf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
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-
|
11
|
+
date: 2019-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: benchmark-ips
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.7'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rake-compiler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,20 @@ dependencies:
|
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '12.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.9'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.9'
|
41
69
|
description:
|
42
70
|
email: lattis@mochiro.moe
|
43
71
|
executables: []
|
@@ -45,21 +73,22 @@ extensions: []
|
|
45
73
|
extra_rdoc_files: []
|
46
74
|
files:
|
47
75
|
- altprintf.gemspec
|
48
|
-
- ext/altprintf/altprintf.h
|
49
|
-
- ext/altprintf/
|
76
|
+
- ext/altprintf/altprintf/altprintf.h
|
77
|
+
- ext/altprintf/altprintf/cwidth.h
|
78
|
+
- ext/altprintf/altprintf/enums.h
|
79
|
+
- ext/altprintf/altprintf/fmt.h
|
80
|
+
- ext/altprintf/altprintf/fmte.h
|
81
|
+
- ext/altprintf/altprintf/log.h
|
82
|
+
- ext/altprintf/altprintf/parsef.h
|
83
|
+
- ext/altprintf/altprintf/strbuf.h
|
84
|
+
- ext/altprintf/altprintf/syntax.h
|
50
85
|
- ext/altprintf/ext.c
|
51
86
|
- ext/altprintf/extconf.h
|
52
87
|
- ext/altprintf/extconf_helper.rb
|
53
88
|
- ext/altprintf/fmt.c
|
54
|
-
- ext/altprintf/fmt.h
|
55
89
|
- ext/altprintf/fmte.c
|
56
|
-
- ext/altprintf/fmte.h
|
57
|
-
- ext/altprintf/log.h
|
58
90
|
- ext/altprintf/parsef.c
|
59
|
-
- ext/altprintf/parsef.h
|
60
91
|
- ext/altprintf/strbuf.c
|
61
|
-
- ext/altprintf/strbuf.h
|
62
|
-
- ext/altprintf/syntax.h
|
63
92
|
- lib/altprintf.rb
|
64
93
|
- lib/altprintf/alt_printf.so
|
65
94
|
- lib/altprintf/altprintf.so
|
@@ -77,7 +106,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
106
|
requirements:
|
78
107
|
- - ">="
|
79
108
|
- !ruby/object:Gem::Version
|
80
|
-
version: 2.5.
|
109
|
+
version: 2.5.7
|
81
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
111
|
requirements:
|
83
112
|
- - ">="
|
data/ext/altprintf/altprintf.h
DELETED
data/ext/altprintf/fmt.h
DELETED
data/ext/altprintf/parsef.h
DELETED
data/ext/altprintf/strbuf.h
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
#ifndef STRBUF_H
|
2
|
-
#define STRBUF_H
|
3
|
-
|
4
|
-
#ifndef _XOPEN_SOURCE
|
5
|
-
#define _XOPEN_SOURCE
|
6
|
-
#endif
|
7
|
-
|
8
|
-
#include <wchar.h>
|
9
|
-
#include <stdlib.h>
|
10
|
-
#include <stdio.h>
|
11
|
-
#include "log.h"
|
12
|
-
|
13
|
-
#define STRBUF_INI_SIZE 5
|
14
|
-
#define STRBUF_GROW_STEP 100
|
15
|
-
#define TMPLEN 50
|
16
|
-
#define MAXPREC 25
|
17
|
-
|
18
|
-
struct strbuf *strbuf_new();
|
19
|
-
void strbuf_destroy(struct strbuf *sb);
|
20
|
-
void strbuf_append(struct strbuf *sb, wchar_t);
|
21
|
-
void strbuf_append_char(struct strbuf *sb, void *);
|
22
|
-
void strbuf_append_str(struct strbuf *, void *, int);
|
23
|
-
void strbuf_append_int(struct strbuf *sb, void *);
|
24
|
-
void strbuf_append_double(struct strbuf *, void *, int);
|
25
|
-
void strbuf_append_strbuf(struct strbuf *, void *);
|
26
|
-
void strbuf_appendw_strbuf(struct strbuf *, void *, long);
|
27
|
-
void strbuf_pad(struct strbuf *, wchar_t, int);
|
28
|
-
wchar_t *strbuf_cstr(struct strbuf *);
|
29
|
-
size_t strbuf_width(struct strbuf *);
|
30
|
-
|
31
|
-
struct strbuf {
|
32
|
-
wchar_t *start;
|
33
|
-
wchar_t *end;
|
34
|
-
size_t len;
|
35
|
-
size_t width;
|
36
|
-
size_t cap;
|
37
|
-
};
|
38
|
-
#endif
|