wapiti 0.0.5 → 0.1.0

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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.simplecov +3 -0
  3. data/Gemfile +25 -2
  4. data/HISTORY.md +5 -1
  5. data/LICENSE +14 -13
  6. data/README.md +9 -16
  7. data/Rakefile +38 -8
  8. data/ext/wapiti/bcd.c +126 -124
  9. data/ext/wapiti/decoder.c +203 -124
  10. data/ext/wapiti/decoder.h +6 -4
  11. data/ext/wapiti/extconf.rb +2 -2
  12. data/ext/wapiti/gradient.c +491 -320
  13. data/ext/wapiti/gradient.h +52 -34
  14. data/ext/wapiti/lbfgs.c +74 -33
  15. data/ext/wapiti/model.c +47 -37
  16. data/ext/wapiti/model.h +22 -20
  17. data/ext/wapiti/native.c +850 -839
  18. data/ext/wapiti/native.h +1 -1
  19. data/ext/wapiti/options.c +52 -20
  20. data/ext/wapiti/options.h +37 -30
  21. data/ext/wapiti/pattern.c +35 -33
  22. data/ext/wapiti/pattern.h +12 -11
  23. data/ext/wapiti/progress.c +14 -13
  24. data/ext/wapiti/progress.h +3 -2
  25. data/ext/wapiti/quark.c +14 -16
  26. data/ext/wapiti/quark.h +6 -5
  27. data/ext/wapiti/reader.c +83 -69
  28. data/ext/wapiti/reader.h +11 -9
  29. data/ext/wapiti/rprop.c +84 -43
  30. data/ext/wapiti/sequence.h +18 -16
  31. data/ext/wapiti/sgdl1.c +45 -43
  32. data/ext/wapiti/thread.c +19 -17
  33. data/ext/wapiti/thread.h +5 -4
  34. data/ext/wapiti/tools.c +7 -7
  35. data/ext/wapiti/tools.h +3 -4
  36. data/ext/wapiti/trainers.h +1 -1
  37. data/ext/wapiti/vmath.c +40 -38
  38. data/ext/wapiti/vmath.h +12 -11
  39. data/ext/wapiti/wapiti.c +159 -37
  40. data/ext/wapiti/wapiti.h +18 -4
  41. data/lib/wapiti.rb +15 -15
  42. data/lib/wapiti/errors.rb +15 -15
  43. data/lib/wapiti/model.rb +92 -84
  44. data/lib/wapiti/options.rb +123 -124
  45. data/lib/wapiti/utility.rb +14 -14
  46. data/lib/wapiti/version.rb +2 -2
  47. data/spec/spec_helper.rb +29 -9
  48. data/spec/wapiti/model_spec.rb +230 -194
  49. data/spec/wapiti/native_spec.rb +7 -8
  50. data/spec/wapiti/options_spec.rb +184 -174
  51. data/wapiti.gemspec +22 -8
  52. metadata +38 -42
  53. data/.gitignore +0 -5
@@ -16,4 +16,4 @@ extern VALUE cModel;
16
16
  extern VALUE cNativeError;
17
17
  extern VALUE cLogger;
18
18
 
19
- #endif
19
+ #endif
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * Wapiti - A linear-chain CRF tool
3
3
  *
4
- * Copyright (c) 2009-2011 CNRS
4
+ * Copyright (c) 2009-2013 CNRS
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without
@@ -25,9 +25,11 @@
25
25
  * POSSIBILITY OF SUCH DAMAGE.
26
26
  */
27
27
 
28
+ #include <inttypes.h>
28
29
  #include <limits.h>
29
30
  #include <stdbool.h>
30
31
  #include <stddef.h>
32
+ #include <stdint.h>
31
33
  #include <stdlib.h>
32
34
  #include <stdio.h>
33
35
  #include <string.h>
@@ -54,13 +56,16 @@ static void opt_help(const char *pname) {
54
56
  "\t-h | --help display this help message\n"
55
57
  "\t | --version display version information\n"
56
58
  "\n"
57
- "Training mode:\n"
59
+ "Train mode:\n"
58
60
  " %1$s train [options] [input data] [model file]\n"
59
61
  "\t | --me force maxent mode\n"
62
+ "\t-T | --type STRING type of model to train\n"
60
63
  "\t-a | --algo STRING training algorithm to use\n"
61
64
  "\t-p | --pattern FILE patterns for extracting features\n"
62
65
  "\t-m | --model FILE model file to preload\n"
63
66
  "\t-d | --devel FILE development dataset\n"
67
+ "\t | --rstate FILE optimizer state to restore\n"
68
+ "\t | --sstate FILE optimizer state to save\n"
64
69
  "\t-c | --compact compact model after training\n"
65
70
  "\t-t | --nthread INT number of worker threads\n"
66
71
  "\t-j | --jobsize INT job size for worker threads\n"
@@ -83,7 +88,7 @@ static void opt_help(const char *pname) {
83
88
  "\t | --stpdec FLOAT (rprop) step decrement factor\n"
84
89
  "\t | --cutoff (rprop) alternate projection\n"
85
90
  "\n"
86
- "Labelling mode:\n"
91
+ "Label mode:\n"
87
92
  " %1$s label [options] [input data] [output data]\n"
88
93
  "\t | --me force maxent mode\n"
89
94
  "\t-m | --model FILE model file to load\n"
@@ -92,9 +97,18 @@ static void opt_help(const char *pname) {
92
97
  "\t-s | --score add scores to output\n"
93
98
  "\t-p | --post label using posteriors\n"
94
99
  "\t-n | --nbest INT output n-best list\n"
100
+ "\t | --force use forced decoding\n"
95
101
  "\n"
96
- "Dumping mode\n"
97
- " %1$s dump [input model] [output text]\n";
102
+ "Dump mode\n"
103
+ " %1$s dump [options] [input model] [output text]\n"
104
+ "\t-p | --prec INT set weights precision\n"
105
+ "\t | --all also output 0 weights\n"
106
+ "\n"
107
+ "Update mode\n"
108
+ " %1$s update [options] [patch file] [output model]\n"
109
+ "\t-m | --model FILE model file to load\n"
110
+ "\t-c | --compact compact model after training\n"
111
+ ;
98
112
  fprintf(stderr, msg, pname);
99
113
  }
100
114
 
@@ -104,8 +118,10 @@ static void opt_help(const char *pname) {
104
118
  const opt_t opt_defaults = {
105
119
  .mode = -1,
106
120
  .input = NULL, .output = NULL,
121
+ .type = "crf",
107
122
  .maxent = false,
108
123
  .algo = "l-bfgs", .pattern = NULL, .model = NULL, .devel = NULL,
124
+ .rstate = NULL, .sstate = NULL,
109
125
  .compact = false, .sparse = false,
110
126
  .nthread = 1, .jobsize = 64, .maxiter = 0,
111
127
  .rho1 = 0.5, .rho2 = 0.0001,
@@ -116,7 +132,8 @@ const opt_t opt_defaults = {
116
132
  .rprop = {.stpmin = 1e-8, .stpmax = 50.0, .stpinc = 1.2, .stpdec = 0.5,
117
133
  .cutoff = false},
118
134
  .label = false, .check = false, .outsc = false,
119
- .lblpost = false, .nbest = 1
135
+ .lblpost = false, .nbest = 1, .force = false,
136
+ .prec = 5, .all = false,
120
137
  };
121
138
 
122
139
  /* opt_switch:
@@ -125,29 +142,32 @@ const opt_t opt_defaults = {
125
142
  */
126
143
  struct {
127
144
  int mode;
128
- char *dshort;
129
- char *dlong;
145
+ const char *dshort;
146
+ const char *dlong;
130
147
  char kind;
131
148
  size_t offset;
132
149
  } opt_switch[] = {
150
+ {0, "-T", "--type", 'S', offsetof(opt_t, type )},
133
151
  {0, "##", "--me", 'B', offsetof(opt_t, maxent )},
134
152
  {0, "-a", "--algo", 'S', offsetof(opt_t, algo )},
135
153
  {0, "-p", "--pattern", 'S', offsetof(opt_t, pattern )},
136
154
  {0, "-m", "--model", 'S', offsetof(opt_t, model )},
137
155
  {0, "-d", "--devel", 'S', offsetof(opt_t, devel )},
156
+ {0, "##", "--rstate", 'S', offsetof(opt_t, rstate )},
157
+ {0, "##", "--sstate", 'S', offsetof(opt_t, sstate )},
138
158
  {0, "-c", "--compact", 'B', offsetof(opt_t, compact )},
139
159
  {0, "-s", "--sparse", 'B', offsetof(opt_t, sparse )},
140
- {0, "-t", "--nthread", 'I', offsetof(opt_t, nthread )},
141
- {0, "-j", "--josize", 'I', offsetof(opt_t, jobsize )},
142
- {0, "-i", "--maxiter", 'I', offsetof(opt_t, maxiter )},
160
+ {0, "-t", "--nthread", 'U', offsetof(opt_t, nthread )},
161
+ {0, "-j", "--jobsize", 'U', offsetof(opt_t, jobsize )},
162
+ {0, "-i", "--maxiter", 'U', offsetof(opt_t, maxiter )},
143
163
  {0, "-1", "--rho1", 'F', offsetof(opt_t, rho1 )},
144
164
  {0, "-2", "--rho2", 'F', offsetof(opt_t, rho2 )},
145
- {0, "-o", "--objsz", 'I', offsetof(opt_t, objwin )},
146
- {0, "-w", "--stopwin", 'I', offsetof(opt_t, stopwin )},
165
+ {0, "-o", "--objwin", 'U', offsetof(opt_t, objwin )},
166
+ {0, "-w", "--stopwin", 'U', offsetof(opt_t, stopwin )},
147
167
  {0, "-e", "--stopeps", 'F', offsetof(opt_t, stopeps )},
148
168
  {0, "##", "--clip", 'B', offsetof(opt_t, lbfgs.clip )},
149
- {0, "##", "--histsz", 'I', offsetof(opt_t, lbfgs.histsz)},
150
- {0, "##", "--maxls", 'I', offsetof(opt_t, lbfgs.maxls )},
169
+ {0, "##", "--histsz", 'U', offsetof(opt_t, lbfgs.histsz)},
170
+ {0, "##", "--maxls", 'U', offsetof(opt_t, lbfgs.maxls )},
151
171
  {0, "##", "--eta0", 'F', offsetof(opt_t, sgdl1.eta0 )},
152
172
  {0," ##", "--alpha", 'F', offsetof(opt_t, sgdl1.alpha )},
153
173
  {0, "##", "--kappa", 'F', offsetof(opt_t, bcd.kappa )},
@@ -162,7 +182,12 @@ struct {
162
182
  {1, "-c", "--check", 'B', offsetof(opt_t, check )},
163
183
  {1, "-s", "--score", 'B', offsetof(opt_t, outsc )},
164
184
  {1, "-p", "--post", 'B', offsetof(opt_t, lblpost )},
165
- {1, "-n", "--nbest", 'I', offsetof(opt_t, nbest )},
185
+ {1, "-n", "--nbest", 'U', offsetof(opt_t, nbest )},
186
+ {1, "##", "--force", 'B', offsetof(opt_t, force )},
187
+ {2, "-p", "--prec", 'U', offsetof(opt_t, prec )},
188
+ {2, "##", "--all", 'B', offsetof(opt_t, all )},
189
+ {3, "-m", "--model", 'S', offsetof(opt_t, model )},
190
+ {3, "-c", "--compact", 'B', offsetof(opt_t, compact )},
166
191
  {-1, NULL, NULL, '\0', 0}
167
192
  };
168
193
 
@@ -195,6 +220,8 @@ void opt_parse(int argc, char *argv[argc], opt_t *opt) {
195
220
  opt->mode = 1;
196
221
  } else if (!strcmp(argv[0], "d") || !strcmp(argv[0], "dump")) {
197
222
  opt->mode = 2;
223
+ } else if (!strcmp(argv[0], "u") || !strcmp(argv[0], "update")) {
224
+ opt->mode = 3;
198
225
  } else {
199
226
  fatal("unknown mode <%s>", argv[0]);
200
227
  }
@@ -204,7 +231,7 @@ void opt_parse(int argc, char *argv[argc], opt_t *opt) {
204
231
  opt->output = NULL;
205
232
  while (argc > 0) {
206
233
  const char *arg = argv[0];
207
- int idx;
234
+ uint32_t idx;
208
235
  // Check if this argument is a filename or an option
209
236
  if (arg[0] != '-') {
210
237
  if (opt->input == NULL)
@@ -237,8 +264,9 @@ void opt_parse(int argc, char *argv[argc], opt_t *opt) {
237
264
  *((char **)ptr) = argv[1];
238
265
  argc -= 2, argv += 2;
239
266
  break;
240
- case 'I':
241
- if (sscanf(argv[1], "%d", (int *)ptr) != 1)
267
+ case 'U':
268
+ if (sscanf(argv[1], "%"SCNu32,
269
+ (uint32_t *)ptr) != 1)
242
270
  fatal(err_badval, arg);
243
271
  argc -= 2, argv += 2;
244
272
  break;
@@ -272,7 +300,11 @@ void opt_parse(int argc, char *argv[argc], opt_t *opt) {
272
300
  argchecksub("--alpha", opt->sgdl1.alpha > 0.0);
273
301
  argchecksub("--nbest", opt->nbest > 0 );
274
302
  #undef argchecksub
275
- if (opt->maxent && !strcmp(opt->algo, "bcd"))
303
+ if ((opt->maxent || !strcmp(opt->type, "maxent")) && !strcmp(opt->algo, "bcd"))
276
304
  fatal("BCD not supported for training maxent models");
305
+ if (!strcmp(opt->type, "memm") && !strcmp(opt->algo, "bcd"))
306
+ fatal("BCD not supported for training MEMM models");
307
+ if (opt->check && opt->force)
308
+ fatal("--check and --force cannot be used together");
277
309
  }
278
310
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * Wapiti - A linear-chain CRF tool
3
3
  *
4
- * Copyright (c) 2009-2011 CNRS
4
+ * Copyright (c) 2009-2013 CNRS
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without
@@ -27,6 +27,7 @@
27
27
  #ifndef options_h
28
28
  #define options_h
29
29
 
30
+ #include <stdint.h>
30
31
  #include <stdbool.h>
31
32
 
32
33
  #include "wapiti.h"
@@ -37,50 +38,56 @@
37
38
  */
38
39
  typedef struct opt_s opt_t;
39
40
  struct opt_s {
40
- int mode;
41
- char *input, *output;
42
- bool maxent;
41
+ int mode;
42
+ char *input, *output;
43
+ bool maxent;
43
44
  // Options for training
44
- char *algo, *pattern;
45
- char *model, *devel;
46
- bool compact, sparse;
47
- int nthread;
48
- int jobsize;
49
- int maxiter;
50
- double rho1, rho2;
45
+ const char *type;
46
+ const char *algo, *pattern;
47
+ char *model, *devel;
48
+ char *rstate, *sstate;
49
+ bool compact, sparse;
50
+ uint32_t nthread;
51
+ uint32_t jobsize;
52
+ uint32_t maxiter;
53
+ double rho1, rho2;
51
54
  // Window size criterion
52
- int objwin;
53
- int stopwin;
54
- double stopeps;
55
+ uint32_t objwin;
56
+ uint32_t stopwin;
57
+ double stopeps;
55
58
  // Options specific to L-BFGS
56
59
  struct {
57
- bool clip;
58
- int histsz;
59
- int maxls;
60
+ bool clip;
61
+ uint32_t histsz;
62
+ uint32_t maxls;
60
63
  } lbfgs;
61
64
  // Options specific to SGD-L1
62
65
  struct {
63
- double eta0;
64
- double alpha;
66
+ double eta0;
67
+ double alpha;
65
68
  } sgdl1;
66
69
  // Options specific to BCD
67
70
  struct {
68
- double kappa;
71
+ double kappa;
69
72
  } bcd;
70
73
  // Options specific to RPROP
71
74
  struct {
72
- double stpmin;
73
- double stpmax;
74
- double stpinc;
75
- double stpdec;
76
- bool cutoff;
75
+ double stpmin;
76
+ double stpmax;
77
+ double stpinc;
78
+ double stpdec;
79
+ bool cutoff;
77
80
  } rprop;
78
81
  // Options for labelling
79
- bool label;
80
- bool check;
81
- bool outsc;
82
- bool lblpost;
83
- int nbest;
82
+ bool label;
83
+ bool check;
84
+ bool outsc;
85
+ bool lblpost;
86
+ uint32_t nbest;
87
+ bool force;
88
+ // Options for model dump
89
+ int prec;
90
+ bool all;
84
91
  };
85
92
 
86
93
  extern const opt_t opt_defaults;
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * Wapiti - A linear-chain CRF tool
3
3
  *
4
- * Copyright (c) 2009-2011 CNRS
4
+ * Copyright (c) 2009-2013 CNRS
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without
@@ -26,8 +26,10 @@
26
26
  */
27
27
 
28
28
  #include <ctype.h>
29
+ #include <inttypes.h>
29
30
  #include <stdbool.h>
30
31
  #include <stddef.h>
32
+ #include <stdint.h>
31
33
  #include <stdio.h>
32
34
  #include <stdlib.h>
33
35
  #include <string.h>
@@ -101,7 +103,7 @@ static bool rex_matchit(const char *ch, const char *str) {
101
103
  * is length is returned in len. The mathing is done through tail-recursion
102
104
  * for good performances.
103
105
  */
104
- static bool rex_matchme(const char *re, const char *str, int *len) {
106
+ static bool rex_matchme(const char *re, const char *str, uint32_t *len) {
105
107
  // Special check for end of regexp
106
108
  if (re[0] == '\0')
107
109
  return true;
@@ -120,7 +122,7 @@ static bool rex_matchme(const char *re, const char *str, int *len) {
120
122
  if (nxt[0] == '*') {
121
123
  nxt++;
122
124
  do {
123
- const int save = *len;
125
+ const uint32_t save = *len;
124
126
  if (rex_matchme(nxt, str, len))
125
127
  return true;
126
128
  *len = save + 1;
@@ -150,7 +152,7 @@ static bool rex_matchme(const char *re, const char *str, int *len) {
150
152
  * position of the start of the match is returned and is len is returned in
151
153
  * len, else -1 is returned.
152
154
  */
153
- static int rex_match(const char *re, const char *str, int *len) {
155
+ static int32_t rex_match(const char *re, const char *str, uint32_t *len) {
154
156
  // Special case for anchor at start
155
157
  if (*re == '^') {
156
158
  *len = 0;
@@ -159,7 +161,7 @@ static int rex_match(const char *re, const char *str, int *len) {
159
161
  return -1;
160
162
  }
161
163
  // And general case for any position
162
- int pos = 0;
164
+ int32_t pos = 0;
163
165
  do {
164
166
  *len = 0;
165
167
  if (rex_matchme(re, str + pos, len))
@@ -215,8 +217,8 @@ pat_t *pat_comp(char *p) {
215
217
  // on an over-estimation of the number of required item. As compiled
216
218
  // pattern take a neglectible amount of memory, this waste is not
217
219
  // important.
218
- int mitems = 0;
219
- for (int pos = 0; p[pos] != '\0'; pos++)
220
+ uint32_t mitems = 0;
221
+ for (uint32_t pos = 0; p[pos] != '\0'; pos++)
220
222
  if (p[pos] == '%')
221
223
  mitems++;
222
224
  mitems = mitems * 2 + 1;
@@ -225,9 +227,9 @@ pat_t *pat_comp(char *p) {
225
227
  // Next, we go through the pattern compiling the items as they are
226
228
  // found. Commands are parsed and put in a corresponding item, and
227
229
  // segment of char not in a command are put in a 's' item.
228
- int nitems = 0;
229
- int ntoks = 0;
230
- int pos = 0;
230
+ uint32_t nitems = 0;
231
+ uint32_t ntoks = 0;
232
+ uint32_t pos = 0;
231
233
  while (p[pos] != '\0') {
232
234
  pat_item_t *item = &(pat->items[nitems++]);
233
235
  item->value = NULL;
@@ -243,14 +245,14 @@ pat_t *pat_comp(char *p) {
243
245
  // Next we parse the offset and column and store them in
244
246
  // the item.
245
247
  const char *at = p + pos;
246
- int off, col, nch;
248
+ uint32_t col;
249
+ int32_t off;
250
+ int nch;
247
251
  item->absolute = false;
248
- if (sscanf(at, "[@%d,%d%n", &off, &col, &nch) == 2)
252
+ if (sscanf(at, "[@%"SCNi32",%"SCNu32"%n", &off, &col, &nch) == 2)
249
253
  item->absolute = true;
250
- else if (sscanf(at, "[%d,%d%n", &off, &col, &nch) != 2)
254
+ else if (sscanf(at, "[%"SCNi32",%"SCNu32"%n", &off, &col, &nch) != 2)
251
255
  fatal("invalid pattern: %s", p);
252
- if (col < 0)
253
- fatal("invalid column number: %d", col);
254
256
  item->offset = off;
255
257
  item->column = col;
256
258
  ntoks = max(ntoks, col);
@@ -261,7 +263,7 @@ pat_t *pat_comp(char *p) {
261
263
  if (type == 't' || type == 'm') {
262
264
  if (p[pos] != ',' && p[pos + 1] != '"')
263
265
  fatal("missing arg in pattern: %s", p);
264
- const int start = (pos += 2);
266
+ const int32_t start = (pos += 2);
265
267
  while (p[pos] != '\0') {
266
268
  if (p[pos] == '"')
267
269
  break;
@@ -271,7 +273,7 @@ pat_t *pat_comp(char *p) {
271
273
  }
272
274
  if (p[pos] != '"')
273
275
  fatal("unended argument: %s", p);
274
- const int len = pos - start;
276
+ const int32_t len = pos - start;
275
277
  item->value = wapiti_xmalloc(sizeof(char) * (len + 1));
276
278
  memcpy(item->value, p + start, len);
277
279
  item->value[len] = '\0';
@@ -285,10 +287,10 @@ pat_t *pat_comp(char *p) {
285
287
  // No command here, so build an 's' item with the chars
286
288
  // until end of pattern or next command and put it in
287
289
  // the list.
288
- const int start = pos;
290
+ const int32_t start = pos;
289
291
  while (p[pos] != '\0' && p[pos] != '%')
290
292
  pos++;
291
- const int len = pos - start;
293
+ const int32_t len = pos - start;
292
294
  item->type = 's';
293
295
  item->caps = false;
294
296
  item->value = wapiti_xmalloc(sizeof(char) * (len + 1));
@@ -307,18 +309,18 @@ pat_t *pat_comp(char *p) {
307
309
  * newly allocated memory block and the caller is responsible to free it when
308
310
  * not needed anymore.
309
311
  */
310
- char *pat_exec(const pat_t *pat, const tok_t *tok, int at) {
311
- static char *bval[] = {"_x-1", "_x-2", "_x-3", "_x-4", "_x-#"};
312
- static char *eval[] = {"_x+1", "_x+2", "_x+3", "_x+4", "_x+#"};
313
- const int T = tok->len;
312
+ char *pat_exec(const pat_t *pat, const tok_t *tok, uint32_t at) {
313
+ static const char *bval[] = {"_x-1", "_x-2", "_x-3", "_x-4", "_x-#"};
314
+ static const char *eval[] = {"_x+1", "_x+2", "_x+3", "_x+4", "_x+#"};
315
+ const uint32_t T = tok->len;
314
316
  // Prepare the buffer who will hold the result
315
- int size = 16, pos = 0;
317
+ uint32_t size = 16, pos = 0;
316
318
  char *buffer = wapiti_xmalloc(sizeof(char) * size);
317
319
  // And loop over the compiled items
318
- for (int it = 0; it < pat->nitems; it++) {
320
+ for (uint32_t it = 0; it < pat->nitems; it++) {
319
321
  const pat_item_t *item = &(pat->items[it]);
320
- char *value = NULL;
321
- int len = 0;
322
+ const char *value = NULL;
323
+ uint32_t len = 0;
322
324
  // First, if needed, we retrieve the token at the referenced
323
325
  // position in the sequence. We store it in value and let the
324
326
  // command handler do what it need with it.
@@ -332,11 +334,11 @@ char *pat_exec(const pat_t *pat, const tok_t *tok, int at) {
332
334
  } else {
333
335
  pos += at;
334
336
  }
335
- int col = item->column;
337
+ uint32_t col = item->column;
336
338
  if (pos < 0)
337
339
  value = bval[min(-pos - 1, 4)];
338
- else if (pos >= T)
339
- value = eval[min( pos - T, 4)];
340
+ else if (pos >= (int32_t)T)
341
+ value = eval[min( pos - (int32_t)T, 4)];
340
342
  else if (col >= tok->cnts[pos])
341
343
  fatal("missing tokens, cannot apply pattern");
342
344
  else
@@ -356,7 +358,7 @@ char *pat_exec(const pat_t *pat, const tok_t *tok, int at) {
356
358
  value = "true";
357
359
  len = strlen(value);
358
360
  } else if (item->type == 'm') {
359
- int pos = rex_match(item->value, value, &len);
361
+ int32_t pos = rex_match(item->value, value, &len);
360
362
  if (pos == -1)
361
363
  len = 0;
362
364
  value += pos;
@@ -370,7 +372,7 @@ char *pat_exec(const pat_t *pat, const tok_t *tok, int at) {
370
372
  }
371
373
  memcpy(buffer + pos, value, len);
372
374
  if (item->caps)
373
- for (int i = pos; i < pos + len; i++)
375
+ for (uint32_t i = pos; i < pos + len; i++)
374
376
  buffer[i] = tolower(buffer[i]);
375
377
  pos += len;
376
378
  }
@@ -386,7 +388,7 @@ char *pat_exec(const pat_t *pat, const tok_t *tok, int at) {
386
388
  * not use this pointer again.
387
389
  */
388
390
  void pat_free(pat_t *pat) {
389
- for (int it = 0; it < pat->nitems; it++)
391
+ for (uint32_t it = 0; it < pat->nitems; it++)
390
392
  free(pat->items[it].value);
391
393
  free(pat->src);
392
394
  free(pat);