#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <dirent.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "chise.h"
#include "chise-name.h"
+const unsigned char chise_db_dir[] = CHISE_DB_DIR;
+const unsigned char chise_system_db_dir[] = CHISE_SI_DB_DIR;
CHISE_Feature_Table*
chise_ds_open_feature_table (CHISE_DS *ds, const char *feature);
CHISE_Attribute_Table*
CHISE_Attribute_Table_open (const unsigned char *db_dir,
- const char *encoding, const char *feature,
+ const char *category,
+ const char *key_type, const char *name,
DBTYPE real_subtype,
u_int32_t accessmask, int modemask);
};
CHISE_DS*
-CHISE_DS_open (CHISE_DS_Type type, char *location,
- DBTYPE subtype, int modemask)
+CHISE_DS_open (CHISE_DS_Type type, const unsigned char *location,
+ int subtype, int modemask)
{
CHISE_DS *ds = (CHISE_DS*)malloc (sizeof (CHISE_DS));
size_t len = strlen (location);
return NULL;
ds->type = type;
- ds->subtype = subtype;
+ ds->subtype = ( (subtype != 0) ? subtype : DB_HASH );
ds->modemask = modemask;
ds->location = (unsigned char*)malloc (len + 1);
if (ds->location == NULL)
return ct;
}
+int
+chise_ds_foreach_char_feature_name (CHISE_DS *ds,
+ int (*func) (CHISE_DS *ds,
+ unsigned char *name))
+{
+ unsigned char *dname
+ = alloca (strlen (ds->location) + sizeof ("/character/feature") + 1);
+ DIR *dir;
+ struct dirent *de;
+
+ strcpy (dname, ds->location);
+ strcat (dname, "/character/feature");
+
+ if ( (dir = opendir (dname)) == NULL)
+ return -1;
+
+ while ( (de = readdir (dir)) != NULL )
+ {
+ if ( (strcmp (de->d_name, ".") != 0) &&
+ (strcmp (de->d_name, "..") != 0) )
+ {
+ int i, need_to_decode = 0;
+ unsigned char *cp;
+ unsigned char *name;
+ unsigned char *np;
+
+ for (cp = de->d_name, i = 0; *cp != '\0'; i++)
+ {
+ if (*cp++ == '%')
+ need_to_decode = 1;
+ }
+ if (need_to_decode)
+ {
+ int index = -1;
+ int ch, c[2];
+ int hex[2];
+
+ name = (unsigned char *) alloca (i);
+ cp = de->d_name;
+ np = name;
+
+ while ( (ch = *cp++) != '\0')
+ {
+ if (ch == '%')
+ {
+ if (index >= 0)
+ {
+ *np++ = '%';
+ if (index == 1)
+ *np++ = c[0];
+ }
+ index = 0;
+ }
+ else if (index >= 0)
+ {
+ c[index] = ch;
+
+ if ( ('0' <= ch) && (ch <= '9') )
+ hex[index++] = ch - '0';
+ else if ( ('A' <= ch) && (ch <= 'F') )
+ hex[index++] = ch - 'A' + 10;
+ else if ( ('a' <= ch) && (ch <= 'f') )
+ hex[index++] = ch - 'a' + 10;
+ else
+ {
+ *np++ = '%';
+ if (index == 1)
+ *np++ = c[0];
+ *np++ = ch;
+ index = -1;
+ continue;
+ }
+ if (index == 2)
+ {
+ *np++ = (hex[0] << 4) | hex[1];
+ index = -1;
+ continue;
+ }
+ }
+ else
+ *np++ = ch;
+ }
+ *np = '\0';
+ }
+ else
+ name = de->d_name;
+
+ if (func (ds, name))
+ return closedir (dir);
+ }
+ }
+ return closedir (dir);
+}
struct CHISE_Feature_Table
{
CHISE_DS *ds = feature->ds;
feature->db
- = CHISE_Attribute_Table_open (ds->location,
- "system-char-id", feature->name,
+ = CHISE_Attribute_Table_open (ds->location, "character",
+ "feature", feature->name,
ds->subtype, access, ds->modemask);
if (feature->db == NULL)
return -1;
}
int
-chise_char_feature_value_iterate (CHISE_Feature feature,
- int (*func) (CHISE_Char_ID cid,
- CHISE_Feature feature,
- CHISE_Value *valdatum))
+chise_feature_foreach_char_with_value (CHISE_Feature feature,
+ int (*func) (CHISE_Char_ID cid,
+ CHISE_Feature feature,
+ CHISE_Value *valdatum))
{
DBT keydatum, valdatum;
DBC *dbcp;
CHISE_DS *ds = ccs->ds;
ccs->db
- = CHISE_Attribute_Table_open (ds->location,
- ccs->name, "system-char-id",
+ = CHISE_Attribute_Table_open (ds->location, "character",
+ "by_feature", ccs->name,
ds->subtype, access, ds->modemask);
if (ccs->db == NULL)
return -1;
CHISE_Attribute_Table*
CHISE_Attribute_Table_open (const unsigned char *db_dir,
- const char *encoding, const char *feature,
+ const char *category,
+ const char *key_type, const char *name,
DBTYPE real_subtype,
u_int32_t accessmask, int modemask)
{
DB* dbase;
int status;
- int len, flen, i;
+ int len, name_len, i;
int size;
char *db_file_name, *sp;
struct stat statbuf;
mkdir (db_dir, modemask);
len = strlen (db_dir);
- flen = strlen (feature);
- size = len + strlen (encoding) + flen * 3 + 4;
+ name_len = strlen (name);
+ size = len + strlen (category) + strlen (key_type) + name_len * 3 + 5;
db_file_name = alloca (size);
strcpy (db_file_name, db_dir);
if (db_file_name[len - 1] != '/')
db_file_name[len++] = '/';
db_file_name[len] = '\0';
}
- strcat (db_file_name, encoding);
+ strcat (db_file_name, category);
if ( (accessmask & DB_CREATE) && stat (db_file_name, &statbuf) )
mkdir (db_file_name, modemask);
+ strcat (db_file_name, "/");
+ strcat (db_file_name, key_type);
+ if ( (accessmask & DB_CREATE) && stat (db_file_name, &statbuf) )
+ mkdir (db_file_name, modemask);
strcat (db_file_name, "/");
- /* strcat (db_file_name, feature); */
+
+ /* strcat (db_file_name, name); */
sp = &db_file_name[strlen (db_file_name)];
- for (i = 0; i < flen; i++)
+ for (i = 0; i < name_len; i++)
{
- int c = feature[i];
+ int c = name[i];
if ( (c == '/') || (c == '%') )
{