summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--tool/transcode-tblgen.rb8
-rw-r--r--transcode.c10
-rw-r--r--transcode_data.h16
4 files changed, 31 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 9091febd25..8eeb8ffbf4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Tue Sep 2 22:20:26 2008 Tanaka Akira <akr@fsij.org>
+
+ * transcode_data.h (base_element): removed.
+ (BYTE_LOOKUP): removed.
+ (BYTE_LOOKUP_BASE): don't cast.
+ (BYTE_LOOKUP_INFO): ditto.
+ (PType): unsigned int, instead of uintptr_t.
+ (rb_transcoding): change type of next_field, conv_tree_start and
+ word_array.
+
+ * tool/transcode-tblgen.rb: generate word_array as array of unsigned
+ int.
+
+ * transcode.c (transcode_restartable0): follow the above type change.
+
Tue Sep 2 21:22:22 2008 Tanaka Akira <akr@fsij.org>
* tool/transcode-tblgen.rb: add prefix for byte_array and word_array.
diff --git a/tool/transcode-tblgen.rb b/tool/transcode-tblgen.rb
index 96f2e8f640..4f77da725e 100644
--- a/tool/transcode-tblgen.rb
+++ b/tool/transcode-tblgen.rb
@@ -344,7 +344,7 @@ End
if words_code.empty?
words_code << <<"End"
-static const uintptr_t
+static const unsigned int
#{OUTPUT_PREFIX}word_array[0] = {
};
End
@@ -358,7 +358,7 @@ End
size = words_code[/\[\d+\]/][1...-1].to_i
words_code.sub!(/^(\};\n\z)/) {
- "\#define #{infos_name} (sizeof(uintptr_t)*#{size})\n" +
+ "\#define #{infos_name} (sizeof(unsigned int)*#{size})\n" +
format_infos(infos) + "\n" +
$1
}
@@ -368,7 +368,7 @@ End
size = words_code[/\[\d+\]/][1...-1].to_i
words_code.sub!(/^(\};\n\z)/) {
- "\#define #{name} (sizeof(uintptr_t)*#{size})\n" +
+ "\#define #{name} (sizeof(unsigned int)*#{size})\n" +
<<"End" + "\n" + $1
#{offsets_name},
#{infos_name},
@@ -609,7 +609,7 @@ end
def transcode_generated_code
TRANSCODE_GENERATED_BYTES_CODE +
TRANSCODE_GENERATED_WORDS_CODE +
- "\#define TRANSCODE_TABLE_INFO #{OUTPUT_PREFIX}byte_array, #{OUTPUT_PREFIX}word_array, sizeof(uintptr_t)\n" +
+ "\#define TRANSCODE_TABLE_INFO #{OUTPUT_PREFIX}byte_array, #{OUTPUT_PREFIX}word_array, sizeof(unsigned int)\n" +
TRANSCODE_GENERATED_TRANSCODER_CODE
end
diff --git a/transcode.c b/transcode.c
index add97c9695..c6c828cbb4 100644
--- a/transcode.c
+++ b/transcode.c
@@ -480,7 +480,7 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos,
while (1) {
inchar_start = in_p;
tc->recognized_len = 0;
- next_table = ((uintptr_t)tr->word_array) + tr->conv_tree_start;
+ next_table = tr->conv_tree_start;
SUSPEND_OUTPUT_FOLLOWED_BY_INPUT(24);
@@ -493,12 +493,14 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos,
next_byte = (unsigned char)*in_p++;
follow_byte:
-#define BL_BASE(next_table) (tr->byte_array + BYTE_LOOKUP_BASE(next_table))
+#define BL_BASE(next_table) \
+ (tr->byte_array + BYTE_LOOKUP_BASE(tr->word_array + next_table/sizeof(*tr->word_array)))
if (next_byte < BL_BASE(next_table)[0] || BL_BASE(next_table)[1] < next_byte)
next_info = INVALID;
else {
unsigned int next_offset = BL_BASE(next_table)[2+next_byte-BL_BASE(next_table)[0]];
-#define BL_INFO(next_table) ((const struct byte_lookup *const *)(((uintptr_t)tr->word_array) + BYTE_LOOKUP_INFO(next_table)))
+#define BL_INFO(next_table) \
+ (tr->word_array + BYTE_LOOKUP_INFO(tr->word_array + next_table/sizeof(*tr->word_array))/sizeof(*tr->word_array))
next_info = (VALUE)BL_INFO(next_table)[next_offset];
}
follow_info:
@@ -515,7 +517,7 @@ transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos,
SUSPEND(econv_source_buffer_empty, 5);
}
next_byte = (unsigned char)*in_p++;
- next_table = ((uintptr_t)tr->word_array) + next_info;
+ next_table = next_info;
goto follow_byte;
case ZERObt: /* drop input */
continue;
diff --git a/transcode_data.h b/transcode_data.h
index 14fb1336d1..90a946cce2 100644
--- a/transcode_data.h
+++ b/transcode_data.h
@@ -14,16 +14,12 @@
#ifndef RUBY_TRANSCODE_DATA_H
#define RUBY_TRANSCODE_DATA_H 1
-typedef unsigned char base_element;
-
-typedef uintptr_t BYTE_LOOKUP[2];
-
-#define BYTE_LOOKUP_BASE(bl) (((uintptr_t *)(bl))[0])
-#define BYTE_LOOKUP_INFO(bl) (((uintptr_t *)(bl))[1])
+#define BYTE_LOOKUP_BASE(bl) ((bl)[0])
+#define BYTE_LOOKUP_INFO(bl) ((bl)[1])
#ifndef PType
/* data file needs to treat this as a pointer, to remove warnings */
-#define PType (uintptr_t)
+#define PType (unsigned int)
#endif
#define NOMAP (PType 0x01) /* single byte direct map */
@@ -73,7 +69,7 @@ typedef struct rb_transcoding {
int flags;
int resume_position;
- uintptr_t next_table;
+ unsigned int next_table;
VALUE next_info;
unsigned char next_byte;
@@ -106,9 +102,9 @@ typedef struct rb_transcoding {
struct rb_transcoder {
const char *from_encoding;
const char *to_encoding;
- uintptr_t conv_tree_start;
+ unsigned int conv_tree_start;
const unsigned char *byte_array;
- const uintptr_t *word_array;
+ const unsigned int *word_array;
int word_size;
int input_unit_length;
int max_input;