ent 0.0.2 → 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.
- data/History.txt +6 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/ext/ent_native/ent_native.c +50 -18
- data/spec/ent_spec.rb +2 -4
- data/spec/random_test_spec.rb +109 -0
- data/spec/samples/foo_test +1 -0
- data/spec/spec_helper.rb +14 -2
- metadata +20 -12
- data/ext/ent_native/iso8859.c +0 -19
- data/ext/ent_native/iso8859.h +0 -17
data/History.txt
ADDED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/ext/ent_native/ent_native.c
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#include "ruby.h"
|
2
2
|
|
3
|
-
#include
|
4
|
-
#include "iso8859.h"
|
3
|
+
#include <stdio.h>
|
5
4
|
|
5
|
+
#include "randtest.h"
|
6
6
|
|
7
7
|
#ifndef DBL2NUM
|
8
8
|
#define DBL2NUM(dbl) rb_float_new(dbl)
|
@@ -78,21 +78,33 @@ VALUE rb_rt_read_string(VALUE self, VALUE rb_buf) {
|
|
78
78
|
rb_raise(rb_eIOError, "data cannot be added after finalizing");
|
79
79
|
|
80
80
|
rt_add(ctx, RSTRING_PTR(rb_buf), RSTRING_LEN(rb_buf));
|
81
|
+
|
81
82
|
return LONG2NUM(RSTRING_LEN(rb_buf));
|
82
83
|
}
|
83
84
|
|
84
85
|
|
85
86
|
VALUE rb_rt_read_file(VALUE self, VALUE rb_filename) {
|
86
87
|
rt_ctx *ctx;
|
88
|
+
FILE *fp;
|
89
|
+
int oc;
|
90
|
+
size_t fsz = 0;
|
87
91
|
|
88
92
|
Check_Type(rb_filename, T_STRING);
|
89
|
-
|
90
93
|
Data_Get_Struct(self, rt_ctx, ctx);
|
91
94
|
if(ctx->ended)
|
92
95
|
rb_raise(rb_eIOError, "data cannot be added after finalizing");
|
93
96
|
|
94
|
-
|
95
|
-
|
97
|
+
if ((fp = fopen(RSTRING_PTR(rb_filename), "rb")) == NULL)
|
98
|
+
rb_sys_fail(0);
|
99
|
+
|
100
|
+
while((oc=fgetc(fp)) != EOF) {
|
101
|
+
unsigned char ocb = (unsigned char) oc;
|
102
|
+
rt_add(ctx, &ocb, 1);
|
103
|
+
fsz++;
|
104
|
+
}
|
105
|
+
fclose(fp);
|
106
|
+
|
107
|
+
return LONG2NUM(fsz);
|
96
108
|
}
|
97
109
|
|
98
110
|
|
@@ -109,6 +121,7 @@ VALUE rb_rt_entropy(VALUE self) {
|
|
109
121
|
|
110
122
|
VALUE rb_rt_mean(VALUE self) {
|
111
123
|
rt_ctx *ctx;
|
124
|
+
|
112
125
|
Data_Get_Struct(self, rt_ctx, ctx);
|
113
126
|
|
114
127
|
if(ctx->ended)
|
@@ -128,15 +141,25 @@ VALUE rb_rt_chisquare(VALUE self) {
|
|
128
141
|
return Qnil;
|
129
142
|
}
|
130
143
|
|
131
|
-
|
132
|
-
VALUE rb_rt_datasum(VALUE self) {
|
144
|
+
VALUE rb_rt_chisquare_probability(VALUE self) {
|
133
145
|
rt_ctx *ctx;
|
146
|
+
double ret, chip;
|
147
|
+
|
134
148
|
Data_Get_Struct(self, rt_ctx, ctx);
|
135
149
|
|
136
|
-
if(ctx->ended)
|
137
|
-
return DBL2NUM(ctx->r_datasum);
|
138
|
-
else
|
150
|
+
if(! ctx->ended)
|
139
151
|
return Qnil;
|
152
|
+
|
153
|
+
chip = pochisq(ctx->r_chisq, (ctx->binary ? 1 : 255));
|
154
|
+
|
155
|
+
if (chip < 0.0001)
|
156
|
+
ret = 0.009;
|
157
|
+
else if (chip > 0.9999)
|
158
|
+
ret = 99.991;
|
159
|
+
else
|
160
|
+
ret = chip * 100;
|
161
|
+
|
162
|
+
return DBL2NUM(ret);
|
140
163
|
}
|
141
164
|
|
142
165
|
|
@@ -193,15 +216,25 @@ VALUE rb_rt_chisquare_force(VALUE self) {
|
|
193
216
|
return DBL2NUM(ctx->r_chisq);
|
194
217
|
}
|
195
218
|
|
196
|
-
|
197
|
-
VALUE rb_rt_datasum_force(VALUE self) {
|
219
|
+
VALUE rb_rt_chisquare_probability_force(VALUE self) {
|
198
220
|
rt_ctx *ctx;
|
221
|
+
double ret, chip;
|
222
|
+
|
199
223
|
Data_Get_Struct(self, rt_ctx, ctx);
|
200
224
|
|
201
225
|
if(! ctx->ended)
|
202
226
|
rt_end(ctx);
|
203
227
|
|
204
|
-
|
228
|
+
chip = pochisq(ctx->r_chisq, (ctx->binary ? 1 : 255));
|
229
|
+
|
230
|
+
if (chip < 0.0001)
|
231
|
+
ret = 0.009;
|
232
|
+
else if (chip > 0.9999)
|
233
|
+
ret = 99.991;
|
234
|
+
else
|
235
|
+
ret = chip * 100;
|
236
|
+
|
237
|
+
return DBL2NUM(ret);
|
205
238
|
}
|
206
239
|
|
207
240
|
|
@@ -239,7 +272,6 @@ VALUE rb_rt_result(VALUE self) {
|
|
239
272
|
rb_hash_aset(ret, ID2SYM(rb_intern("entropy")), DBL2NUM(ctx->r_ent));
|
240
273
|
rb_hash_aset(ret, ID2SYM(rb_intern("mean")), DBL2NUM(ctx->r_mean));
|
241
274
|
rb_hash_aset(ret, ID2SYM(rb_intern("chisquare")), DBL2NUM(ctx->r_chisq));
|
242
|
-
rb_hash_aset(ret, ID2SYM(rb_intern("datasum")), DBL2NUM(ctx->r_datasum));
|
243
275
|
rb_hash_aset(ret, ID2SYM(rb_intern("montepi")), DBL2NUM(ctx->r_montepicalc));
|
244
276
|
rb_hash_aset(ret, ID2SYM(rb_intern("scc")), DBL2NUM(ctx->r_scc));
|
245
277
|
return ret;
|
@@ -256,20 +288,20 @@ void Init_ent_native() {
|
|
256
288
|
rb_define_method(c_random_test, "binary?", rb_rt_get_binmode, 0);
|
257
289
|
|
258
290
|
rb_define_method(c_random_test, "read", rb_rt_read_string, 1);
|
259
|
-
|
260
|
-
|
291
|
+
rb_define_method(c_random_test, "read_string", rb_rt_read_string, 1);
|
292
|
+
rb_define_method(c_random_test, "read_file", rb_rt_read_file, 1);
|
261
293
|
rb_define_method(c_random_test, "finalize", rb_rt_final, 0);
|
262
294
|
rb_define_method(c_random_test, "result", rb_rt_result, 0);
|
263
295
|
rb_define_method(c_random_test, "entropy", rb_rt_entropy, 0);
|
264
296
|
rb_define_method(c_random_test, "mean", rb_rt_mean, 0);
|
265
297
|
rb_define_method(c_random_test, "chisquare", rb_rt_chisquare, 0);
|
266
|
-
rb_define_method(c_random_test, "
|
298
|
+
rb_define_method(c_random_test, "chisquare_probability", rb_rt_chisquare_probability, 0);
|
267
299
|
rb_define_method(c_random_test, "montepi", rb_rt_montepi, 0);
|
268
300
|
rb_define_method(c_random_test, "scc", rb_rt_scc, 0);
|
269
301
|
rb_define_method(c_random_test, "entropy!", rb_rt_entropy_force, 0);
|
270
302
|
rb_define_method(c_random_test, "mean!", rb_rt_mean_force, 0);
|
271
303
|
rb_define_method(c_random_test, "chisquare!", rb_rt_chisquare_force, 0);
|
272
|
-
rb_define_method(c_random_test, "
|
304
|
+
rb_define_method(c_random_test, "chisquare_probability!", rb_rt_chisquare_probability_force, 0);
|
273
305
|
rb_define_method(c_random_test, "montepi!", rb_rt_montepi_force, 0);
|
274
306
|
rb_define_method(c_random_test, "scc!", rb_rt_scc_force, 0);
|
275
307
|
}
|
data/spec/ent_spec.rb
CHANGED
@@ -0,0 +1,109 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Ent::RandomTest do
|
4
|
+
context "byte entropy" do
|
5
|
+
before :each do
|
6
|
+
@rt = Ent::RandomTest.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should not have binary testing enabled" do
|
10
|
+
@rt.should_not be_binary
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should initialize correctly" do
|
14
|
+
@rt.should be_kind_of Ent::RandomTest
|
15
|
+
@rt.entropy.should be_nil
|
16
|
+
@rt.mean.should be_nil
|
17
|
+
@rt.chisquare.should be_nil
|
18
|
+
@rt.scc.should be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should default with no randomness" do
|
22
|
+
@rt.should be_kind_of Ent::RandomTest
|
23
|
+
@rt.entropy.should be_nil
|
24
|
+
@rt.mean.should be_nil
|
25
|
+
@rt.chisquare.should be_nil
|
26
|
+
@rt.chisquare_probability.should be_nil
|
27
|
+
@rt.scc.should be_nil
|
28
|
+
|
29
|
+
@rt.finalize
|
30
|
+
|
31
|
+
@rt.entropy.should == 0
|
32
|
+
@rt.chisquare_probability.should > 99.99
|
33
|
+
@rt.mean.should be_nan
|
34
|
+
@rt.chisquare.should be_nan
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should read a string and calculate its entropy" do
|
38
|
+
@rt.read_string("foo").should == 3
|
39
|
+
@rt.finalize
|
40
|
+
(0.918295 .. 0.918297).should be_include(@rt.entropy)
|
41
|
+
(423.66 .. 423.67).should be_include(@rt.chisquare)
|
42
|
+
(108.0000 .. 108.0001).should be_include(@rt.mean)
|
43
|
+
@rt.chisquare_probability.should > 99.99
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should read a file and calculate its entropy" do
|
47
|
+
@rt.read_file(sample_file("foo_test")).should == 3
|
48
|
+
@rt.finalize
|
49
|
+
(0.918295 .. 0.918297).should be_include(@rt.entropy)
|
50
|
+
(423.66 .. 423.67).should be_include(@rt.chisquare)
|
51
|
+
(108.0000 .. 108.0001).should be_include(@rt.mean)
|
52
|
+
@rt.chisquare_probability.should > 99.99
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
context "binary entropy" do
|
58
|
+
before :each do
|
59
|
+
@rt = Ent::RandomTest.new(true)
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
it "should have binary testing enabled" do
|
64
|
+
@rt.should be_binary
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should initialize correctly" do
|
68
|
+
@rt.should be_kind_of Ent::RandomTest
|
69
|
+
@rt.entropy.should be_nil
|
70
|
+
@rt.mean.should be_nil
|
71
|
+
@rt.chisquare.should be_nil
|
72
|
+
@rt.scc.should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should default with no randomness" do
|
76
|
+
@rt.should be_kind_of Ent::RandomTest
|
77
|
+
@rt.entropy.should be_nil
|
78
|
+
@rt.mean.should be_nil
|
79
|
+
@rt.chisquare.should be_nil
|
80
|
+
@rt.scc.should be_nil
|
81
|
+
|
82
|
+
@rt.finalize
|
83
|
+
|
84
|
+
@rt.entropy.should == 0
|
85
|
+
@rt.chisquare_probability.should < 0.01
|
86
|
+
@rt.mean.should be_nan
|
87
|
+
@rt.chisquare.should be_nan
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should read a string and calculate its entropy" do
|
91
|
+
@rt.read_string("foo").should == 3
|
92
|
+
@rt.finalize
|
93
|
+
(0.918295 .. 0.918297).should be_include(@rt.entropy)
|
94
|
+
(2.66 .. 2.67).should be_include(@rt.chisquare)
|
95
|
+
(0.6666 .. 0.6667).should be_include(@rt.mean)
|
96
|
+
@rt.chisquare_probability.should < 0.01
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should read a file and calculate its entropy" do
|
100
|
+
@rt.read_file(sample_file("foo_test")).should == 3
|
101
|
+
@rt.finalize
|
102
|
+
(0.918295 .. 0.918297).should be_include(@rt.entropy)
|
103
|
+
(2.66 .. 2.67).should be_include(@rt.chisquare)
|
104
|
+
(0.6666 .. 0.6667).should be_include(@rt.mean)
|
105
|
+
@rt.chisquare_probability.should < 0.01
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
foo
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
|
2
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
1
|
+
require 'pathname'
|
3
2
|
require 'rspec'
|
3
|
+
SPEC_DIR = Pathname.new(__FILE__).dirname
|
4
|
+
$LOAD_PATH.unshift(SPEC_DIR.join('..', 'lib').to_s)
|
5
|
+
$LOAD_PATH.unshift(SPEC_DIR.to_s)
|
6
|
+
|
4
7
|
require 'ent'
|
5
8
|
|
6
9
|
# Requires supporting files with custom matchers and macros, etc,
|
@@ -10,3 +13,12 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
10
13
|
RSpec.configure do |config|
|
11
14
|
|
12
15
|
end
|
16
|
+
|
17
|
+
def sample_path(fname)
|
18
|
+
Pathname.new(__FILE__).dirname.join("samples", fname)
|
19
|
+
end
|
20
|
+
|
21
|
+
def sample_file(fname)
|
22
|
+
sample_path(fname).to_s
|
23
|
+
end
|
24
|
+
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.2
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Eric Monti
|
@@ -14,13 +14,13 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-03-
|
17
|
+
date: 2011-03-21 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
22
|
-
prerelease: false
|
23
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
24
|
requirements:
|
25
25
|
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
@@ -30,11 +30,12 @@ dependencies:
|
|
30
30
|
- 0
|
31
31
|
version: 2.3.0
|
32
32
|
type: :development
|
33
|
+
prerelease: false
|
33
34
|
version_requirements: *id001
|
34
35
|
- !ruby/object:Gem::Dependency
|
35
36
|
name: bundler
|
36
|
-
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
38
39
|
requirements:
|
39
40
|
- - ~>
|
40
41
|
- !ruby/object:Gem::Version
|
@@ -44,11 +45,12 @@ dependencies:
|
|
44
45
|
- 0
|
45
46
|
version: 1.0.0
|
46
47
|
type: :development
|
48
|
+
prerelease: false
|
47
49
|
version_requirements: *id002
|
48
50
|
- !ruby/object:Gem::Dependency
|
49
51
|
name: jeweler
|
50
|
-
prerelease: false
|
51
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
52
54
|
requirements:
|
53
55
|
- - ~>
|
54
56
|
- !ruby/object:Gem::Version
|
@@ -58,11 +60,12 @@ dependencies:
|
|
58
60
|
- 2
|
59
61
|
version: 1.5.2
|
60
62
|
type: :development
|
63
|
+
prerelease: false
|
61
64
|
version_requirements: *id003
|
62
65
|
- !ruby/object:Gem::Dependency
|
63
66
|
name: rcov
|
64
|
-
prerelease: false
|
65
67
|
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
66
69
|
requirements:
|
67
70
|
- - ">="
|
68
71
|
- !ruby/object:Gem::Version
|
@@ -70,11 +73,12 @@ dependencies:
|
|
70
73
|
- 0
|
71
74
|
version: "0"
|
72
75
|
type: :development
|
76
|
+
prerelease: false
|
73
77
|
version_requirements: *id004
|
74
78
|
- !ruby/object:Gem::Dependency
|
75
79
|
name: rake-compiler
|
76
|
-
prerelease: false
|
77
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
78
82
|
requirements:
|
79
83
|
- - ">="
|
80
84
|
- !ruby/object:Gem::Version
|
@@ -82,6 +86,7 @@ dependencies:
|
|
82
86
|
- 0
|
83
87
|
version: "0"
|
84
88
|
type: :development
|
89
|
+
prerelease: false
|
85
90
|
version_requirements: *id005
|
86
91
|
description: Calculate the entropy of data
|
87
92
|
email: esmonti@gmail.com
|
@@ -94,12 +99,12 @@ extra_rdoc_files:
|
|
94
99
|
- README.rdoc
|
95
100
|
- ext/ent_native/chisq.c
|
96
101
|
- ext/ent_native/ent_native.c
|
97
|
-
- ext/ent_native/iso8859.c
|
98
102
|
- ext/ent_native/randtest.c
|
99
103
|
files:
|
100
104
|
- .document
|
101
105
|
- .rspec
|
102
106
|
- Gemfile
|
107
|
+
- History.txt
|
103
108
|
- LICENSE.txt
|
104
109
|
- README.rdoc
|
105
110
|
- Rakefile
|
@@ -107,12 +112,12 @@ files:
|
|
107
112
|
- ext/ent_native/chisq.c
|
108
113
|
- ext/ent_native/ent_native.c
|
109
114
|
- ext/ent_native/extconf.rb
|
110
|
-
- ext/ent_native/iso8859.c
|
111
|
-
- ext/ent_native/iso8859.h
|
112
115
|
- ext/ent_native/randtest.c
|
113
116
|
- ext/ent_native/randtest.h
|
114
117
|
- lib/ent.rb
|
115
118
|
- spec/ent_spec.rb
|
119
|
+
- spec/random_test_spec.rb
|
120
|
+
- spec/samples/foo_test
|
116
121
|
- spec/spec_helper.rb
|
117
122
|
has_rdoc: true
|
118
123
|
homepage: http://github.com/emonti/ent
|
@@ -124,6 +129,7 @@ rdoc_options: []
|
|
124
129
|
require_paths:
|
125
130
|
- lib
|
126
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
127
133
|
requirements:
|
128
134
|
- - ">="
|
129
135
|
- !ruby/object:Gem::Version
|
@@ -131,6 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
137
|
- 0
|
132
138
|
version: "0"
|
133
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
134
141
|
requirements:
|
135
142
|
- - ">="
|
136
143
|
- !ruby/object:Gem::Version
|
@@ -140,10 +147,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
147
|
requirements: []
|
141
148
|
|
142
149
|
rubyforge_project:
|
143
|
-
rubygems_version: 1.3.
|
150
|
+
rubygems_version: 1.3.7
|
144
151
|
signing_key:
|
145
152
|
specification_version: 3
|
146
153
|
summary: Calculate the entropy of data
|
147
154
|
test_files:
|
148
155
|
- spec/ent_spec.rb
|
156
|
+
- spec/random_test_spec.rb
|
149
157
|
- spec/spec_helper.rb
|
data/ext/ent_native/iso8859.c
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
|
2
|
-
/* ISO 8859/1 Latin-1 alphabetic and upper and lower case bit vector tables. */
|
3
|
-
|
4
|
-
/* LINTLIBRARY */
|
5
|
-
|
6
|
-
unsigned char isoalpha[32] = {
|
7
|
-
0,0,0,0,0,0,0,0,127,255,255,224,127,255,255,224,0,0,0,0,0,0,0,0,255,255,
|
8
|
-
254,255,255,255,254,255
|
9
|
-
};
|
10
|
-
|
11
|
-
unsigned char isoupper[32] = {
|
12
|
-
0,0,0,0,0,0,0,0,127,255,255,224,0,0,0,0,0,0,0,0,0,0,0,0,255,255,254,254,
|
13
|
-
0,0,0,0
|
14
|
-
};
|
15
|
-
|
16
|
-
unsigned char isolower[32] = {
|
17
|
-
0,0,0,0,0,0,0,0,0,0,0,0,127,255,255,224,0,0,0,0,0,0,0,0,0,0,0,1,255,255,
|
18
|
-
254,255
|
19
|
-
};
|
data/ext/ent_native/iso8859.h
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
|
2
|
-
/* ISO 8859/1 Latin-1 "ctype" macro replacements. */
|
3
|
-
|
4
|
-
extern unsigned char isoalpha[32], isoupper[32], isolower[32];
|
5
|
-
|
6
|
-
#define isISOspace(x) ((isascii(((unsigned char) (x))) && isspace(((unsigned char) (x)))) || ((x) == 0xA0))
|
7
|
-
#define isISOalpha(x) ((isoalpha[(((unsigned char) (x))) / 8] & (0x80 >> ((((unsigned char) (x))) % 8))) != 0)
|
8
|
-
#define isISOupper(x) ((isoupper[(((unsigned char) (x))) / 8] & (0x80 >> ((((unsigned char) (x))) % 8))) != 0)
|
9
|
-
#define isISOlower(x) ((isolower[(((unsigned char) (x))) / 8] & (0x80 >> ((((unsigned char) (x))) % 8))) != 0)
|
10
|
-
#define isISOprint(x) ((((x) >= ' ') && ((x) <= '~')) || ((x) >= 0xA0))
|
11
|
-
#define toISOupper(x) (isISOlower(x) ? (isascii(((unsigned char) (x))) ? \
|
12
|
-
toupper(x) : (((((unsigned char) (x)) != 0xDF) && \
|
13
|
-
(((unsigned char) (x)) != 0xFF)) ? \
|
14
|
-
(((unsigned char) (x)) - 0x20) : (x))) : (x))
|
15
|
-
#define toISOlower(x) (isISOupper(x) ? (isascii(((unsigned char) (x))) ? \
|
16
|
-
tolower(x) : (((unsigned char) (x)) + 0x20)) \
|
17
|
-
: (x))
|