unsigned char key_buf[8];
key_buf[0] = '?';
- if (cid <= 0x7f)
+ if (cid == '\t')
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = 't';
+ key_buf[3] = '\0';
+ }
+ else if (cid == '\n')
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = 'n';
+ key_buf[3] = '\0';
+ }
+ else if (cid == '\r')
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = 'r';
+ key_buf[3] = '\0';
+ }
+ else if (cid == 0x1C)
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = '^';
+ key_buf[3] = '\\';
+ key_buf[4] = '\\';
+ key_buf[5] = '\0';
+ }
+ else if (cid <= 0x1F)
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = '^';
+ key_buf[3] = '@' + cid;
+ key_buf[4] = '\0';
+ }
+ else if ( (cid == ' ') || (cid == '"') ||
+ (cid == '#') || (cid == '\'') ||
+ (cid == '(') || (cid == ')') ||
+ (cid == ',') || (cid == '.') ||
+ (cid == ';') || (cid == '?') ||
+ (cid == '[') || (cid == '\\') ||
+ (cid == ']') || (cid == '`') )
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = cid;
+ key_buf[3] = '\0';
+ }
+ else if (cid <= 0x7E)
{
key_buf[1] = cid;
key_buf[2] = '\0';
}
- else if (cid <= 0x7ff)
+ else if (cid == 0x7F)
+ {
+ key_buf[1] = '\\';
+ key_buf[2] = '^';
+ key_buf[3] = '?';
+ key_buf[4] = '\0';
+ }
+ else if (cid <= 0x9F)
{
- key_buf[1] = (cid >> 6) | 0xc0;
- key_buf[2] = (cid & 0x3f) | 0x80;
+ key_buf[1] = '\\';
+ key_buf[2] = '^';
+ key_buf[3] = ((cid + '@') >> 6) | 0xC0;
+ key_buf[4] = ((cid + '@') & 0x3F) | 0x80;
+ key_buf[5] = '\0';
+
+ }
+ else if (cid <= 0x7FF)
+ {
+ key_buf[1] = (cid >> 6) | 0xC0;
+ key_buf[2] = (cid & 0x3F) | 0x80;
key_buf[3] = '\0';
}
- else if (cid <= 0xffff)
+ else if (cid <= 0xFFFF)
{
- key_buf[1] = (cid >> 12) | 0xe0;
- key_buf[2]= ((cid >> 6) & 0x3f) | 0x80;
- key_buf[3]= (cid & 0x3f) | 0x80;
+ key_buf[1] = (cid >> 12) | 0xE0;
+ key_buf[2]= ((cid >> 6) & 0x3F) | 0x80;
+ key_buf[3]= (cid & 0x3F) | 0x80;
key_buf[4] = '\0';
}
- else if (cid <= 0x1fffff)
+ else if (cid <= 0x1FFFFF)
{
- key_buf[1]= (cid >> 18) | 0xf0;
- key_buf[2]= ((cid >> 12) & 0x3f) | 0x80;
- key_buf[3]= ((cid >> 6) & 0x3f) | 0x80;
- key_buf[4]= (cid & 0x3f) | 0x80;
+ key_buf[1]= (cid >> 18) | 0xF0;
+ key_buf[2]= ((cid >> 12) & 0x3F) | 0x80;
+ key_buf[3]= ((cid >> 6) & 0x3F) | 0x80;
+ key_buf[4]= (cid & 0x3F) | 0x80;
key_buf[5] = '\0';
}
- else if (cid <= 0x3ffffff)
+ else if (cid <= 0x3FFFFFF)
{
- key_buf[1]= (cid >> 24) | 0xf8;
- key_buf[2]= ((cid >> 18) & 0x3f) | 0x80;
- key_buf[3]= ((cid >> 12) & 0x3f) | 0x80;
- key_buf[4]= ((cid >> 6) & 0x3f) | 0x80;
- key_buf[5]= (cid & 0x3f) | 0x80;
+ key_buf[1]= (cid >> 24) | 0xF8;
+ key_buf[2]= ((cid >> 18) & 0x3F) | 0x80;
+ key_buf[3]= ((cid >> 12) & 0x3F) | 0x80;
+ key_buf[4]= ((cid >> 6) & 0x3F) | 0x80;
+ key_buf[5]= (cid & 0x3F) | 0x80;
key_buf[6] = '\0';
}
else
{
- key_buf[1]= (cid >> 30) | 0xfc;
- key_buf[2]= ((cid >> 24) & 0x3f) | 0x80;
- key_buf[3]= ((cid >> 18) & 0x3f) | 0x80;
- key_buf[4]= ((cid >> 12) & 0x3f) | 0x80;
- key_buf[5]= ((cid >> 6) & 0x3f) | 0x80;
- key_buf[6]= (cid & 0x3f) | 0x80;
+ key_buf[1]= (cid >> 30) | 0xFC;
+ key_buf[2]= ((cid >> 24) & 0x3F) | 0x80;
+ key_buf[3]= ((cid >> 18) & 0x3F) | 0x80;
+ key_buf[4]= ((cid >> 12) & 0x3F) | 0x80;
+ key_buf[5]= ((cid >> 6) & 0x3F) | 0x80;
+ key_buf[6]= (cid & 0x3F) | 0x80;
key_buf[7] = '\0';
}
return
{
DB* dbase;
int status;
- int len;
+ int len, flen, i;
int size;
- char *db_file_name;
+ char *db_file_name, *sp;
status = db_create (&dbase, NULL, 0);
if (status)
return -1;
len = strlen (db_dir);
- size = len + strlen (encoding) + strlen (feature) + 4;
+ flen = strlen (feature);
+ size = len + strlen (encoding) + flen * 3 + 4;
db_file_name = alloca (size);
strcpy (db_file_name, db_dir);
if (db_file_name[len - 1] != '/')
}
strcat (db_file_name, encoding);
strcat (db_file_name, "/");
- strcat (db_file_name, feature);
+ /* strcat (db_file_name, feature); */
+ sp = &db_file_name[strlen (db_file_name)];
+ for (i = 0; i < flen; i++)
+ {
+ int c = feature[i];
+
+ if ( (c == '/') || (c == '%') )
+ {
+ sprintf (sp, "%%%02X", c);
+ sp += 3;
+ }
+ else
+ *sp++ = c;
+ }
+ *sp = '\0';
status = dbase->open (dbase, db_file_name, NULL,
real_subtype, accessmask, modemask);
if (status)