Author: leo
Date: Wed Nov 9 13:24:16 2005
New Revision: 9871
Modified:
trunk/include/parrot/encoding.h
trunk/src/charset.c
trunk/src/encoding.c
Log:
encodings - general encoding managment code
* implement several interface functions to query and register
encodings
* stop encodings leaking memory
Modified: trunk/include/parrot/encoding.h
==============================================================================
--- trunk/include/parrot/encoding.h (original)
+++ trunk/include/parrot/encoding.h Wed Nov 9 13:24:16 2005
@@ -81,6 +81,12 @@ ENCODING *Parrot_default_encoding(Interp
typedef INTVAL (*encoding_converter_t)(Interp *, ENCODING *lhs, ENCODING *rhs);
encoding_converter_t Parrot_find_encoding_converter(Interp *, ENCODING *lhs,
ENCODING *rhs);
+void parrot_deinit_encodings(Interp *);
+INTVAL Parrot_encoding_number(Interp *, STRING *encodingname);
+INTVAL Parrot_encoding_number_of_str(Interp *, STRING *src);
+STRING* Parrot_encoding_name(Interp *, INTVAL number_of_encoding);
+ENCODING* Parrot_get_encoding(Interp *, INTVAL number_of_encoding);
+const char * Parrot_encoding_c_name(Interp *, INTVAL number_of_encoding);
#define ENCODING_MAX_BYTES_PER_CODEPOINT(i, src) \
((ENCODING *)src->encoding)->max_bytes_per_codepoint
Modified: trunk/src/charset.c
==============================================================================
--- trunk/src/charset.c (original)
+++ trunk/src/charset.c Wed Nov 9 13:24:16 2005
@@ -74,7 +74,7 @@ Parrot_charsets_encodings_deinit(Interp
mem_sys_free(all_charsets->set);
mem_sys_free(all_charsets);
all_charsets = NULL;
- /* TODO free encodings */
+ parrot_deinit_encodings(interpreter);
}
CHARSET *
Modified: trunk/src/encoding.c
==============================================================================
--- trunk/src/encoding.c (original)
+++ trunk/src/encoding.c Wed Nov 9 13:24:16 2005
@@ -20,9 +20,31 @@ ENCODING *Parrot_fixed_8_encoding_ptr;
ENCODING *Parrot_utf8_encoding_ptr;
ENCODING *Parrot_utf16_encoding_ptr;
-/* Yep, this needs to be a char * parameter -- it's tough to load in
- encodings and such for strings if we can't be sure we've got enough
- info set up to actually build strings... */
+typedef struct {
+ ENCODING *encoding;
+ STRING *name;
+} One_encoding;
+
+typedef struct {
+ int n_encodings;
+ One_encoding *enc;
+} All_encodings;
+
+static All_encodings *all_encodings;
+
+void
+parrot_deinit_encodings(Interp *interpreter)
+{
+ int i, n;
+
+ n = all_encodings->n_encodings;
+ for (i = 0; i < n; ++i) {
+ mem_sys_free(all_encodings->enc[i].encoding);
+ }
+ mem_sys_free(all_encodings->enc);
+ mem_sys_free(all_encodings);
+ all_encodings = NULL;
+}
ENCODING *
Parrot_new_encoding(Interp *interpreter)
@@ -33,18 +55,21 @@ Parrot_new_encoding(Interp *interpreter)
ENCODING *
Parrot_find_encoding(Interp *interpreter, const char *encodingname)
{
- if (!strcmp("fixed_8", encodingname)) {
- return Parrot_fixed_8_encoding_ptr;
- }
- if (!strcmp("utf8", encodingname)) {
- return Parrot_utf8_encoding_ptr;
- }
- if (!strcmp("utf16", encodingname)) {
- return Parrot_utf16_encoding_ptr;
+ int i, n;
+
+ n = all_encodings->n_encodings;
+ for (i = 0; i < n; ++i) {
+ if (!strcmp(all_encodings->enc[i].encoding->name, encodingname)) {
+ return all_encodings->enc[i].encoding;
+ }
}
return NULL;
}
+/* Yep, this needs to be a char * parameter -- it's tough to load in
+ encodings and such for strings if we can't be sure we've got enough
+ info set up to actually build strings... */
+
ENCODING *
Parrot_load_encoding(Interp *interpreter, const char *encodingname)
{
@@ -52,25 +77,120 @@ Parrot_load_encoding(Interp *interpreter
return NULL;
}
+/*
+
+=item C<INTVAL Parrot_encoding_number(Interp *, STRING *encodingname)>
+
+Return the number of the encoding or -1 if not found.
+
+=item C<INTVAL Parrot_encoding_number_of_str(Interp *, const STRING *src)>
+
+Return the number of the encoding of the given string or -1 if not found.
+
+*/
+
+INTVAL
+Parrot_encoding_number(Interp *interpreter, STRING *encodingname)
+{
+ int i, n;
+
+ n = all_encodings->n_encodings;
+ for (i = 0; i < n; ++i) {
+ if (!string_equal(interpreter, all_encodings->enc[i].name,
encodingname))
+ return i;
+ }
+ return -1;
+}
+
+INTVAL
+Parrot_encoding_number_of_str(Interp *interpreter, STRING *src)
+{
+ int i, n;
+
+ n = all_encodings->n_encodings;
+ for (i = 0; i < n; ++i) {
+ if (src->encoding == all_encodings->enc[i].encoding)
+ return i;
+ }
+ return -1;
+}
+
+STRING*
+Parrot_encoding_name(Interp *interpreter, INTVAL number_of_encoding)
+{
+ if (number_of_encoding >= all_encodings->n_encodings)
+ return NULL;
+ return all_encodings->enc[number_of_encoding].name;
+}
+
+ENCODING*
+Parrot_get_encoding(Interp *interpreter, INTVAL number_of_encoding)
+{
+ if (number_of_encoding >= all_encodings->n_encodings)
+ return NULL;
+ return all_encodings->enc[number_of_encoding].encoding;
+}
+
+const char *
+Parrot_encoding_c_name(Interp *interpreter, INTVAL number_of_encoding)
+{
+ if (number_of_encoding >= all_encodings->n_encodings)
+ return NULL;
+ return all_encodings->enc[number_of_encoding].encoding->name;
+}
+
+static INTVAL
+register_encoding(Interp *interpreter, const char *encodingname,
+ ENCODING *encoding)
+{
+ int i, n;
+
+ n = all_encodings->n_encodings;
+ for (i = 0; i < n; ++i) {
+ if (!strcmp(all_encodings->enc[i].encoding->name, encodingname))
+ return 0;
+ }
+ /*
+ * TODO
+ * this needs either a LOCK or we just forbid dynamic
+ * loading of encodings from inside threads
+ */
+ if (!n)
+ all_encodings->enc = mem_sys_allocate(sizeof(One_encoding));
+ else
+ all_encodings->enc = mem_sys_realloc(all_encodings->enc, (n + 1) *
+ sizeof(One_encoding));
+ all_encodings->n_encodings++;
+ all_encodings->enc[n].encoding = encoding;
+ all_encodings->enc[n].name = const_string(interpreter, encodingname);
+
+ return 1;
+}
+
INTVAL
Parrot_register_encoding(Interp *interpreter, const char *encodingname,
ENCODING *encoding)
{
+ if (!all_encodings) {
+ all_encodings = mem_sys_allocate(sizeof(All_encodings));
+ all_encodings->n_encodings = 0;
+ all_encodings->enc = NULL;
+ }
if (!strcmp("fixed_8", encodingname)) {
Parrot_fixed_8_encoding_ptr = encoding;
if (!Parrot_default_encoding_ptr) {
Parrot_default_encoding_ptr = encoding;
}
- return 1;
+ return register_encoding(interpreter, encodingname, encoding);
}
if (!strcmp("utf8", encodingname)) {
Parrot_utf8_encoding_ptr = encoding;
- return 1;
+ return register_encoding(interpreter, encodingname, encoding);
}
if (!strcmp("utf16", encodingname)) {
Parrot_utf16_encoding_ptr = encoding;
- return 1;
+ return register_encoding(interpreter, encodingname, encoding);
}
return 0;
}