+DEFUN ("concord-ds-directory", Fconcord_ds_directory, 1, 1, 0, /*
+Return directory of concord-ds DS.
+*/
+ (ds))
+{
+ Lisp_CONCORD_DS* lds;
+ unsigned char* directory;
+
+ CHECK_CONCORD_DS (ds);
+ lds = XCONCORD_DS (ds);
+ if (lds->ds == NULL)
+ return Qnil;
+
+ directory = concord_ds_location (lds->ds);
+ if (directory == NULL)
+ return Qnil;
+
+ return build_ext_string (directory, Qfile_name);
+}
+
+
+DEFUN ("concord-assign-genre", Fconcord_assign_genre, 2, 2, 0, /*
+Assign data-source DIRECTORY to GENRE.
+*/
+ (genre, directory))
+{
+ struct gcpro gcpro1;
+
+ CHECK_SYMBOL (genre);
+ if ( CONCORD_DS_P (directory) )
+ {
+ }
+ else
+ {
+ CHECK_STRING (directory);
+ GCPRO1 (directory);
+ directory
+ = Ffile_name_as_directory (Fexpand_file_name (directory, Qnil));
+ UNGCPRO;
+ }
+ Fputhash (genre, directory, Vconcord_genre_hash_table);
+ return directory;
+}
+
+DEFUN ("concord-genre-directory", Fconcord_genre_directory, 1, 1, 0, /*
+Return pathname of GENRE.
+*/
+ (genre))
+{
+ Lisp_Object retval;
+ CHECK_SYMBOL (genre);
+
+ retval = Fgethash (genre, Vconcord_genre_hash_table, Qunbound);
+ if ( STRINGP (retval) )
+ return retval;
+ else if ( CONCORD_DS_P (retval) )
+ return Fconcord_ds_directory (retval);
+ return Qnil;
+}
+
+DEFUN ("concord-genre-ds", Fconcord_genre_ds, 1, 1, 0, /*
+Return concord-ds of GENRE.
+*/
+ (genre))
+{
+ Lisp_Object retval;
+
+ CHECK_SYMBOL (genre);
+
+ retval = Fgethash (genre, Vconcord_genre_hash_table, Qunbound);
+ if ( STRINGP (retval) )
+ {
+ retval = Fconcord_open_ds (retval, Qnil, Qnil, Qnil);
+ if ( !NILP (retval) )
+ Fputhash (genre, retval, Vconcord_genre_hash_table);
+ return retval;
+ }
+ else if ( CONCORD_DS_P (retval) )
+ return retval;
+ return Qnil;
+}
+