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;
 }

Reply via email to