1 /* XEmacs routines to deal with CONCORD.
2 Copyright (C) 2005,2006 MORIOKA Tomohiko
4 This file is part of XEmacs.
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Synched up with: Not in FSF. */
23 /* Written by MORIOKA Tomohiko */
33 EXFUN (Fread_from_string, 3);
36 EXFUN (Fconcord_decode_object, 4);
37 EXFUN (Fconcord_object_put, 3);
40 Lisp_Object Qconcord_object;
41 Lisp_Object Qgenre, Q_id;
43 Lisp_Object Vconcord_ds_hash_table;
44 Lisp_Object Vconcord_genre_hash_table;
47 typedef struct Lisp_CONCORD_DS Lisp_CONCORD_DS;
48 DECLARE_LRECORD (concord_ds, Lisp_CONCORD_DS);
50 Lisp_Object Qconcord_dsp;
52 struct Lisp_CONCORD_DS
54 struct lcrecord_header header;
58 #define XCONCORD_DS(x) XRECORD (x, concord_ds, Lisp_CONCORD_DS)
59 #define XSET_CONCORD_DS(x, p) XSETRECORD (x, p, concord_ds)
60 #define CONCORD_DS_P(x) RECORDP (x, concord_ds)
61 #define CHECK_CONCORD_DS(x) CHECK_RECORD (x, concord_ds)
62 #define CONCHECK_CONCORD_DS(x) CONCHECK_RECORD (x, concord_ds)
64 static Lisp_CONCORD_DS*
65 allocate_concord_ds (void)
68 = alloc_lcrecord_type (Lisp_CONCORD_DS, &lrecord_concord_ds);
75 mark_concord_ds (Lisp_Object object)
81 print_concord_ds (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
83 Lisp_CONCORD_DS* lds = XCONCORD_DS (obj);
86 error ("printing unreadable object #<concord_ds 0x%x>", lds->header.uid);
88 write_c_string ("#<concord_ds \"", printcharfun);
89 write_c_string (concord_ds_location (lds->ds), printcharfun);
90 write_c_string ("\">", printcharfun);
94 finalize_concord_ds (void *header, int for_disksave)
96 Lisp_CONCORD_DS *lds = (Lisp_CONCORD_DS *) header;
101 XSET_CONCORD_DS (object, lds);
104 ("Can't dump an emacs containing concord_ds objects", object);
106 if ( lds->ds != NULL)
107 concord_close_ds (lds->ds);
110 DEFINE_LRECORD_IMPLEMENTATION ("concord_ds", concord_ds,
111 mark_concord_ds, print_concord_ds,
112 finalize_concord_ds, 0, 0, 0,
115 DEFUN ("concord-close-ds", Fconcord_close_ds, 1, 1, 0, /*
116 Close concord-ds CONCORD-DS.
120 Lisp_CONCORD_DS* lds;
121 lds = XCONCORD_DS (concord_ds);
122 if ( lds->ds != NULL)
123 concord_close_ds (lds->ds);
128 DEFUN ("concord-ds-p", Fconcord_ds_p, 1, 1, 0, /*
129 Return t if OBJECT is a concord-ds.
133 return CONCORD_DS_P (object) ? Qt : Qnil;
136 DEFUN ("concord-open-ds", Fconcord_open_ds, 1, 4, 0, /*
137 Return a new concord-ds object opened on DIRECTORY.
138 Optional arguments TYPE and SUBTYPE specify the concord_ds type.
139 Optional argument MODE gives the permissions to use when opening DIRECTORY,
140 and defaults to 0755.
142 (directory, type, subtype, mode))
145 Lisp_CONCORD_DS* lds = NULL;
151 CHECK_STRING (directory);
153 directory = Ffile_name_as_directory (Fexpand_file_name (directory, Qnil));
156 retval = Fgethash (directory, Vconcord_ds_hash_table, Qunbound);
157 if (!UNBOUNDP (retval))
162 TO_EXTERNAL_FORMAT (LISP_STRING, directory,
163 C_STRING_ALLOCA, pathname,
168 modemask = 0755; /* rwxr-xr-x */
173 modemask = XINT (mode);
176 ds = concord_open_ds (CONCORD_Backend_Berkeley_DB,
177 pathname, 0, modemask);
181 lds = allocate_concord_ds ();
183 XSET_CONCORD_DS (retval, lds);
184 Fputhash (directory, retval, Vconcord_ds_hash_table);
188 DEFUN ("concord-ds-directory", Fconcord_ds_directory, 1, 1, 0, /*
189 Return directory of concord-ds DS.
193 Lisp_CONCORD_DS* lds;
196 CHECK_CONCORD_DS (ds);
197 lds = XCONCORD_DS (ds);
201 directory = concord_ds_location (lds->ds);
202 if (directory == NULL)
205 return build_ext_string (directory, Qfile_name);
209 DEFUN ("concord-assign-genre", Fconcord_assign_genre, 2, 2, 0, /*
210 Assign data-source DIRECTORY to GENRE.
216 CHECK_SYMBOL (genre);
217 if ( CONCORD_DS_P (directory) )
222 CHECK_STRING (directory);
225 = Ffile_name_as_directory (Fexpand_file_name (directory, Qnil));
228 Fputhash (genre, directory, Vconcord_genre_hash_table);
232 DEFUN ("concord-genre-directory", Fconcord_genre_directory, 1, 1, 0, /*
233 Return pathname of GENRE.
238 CHECK_SYMBOL (genre);
240 retval = Fgethash (genre, Vconcord_genre_hash_table, Qunbound);
241 if ( STRINGP (retval) )
243 else if ( CONCORD_DS_P (retval) )
244 return Fconcord_ds_directory (retval);
248 DEFUN ("concord-genre-ds", Fconcord_genre_ds, 1, 1, 0, /*
249 Return concord-ds of GENRE.
255 CHECK_SYMBOL (genre);
257 retval = Fgethash (genre, Vconcord_genre_hash_table, Qunbound);
258 if ( STRINGP (retval) )
260 retval = Fconcord_open_ds (retval, Qnil, Qnil, Qnil);
261 if ( !NILP (retval) )
262 Fputhash (genre, retval, Vconcord_genre_hash_table);
265 else if ( CONCORD_DS_P (retval) )
271 struct closure_to_list_feature
273 Lisp_Object feature_list;
274 } *concord_feature_list_closure;
277 add_feature_to_list_mapper (CONCORD_Genre genre, char* name)
279 /* This function can GC */
280 concord_feature_list_closure->feature_list
281 = Fcons (intern (name), concord_feature_list_closure->feature_list);
285 DEFUN ("concord-feature-list", Fconcord_feature_list, 1, 2, 0, /*
286 Return the list of all existing features in GENRE.
290 Lisp_CONCORD_DS* lds;
292 CONCORD_Genre c_genre;
295 CHECK_SYMBOL (genre);
297 ds = Fconcord_genre_ds (genre);
298 CHECK_CONCORD_DS (ds);
299 lds = XCONCORD_DS (ds);
302 genre = Fsymbol_name (genre);
303 TO_EXTERNAL_FORMAT (LISP_STRING, genre,
304 C_STRING_ALLOCA, genre_name,
306 c_genre = concord_ds_get_genre (lds->ds, genre_name);
309 concord_feature_list_closure
310 = alloca (sizeof (struct closure_to_list_feature));
311 concord_feature_list_closure->feature_list = Qnil;
312 GCPRO1 (concord_feature_list_closure->feature_list);
313 concord_genre_foreach_feature_name (c_genre,
314 add_feature_to_list_mapper);
316 return concord_feature_list_closure->feature_list;
320 typedef struct Lisp_CONCORD_Object Lisp_CONCORD_Object;
321 DECLARE_LRECORD (concord_object, Lisp_CONCORD_Object);
323 Lisp_Object Qconcord_objectp;
325 struct Lisp_CONCORD_Object
327 struct lcrecord_header header;
332 #define XCONCORD_OBJECT(x) XRECORD (x, concord_object, Lisp_CONCORD_Object)
333 #define XSET_CONCORD_OBJECT(x, p) XSETRECORD (x, p, concord_object)
334 #define CONCORD_OBJECT_P(x) RECORDP (x, concord_object)
335 #define CHECK_CONCORD_OBJECT(x) CHECK_RECORD (x, concord_object)
336 #define CONCHECK_CONCORD_OBJECT(x) CONCHECK_RECORD (x, concord_object)
337 #define CONCORD_OBJECT_GENRE(x) ((x)->genre)
338 #define CONCORD_OBJECT_ID(x) ((x)->id)
339 #define XCONCORD_OBJECT_ID(x) CONCORD_OBJECT_ID (XCONCORD_OBJECT(x))
340 #define XCONCORD_OBJECT_GENRE(x) CONCORD_OBJECT_GENRE (XCONCORD_OBJECT(x))
342 static Lisp_CONCORD_Object*
343 allocate_concord_object (void)
345 Lisp_CONCORD_Object* lcobj
346 = alloc_lcrecord_type (Lisp_CONCORD_Object, &lrecord_concord_object);
349 lcobj->id = Qunbound;
354 mark_concord_object (Lisp_Object object)
356 mark_object (XCONCORD_OBJECT_ID(object));
361 print_concord_object (Lisp_Object obj,
362 Lisp_Object printcharfun, int escapeflag)
364 Lisp_CONCORD_Object* lcobj = XCONCORD_OBJECT (obj);
365 struct gcpro gcpro1, gcpro2;
369 write_c_string ("#s(concord-object", printcharfun);
370 write_c_string (" genre ", printcharfun);
371 write_c_string (concord_genre_get_name (lcobj->genre), printcharfun);
372 write_c_string (" =id ", printcharfun);
373 GCPRO2 (obj, printcharfun);
374 print_internal (lcobj->id, printcharfun, escapeflag);
376 write_c_string (")", printcharfun);
380 write_c_string ("#<concord-object \"", printcharfun);
381 write_c_string (concord_ds_location
382 (concord_genre_get_data_source (lcobj->genre)),
384 write_c_string (":", printcharfun);
385 write_c_string (concord_genre_get_name (lcobj->genre), printcharfun);
386 write_c_string (";", printcharfun);
387 GCPRO2 (obj, printcharfun);
388 print_internal (lcobj->id, printcharfun, escapeflag);
390 write_c_string ("\">", printcharfun);
395 finalize_concord_object (void *header, int for_disksave)
397 Lisp_CONCORD_Object* lcobj = (Lisp_CONCORD_Object *) header;
402 XSET_CONCORD_OBJECT (object, lcobj);
405 ("Can't dump an emacs containing concord_object objects", object);
409 static const struct lrecord_description concord_object_description[] = {
410 { XD_LISP_OBJECT, offsetof (Lisp_CONCORD_Object, id) },
414 DEFINE_LRECORD_IMPLEMENTATION ("concord_object", concord_object,
415 mark_concord_object, print_concord_object,
416 finalize_concord_object, 0, 0,
417 concord_object_description,
418 Lisp_CONCORD_Object);
420 DEFUN ("concord-make-object", Fconcord_make_object, 1, 3, 0, /*
421 Make and return a Concord-object from ID and GENRE.
422 Optional argument DS specifies the data-source of the GENRE.
426 Lisp_CONCORD_DS* lds;
428 CONCORD_Genre c_genre;
429 Lisp_CONCORD_Object* lcobj;
433 ds = Fconcord_genre_ds (genre);
434 CHECK_CONCORD_DS (ds);
435 lds = XCONCORD_DS (ds);
438 if ( !STRINGP(genre) )
439 genre = Fsymbol_name (genre);
440 TO_EXTERNAL_FORMAT (LISP_STRING, genre,
441 C_STRING_ALLOCA, genre_name,
443 c_genre = concord_ds_get_genre (lds->ds, genre_name);
449 retval = Fconcord_decode_object (Q_id, id, genre, ds);
454 lcobj = allocate_concord_object ();
455 lcobj->genre = c_genre;
457 XSET_CONCORD_OBJECT (retval, lcobj);
461 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
463 GCPRO4 (retval, id, genre, ds);
464 Fconcord_object_put (retval, Q_id, id);
471 DEFUN ("concord-object-p", Fconcord_object_p, 1, 1, 0, /*
472 Return t if OBJECT is a concord-object.
476 return CONCORD_OBJECT_P (object) ? Qt : Qnil;
479 DEFUN ("concord-object-id", Fconcord_object_id, 1, 1, 0, /*
480 Return an id of Concord-object OBJECT.
484 CHECK_CONCORD_OBJECT (object);
485 return XCONCORD_OBJECT_ID (object);
488 DEFUN ("concord-decode-object", Fconcord_decode_object, 2, 4, 0, /*
489 Make and return a Concord-object from FEATURE and VALUE.
490 Optional argument GENRE specifies the GENRE of the object.
491 Optional argument DS specifies the data-source of the GENRE.
493 (feature, value, genre, ds))
495 Lisp_CONCORD_DS* lds;
497 CONCORD_Genre c_genre;
499 CONCORD_INDEX c_index;
500 Lisp_Object value_string;
502 CONCORD_String_Tank st_id;
505 int previous_print_readably;
506 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
509 ds = Fconcord_genre_ds (genre);
510 CHECK_CONCORD_DS (ds);
511 lds = XCONCORD_DS (ds);
514 if ( !STRINGP(feature) )
515 feature = Fsymbol_name (feature);
516 if ( !STRINGP(genre) )
517 genre = Fsymbol_name (genre);
518 TO_EXTERNAL_FORMAT (LISP_STRING, genre,
519 C_STRING_ALLOCA, genre_name,
521 c_genre = concord_ds_get_genre (lds->ds, genre_name);
527 TO_EXTERNAL_FORMAT (LISP_STRING, feature,
528 C_STRING_ALLOCA, feature_name,
530 c_index = concord_genre_get_index (c_genre, feature_name);
536 previous_print_readably = print_readably;
538 GCPRO5 (feature, value, genre, ds, value_string);
539 value_string = Fprin1_to_string (value, Qnil);
541 print_readably = previous_print_readably;
542 TO_EXTERNAL_FORMAT (LISP_STRING,
543 value_string, C_STRING_ALLOCA, strid,
545 status = concord_index_strid_get_obj_string (c_index, strid, &st_id);
550 GCPRO4 (genre, ds, obj, retval);
552 obj = read_from_c_string (CONCORD_String_data (&st_id),
553 CONCORD_String_size (&st_id) );
555 obj = Fcar (Fread_from_string (make_ext_string
556 ((char*)CONCORD_String_data (&st_id),
557 CONCORD_String_size (&st_id),
561 retval = Fconcord_make_object (genre, obj, ds);
568 DEFUN ("concord-object-get", Fconcord_object_get, 2, 2, 0, /*
569 Return the value of OBJECT's FEATURE.
573 struct gcpro gcpro1, gcpro2;
574 int previous_print_readably;
575 Lisp_Object obj_string;
577 CONCORD_Genre c_genre;
579 CONCORD_Feature c_feature;
581 CONCORD_String_Tank st_value;
583 CHECK_CONCORD_OBJECT (object);
584 if ( !STRINGP(feature) )
585 feature = Fsymbol_name (feature);
586 previous_print_readably = print_readably;
588 GCPRO2 (object, feature);
589 obj_string = Fprin1_to_string (XCONCORD_OBJECT_ID(object), Qnil);
591 print_readably = previous_print_readably;
592 TO_EXTERNAL_FORMAT (LISP_STRING, obj_string,
593 C_STRING_ALLOCA, c_obj, Qfile_name);
594 c_genre = XCONCORD_OBJECT_GENRE(object);
595 TO_EXTERNAL_FORMAT (LISP_STRING, feature,
596 C_STRING_ALLOCA, feature_name,
598 c_feature = concord_genre_get_feature (c_genre, feature_name);
599 if (c_feature == NULL)
603 status = concord_obj_get_feature_value_string (c_obj, c_feature,
608 Fcar (Fread_from_string (make_ext_string
609 ((char*)CONCORD_String_data (&st_value),
610 CONCORD_String_size (&st_value),
617 DEFUN ("concord-object-put", Fconcord_object_put, 3, 3, 0, /*
618 Store a VALUE of OBJECT's FEATURE.
620 (object, feature, value))
622 struct gcpro gcpro1, gcpro2, gcpro3;
623 int previous_print_readably;
624 Lisp_Object obj_string;
626 CONCORD_Genre c_genre;
628 CONCORD_Feature c_feature;
630 Lisp_Object value_string;
633 CHECK_CONCORD_OBJECT (object);
634 if ( !STRINGP(feature) )
635 feature = Fsymbol_name (feature);
636 previous_print_readably = print_readably;
638 GCPRO3 (object, feature, value);
639 obj_string = Fprin1_to_string (XCONCORD_OBJECT_ID(object), Qnil);
641 print_readably = previous_print_readably;
642 TO_EXTERNAL_FORMAT (LISP_STRING, obj_string,
643 C_STRING_ALLOCA, c_obj, Qfile_name);
644 c_genre = XCONCORD_OBJECT_GENRE(object);
645 TO_EXTERNAL_FORMAT (LISP_STRING, feature,
646 C_STRING_ALLOCA, feature_name,
648 c_feature = concord_genre_get_feature (c_genre, feature_name);
649 if (c_feature == NULL)
653 previous_print_readably = print_readably;
655 GCPRO3 (object, feature, value);
656 value_string = Fprin1_to_string (value, Qnil);
658 print_readably = previous_print_readably;
659 TO_EXTERNAL_FORMAT (LISP_STRING, value_string,
660 C_STRING_ALLOCA, c_value,
662 status = concord_obj_put_feature_value_str (c_obj, c_feature,
663 (unsigned char*)c_value);
666 status = chise_feature_sync (c_feature);
669 if (feature_name[0] == '=')
671 CONCORD_INDEX c_index
672 = concord_genre_get_index (c_genre, feature_name);
674 status = concord_index_strid_put_obj (c_index, c_value, c_obj);
679 struct closure_for_object_spec
683 } *concord_object_spec_closure;
686 add_feature_to_spec_mapper (CONCORD_Genre genre, char* name)
688 /* This function can GC */
689 CONCORD_String_Tank st_value;
690 CONCORD_Feature c_feature;
693 c_feature = concord_genre_get_feature (genre, name);
694 if (c_feature == NULL)
698 concord_obj_get_feature_value_string
699 (concord_object_spec_closure->object_id, c_feature, &st_value);
702 concord_object_spec_closure->spec
703 = Fcons (Fcons (intern (name),
704 Fcar (Fread_from_string
706 ((char*)CONCORD_String_data (&st_value),
707 CONCORD_String_size (&st_value),
710 concord_object_spec_closure->spec);
715 DEFUN ("concord-object-spec", Fconcord_object_spec, 1, 1, 0, /*
716 Return the spec of OBJECT.
720 Lisp_Object obj_string;
722 CONCORD_Genre c_genre;
723 struct gcpro gcpro1, gcpro2;
724 int previous_print_readably;
726 CHECK_CONCORD_OBJECT (object);
727 previous_print_readably = print_readably;
730 obj_string = Fprin1_to_string (XCONCORD_OBJECT_ID(object), Qnil);
732 print_readably = previous_print_readably;
733 TO_EXTERNAL_FORMAT (LISP_STRING, obj_string,
734 C_STRING_ALLOCA, c_obj, Qfile_name);
735 c_genre = XCONCORD_OBJECT_GENRE(object);
736 concord_object_spec_closure
737 = alloca (sizeof (struct closure_for_object_spec));
738 concord_object_spec_closure->object_id = c_obj;
739 concord_object_spec_closure->spec = Qnil;
740 GCPRO2 (object, concord_object_spec_closure->spec);
741 concord_genre_foreach_feature_name (c_genre,
742 add_feature_to_spec_mapper);
744 return concord_object_spec_closure->spec;
747 struct closure_for_each_object
749 Lisp_Object function;
753 } *for_each_object_closure;
756 func_for_each_object (CONCORD_String object_id,
757 CONCORD_Feature feature,
758 CONCORD_String value)
760 struct gcpro gcpro1, gcpro2, gcpro3;
761 Lisp_Object obj, val, ret;
764 obj = read_from_c_string (CONCORD_String_data (object_id),
765 CONCORD_String_size (object_id) );
767 obj = Fcar (Fread_from_string (make_ext_string
768 ((char*)CONCORD_String_data (object_id),
769 CONCORD_String_size (object_id),
774 obj = Fconcord_make_object (for_each_object_closure->genre,
776 for_each_object_closure->ds);
779 val = read_from_c_string (CONCORD_String_data (value),
780 CONCORD_String_size (value) );
782 val = Fcar (Fread_from_string (make_ext_string
783 ((char*)CONCORD_String_data (value),
784 CONCORD_String_size (value),
788 GCPRO3 (obj, val, ret);
789 ret = call2 (for_each_object_closure->function, obj, val);
791 for_each_object_closure->ret = ret;
795 DEFUN ("concord-for-each-object-in-feature",
796 Fconcord_foreach_object_in_feature, 2, 4, 0, /*
797 Do FUNCTION over objects in FEATURE, calling it with two args,
798 each key and value in the FEATURE table.
799 Optional argument GENRE specifies the genre of the FEATURE.
800 When the FUNCTION returns non-nil, it breaks the repeat.
802 (function, feature, genre, ds))
804 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
805 Lisp_CONCORD_DS* lds;
807 CONCORD_Genre c_genre;
809 CONCORD_Feature c_feature;
812 ds = Fconcord_genre_ds (genre);
813 CHECK_CONCORD_DS (ds);
814 lds = XCONCORD_DS (ds);
817 if ( !STRINGP(feature) )
818 feature = Fsymbol_name (feature);
819 if ( !STRINGP(genre) )
820 genre = Fsymbol_name (genre);
821 TO_EXTERNAL_FORMAT (LISP_STRING, genre,
822 C_STRING_ALLOCA, genre_name,
824 c_genre = concord_ds_get_genre (lds->ds, genre_name);
828 CHECK_STRING (feature);
829 TO_EXTERNAL_FORMAT (LISP_STRING, feature,
830 C_STRING_ALLOCA, feature_name,
832 c_feature = concord_genre_get_feature (c_genre, feature_name);
833 if (c_feature == NULL)
835 for_each_object_closure
836 = alloca (sizeof (struct closure_for_each_object));
837 for_each_object_closure->function = function;
838 for_each_object_closure->genre = genre;
839 for_each_object_closure->ds = ds;
840 for_each_object_closure->ret = Qnil;
841 GCPRO4 (for_each_object_closure->function,
842 for_each_object_closure->genre,
843 for_each_object_closure->ds,
844 for_each_object_closure->ret);
845 concord_feature_foreach_obj_string (c_feature, func_for_each_object);
848 return for_each_object_closure->ret;
853 concord_name_validate (Lisp_Object keyword, Lisp_Object value,
856 if (ERRB_EQ (errb, ERROR_ME))
858 CHECK_SYMBOL (value);
862 return SYMBOLP (value);
866 concord_object_validate (Lisp_Object data, Error_behavior errb)
868 struct gcpro gcpro1, gcpro2, gcpro3;
870 Lisp_Object valw = Qnil;
871 Lisp_Object genre = Qnil;
872 Lisp_Object oid = Qnil;
874 data = Fcdr (data); /* skip over Qconcord_object */
877 Lisp_Object keyw = Fcar (data);
882 if (EQ (keyw, Qgenre))
884 else if (EQ (keyw, Q_id))
892 maybe_error (Qconcord_object, errb, "No genre given");
897 maybe_error (Qconcord_object, errb, "No object-id given");
901 GCPRO3 (genre, oid, retval);
902 retval = Fconcord_make_object (genre, oid, Qnil);
906 maybe_signal_simple_error_2 ("No such Concord-object",
907 oid, genre, Qconcord_object, errb);
915 concord_object_instantiate (Lisp_Object data)
917 struct gcpro gcpro1, gcpro2;
920 GCPRO2 (data, retval);
921 retval = Fconcord_make_object (Fplist_get (data, Qgenre, Qnil),
922 Fplist_get (data, Q_id, Qnil),
930 syms_of_concord (void)
932 INIT_LRECORD_IMPLEMENTATION (concord_ds);
933 INIT_LRECORD_IMPLEMENTATION (concord_object);
935 defsymbol (&Qconcord, "concord");
936 defsymbol (&Qconcord_dsp, "concord-dsp");
937 defsymbol (&Qconcord_objectp, "concord-objectp");
938 defsymbol (&Qconcord_object, "concord-object");
939 defsymbol (&Qgenre, "genre");
940 defsymbol (&Q_id, "=id");
942 DEFSUBR (Fconcord_open_ds);
943 DEFSUBR (Fconcord_ds_p);
944 DEFSUBR (Fconcord_close_ds);
945 DEFSUBR (Fconcord_ds_directory);
947 DEFSUBR (Fconcord_assign_genre);
948 DEFSUBR (Fconcord_genre_directory);
949 DEFSUBR (Fconcord_genre_ds);
950 DEFSUBR (Fconcord_feature_list);
952 DEFSUBR (Fconcord_make_object);
953 DEFSUBR (Fconcord_object_p);
954 DEFSUBR (Fconcord_object_id);
955 DEFSUBR (Fconcord_decode_object);
956 DEFSUBR (Fconcord_object_get);
957 DEFSUBR (Fconcord_object_put);
958 DEFSUBR (Fconcord_object_spec);
959 DEFSUBR (Fconcord_foreach_object_in_feature);
963 structure_type_create_concord (void)
965 struct structure_type *st;
967 st = define_structure_type (Qconcord_object,
968 concord_object_validate,
969 concord_object_instantiate);
971 define_structure_type_keyword (st, Qgenre, concord_name_validate);
972 define_structure_type_keyword (st, Q_id, concord_name_validate);
976 vars_of_concord (void)
980 staticpro (&Vconcord_ds_hash_table);
981 Vconcord_ds_hash_table
982 = make_lisp_hash_table (8, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
984 staticpro (&Vconcord_genre_hash_table);
985 Vconcord_genre_hash_table
986 = make_lisp_hash_table (16, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);