+
+int
+chise_attribute_table_put (CHISE_Attribute_Table *db,
+ char *key, unsigned char *value)
+{
+ DBT keydatum, valdatum;
+ int status = 0;
+
+ /* DB Version 2 requires DBT's to be zeroed before use. */
+ xzero (keydatum);
+ xzero (valdatum);
+
+ keydatum.data = key;
+ keydatum.size = strlen (key);
+
+ valdatum.data = value;
+ valdatum.size = strlen (value);
+
+ status = db->put (db, NULL, &keydatum, &valdatum, 0);
+ return status;
+}
+
+CHISE_Char_ID
+chise_char_id_parse_c_string (unsigned char *str, size_t len)
+{
+ int i = 0;
+
+ if ( (len >= 2) && (str[i++] == '?') )
+ {
+ unsigned char c = str[i++];
+ int counter;
+ CHISE_Char_ID cid;
+
+ if (c == '\\')
+ {
+ if (len < 3)
+ return -1;
+ c = str[i++];
+ if (c == '^')
+ {
+ if (len < 4)
+ return -1;
+ c = str[i++];
+ if (c == '?')
+ return 0x7F;
+ else
+ return c & (0x80 | 0x1F);
+ }
+ }
+ if ( c < 0xC0 )
+ {
+ cid = c;
+ counter = 0;
+ }
+ else if ( c < 0xE0 )
+ {
+ cid = c & 0x1f;
+ counter = 1;
+ }
+ else if ( c < 0xF0 )
+ {
+ cid = c & 0x0f;
+ counter = 2;
+ }
+ else if ( c < 0xF8 )
+ {
+ cid = c & 0x07;
+ counter = 3;
+ }
+ else if ( c < 0xFC )
+ {
+ cid = c & 0x03;
+ counter = 4;
+ }
+ else
+ {
+ cid = c & 0x01;
+ counter = 5;
+ }
+
+ if (counter + 2 <= len)
+ {
+ int j;
+
+ for (j = 0; j < counter; j++)
+ cid = (cid << 6) | (str[j + i] & 0x3F);
+ return cid;
+ }
+ }
+ return -1;
+}
+
+int
+chise_format_char_id (CHISE_Char_ID cid, unsigned char *dest, size_t len)
+{
+ int i = 0;
+
+ dest[i++] = '?';
+ if (cid == '\t')
+ {
+ dest[i++] = '\\';
+ dest[i++] = 't';
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid == '\n')
+ {
+ dest[i++] = '\\';
+ dest[i++] = 'n';
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid == '\r')
+ {
+ dest[i++] = '\\';
+ dest[i++] = 'r';
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid == 0x1C)
+ {
+ dest[i++] = '\\';
+ dest[i++] = '^';
+ dest[i++] = '\\';
+ dest[i++] = '\\';
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0x1F)
+ {
+ dest[i++] = '\\';
+ dest[i++] = '^';
+ dest[i++] = '@' + cid;
+ dest[i] = '\0';
+ return i;
+ }
+ else if ( (cid == ' ') || (cid == '"') ||
+ (cid == '#') || (cid == '\'') ||
+ (cid == '(') || (cid == ')') ||
+ (cid == ',') || (cid == '.') ||
+ (cid == ';') || (cid == '?') ||
+ (cid == '[') || (cid == '\\') ||
+ (cid == ']') || (cid == '`') )
+ {
+ dest[i++] = '\\';
+ dest[i++] = cid;
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0x7E)
+ {
+ dest[i++] = cid;
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid == 0x7F)
+ {
+ dest[i++] = '\\';
+ dest[i++] = '^';
+ dest[i++] = '?';
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0x9F)
+ {
+ dest[i++] = '\\';
+ dest[i++] = '^';
+ dest[i++] = ((cid + '@') >> 6) | 0xC0;
+ dest[i++] = ((cid + '@') & 0x3F) | 0x80;
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0x7FF)
+ {
+ dest[i++] = (cid >> 6) | 0xC0;
+ dest[i++] = (cid & 0x3F) | 0x80;
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0xFFFF)
+ {
+ dest[i++] = (cid >> 12) | 0xE0;
+ dest[i++]= ((cid >> 6) & 0x3F) | 0x80;
+ dest[i++]= (cid & 0x3F) | 0x80;
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0x1FFFFF)
+ {
+ dest[i++]= (cid >> 18) | 0xF0;
+ dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
+ dest[i++]= ((cid >> 6) & 0x3F) | 0x80;
+ dest[i++]= (cid & 0x3F) | 0x80;
+ dest[i] = '\0';
+ return i;
+ }
+ else if (cid <= 0x3FFFFFF)
+ {
+ dest[i++]= (cid >> 24) | 0xF8;
+ dest[i++]= ((cid >> 18) & 0x3F) | 0x80;
+ dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
+ dest[i++]= ((cid >> 6) & 0x3F) | 0x80;
+ dest[i++]= (cid & 0x3F) | 0x80;
+ dest[i] = '\0';
+ return i;
+ }
+ else
+ {
+ dest[i++]= (cid >> 30) | 0xFC;
+ dest[i++]= ((cid >> 24) & 0x3F) | 0x80;
+ dest[i++]= ((cid >> 18) & 0x3F) | 0x80;
+ dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
+ dest[i++]= ((cid >> 6) & 0x3F) | 0x80;
+ dest[i++]= (cid & 0x3F) | 0x80;
+ dest[i] = '\0';
+ return i;
+ }
+}