1  /************************************************************************/
2  /*                                                                      */
3  /*                Centre for Speech Technology Research                 */
4  /*                     University of Edinburgh, UK                      */
5  /*                       Copyright (c) 1996,1997                        */
6  /*                        All Rights Reserved.                          */
7  /*                                                                      */
8  /*  Permission is hereby granted, free of charge, to use and distribute */
9  /*  this software and its documentation without restriction, including  */
10  /*  without limitation the rights to use, copy, modify, merge, publish, */
11  /*  distribute, sublicense, and/or sell copies of this work, and to     */
12  /*  permit persons to whom this work is furnished to do so, subject to  */
13  /*  the following conditions:                                           */
14  /*   1. The code must retain the above copyright notice, this list of   */
15  /*      conditions and the following disclaimer.                        */
16  /*   2. Any modifications must be clearly marked as such.               */
17  /*   3. Original authors' names are not deleted.                        */
18  /*   4. The authors' names are not used to endorse or promote products  */
19  /*      derived from this software without specific prior written       */
20  /*      permission.                                                     */
21  /*                                                                      */
22  /*  THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK       */
23  /*  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING     */
24  /*  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT  */
25  /*  SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE    */
26  /*  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES   */
27  /*  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN  */
28  /*  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,         */
29  /*  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF      */
30  /*  THIS SOFTWARE.                                                      */
31  /*                                                                      */
32  /*************************************************************************/
33  /*                                                                       */
34  /*                 Author: Richard Caley (rjc@cstr.ed.ac.uk)             */
35  /*                   Date: Tue Jul 29 1997                               */
36  /* --------------------------------------------------------------------  */
37  /* Some things useful in modules.                                        */
38  /*                                                                       */
39  /*************************************************************************/
40 
41 #include "module_support.h"
42 
43 #define CAR6(x) CAR(CDR5(x))
44 #define CDR6(x) CDR(CDR5(x))
45 #define CAR7(x) CAR(CDR6(x))
46 #define CDR7(x) CDR(CDR6(x))
47 
48 #define CDR_to1(X) ((X!=NIL)&&CDR1(X))
49 #define CDR_to2(X) (CDR_to1(X)&&CDR2(X))
50 #define CDR_to3(X) (CDR_to2(X)&&CDR3(X))
51 #define CDR_to4(X) (CDR_to3(X)&&CDR4(X))
52 #define CDR_to5(X) (CDR_to4(X)&&CDR5(X))
53 #define CDR_to6(X) (CDR_to5(X)&&CDR6(X))
54 #define CDR_to7(X) (CDR_to6(X)&&CDR7(X))
55 
56 
unpack_multiple_args(LISP args,LISP & v1,LISP & v2,LISP & v3,LISP & v4)57 void unpack_multiple_args(LISP args, LISP &v1, LISP &v2, LISP &v3, LISP &v4)
58 {
59   if (args)
60     {
61       v1 = CAR1(args);
62       if (CDR1(args))
63 	{
64 	  v2 = CAR2(args);
65 	  if (CDR2(args))
66 	    {
67 	      v3 = CAR3(args);
68 	      if (CDR3(args))
69 		v4 = CAR4(args);
70 	    }
71 	}
72     }
73 }
74 
unpack_multiple_args(LISP args,LISP & v1,LISP & v2,LISP & v3,LISP & v4,LISP & v5)75 void unpack_multiple_args(LISP args, LISP &v1, LISP &v2, LISP &v3, LISP &v4, LISP &v5)
76 {
77   unpack_multiple_args(args, v1, v2, v3, v4);
78 
79   if (CDR4(args))
80     v5 = CAR5(args);
81 }
82 
unpack_relation_arg(EST_Utterance * utt,LISP lrel_name,EST_String & relation_name,EST_Relation * & relation,RelArgType type)83 void unpack_relation_arg(EST_Utterance *utt,
84 			 LISP lrel_name,
85 			 EST_String &relation_name,
86 			 EST_Relation *&relation,
87 			 RelArgType type)
88 {
89     if (lrel_name)
90 	relation_name = get_c_string(lrel_name);
91 
92     if(utt->relation(relation_name))
93 	relation = utt->relation(relation_name);
94 
95     if (type==sat_existing)
96     {
97 	if(!relation)
98 	    err("no relation", relation_name);
99     }
100     else if (type==sat_new || type==sat_replace)
101     {
102 	if (relation)
103 	    if (type==sat_new)
104 		err("relation exists", relation_name);
105 	utt->create_relation(relation_name);
106 
107 	relation = &(*(utt->relation(relation_name)));
108     }
109 }
110 
unpack_module_args(LISP args,EST_Utterance * & utt)111 void unpack_module_args(LISP args, EST_Utterance *&utt)
112 {
113   if (args)
114     {
115       LISP lutt = CAR1(args);
116 
117       utt = get_c_utt(lutt);
118       return;
119     }
120   err("no utterance given", NIL);
121 }
122 
123 
unpack_module_args(LISP args,EST_Utterance * & utt,EST_String & relation1_name,EST_Relation * & relation1,RelArgType type1)124 void unpack_module_args(LISP args,
125 			EST_Utterance *&utt,
126 			EST_String &relation1_name, EST_Relation *&relation1, RelArgType type1)
127 {
128   unpack_module_args(args, utt);
129 
130   unpack_relation_arg(utt, CDR_to1(args)?CAR2(args):NIL, relation1_name, relation1, type1);
131 }
132 
unpack_module_args(LISP args,EST_Utterance * & utt,EST_String & relation1_name,EST_Relation * & relation1,RelArgType type1,EST_String & relation2_name,EST_Relation * & relation2,RelArgType type2)133 void unpack_module_args(LISP args,
134 			EST_Utterance *&utt,
135 			EST_String &relation1_name, EST_Relation *&relation1, RelArgType type1,
136 			EST_String &relation2_name, EST_Relation *&relation2, RelArgType type2
137 			)
138 {
139   unpack_module_args(args, utt);
140 
141   unpack_relation_arg(utt, CDR_to1(args)?CAR2(args):NIL, relation1_name, relation1, type1);
142   unpack_relation_arg(utt, CDR_to2(args)?CAR3(args):NIL, relation2_name, relation2, type2);
143 }
144 
unpack_module_args(LISP args,EST_Utterance * & utt,EST_String & relation1_name,EST_Relation * & relation1,RelArgType type1,EST_String & relation2_name,EST_Relation * & relation2,RelArgType type2,EST_String & relation3_name,EST_Relation * & relation3,RelArgType type3)145 void unpack_module_args(LISP args,
146 			EST_Utterance *&utt,
147 			EST_String &relation1_name, EST_Relation *&relation1, RelArgType type1,
148 			EST_String &relation2_name, EST_Relation *&relation2, RelArgType type2,
149 			EST_String &relation3_name, EST_Relation *&relation3, RelArgType type3
150 			)
151 {
152   unpack_module_args(args, utt);
153 
154   unpack_relation_arg(utt, CDR_to1(args)?CAR2(args):NIL, relation1_name, relation1, type1);
155   unpack_relation_arg(utt, CDR_to2(args)?CAR3(args):NIL, relation2_name, relation2, type2);
156   unpack_relation_arg(utt, CDR_to3(args)?CAR4(args):NIL, relation3_name, relation3, type3);
157 }
158 
unpack_module_args(LISP args,EST_Utterance * & utt,EST_String & relation1_name,EST_Relation * & relation1,RelArgType type1,EST_String & relation2_name,EST_Relation * & relation2,RelArgType type2,EST_String & relation3_name,EST_Relation * & relation3,RelArgType type3,EST_String & relation4_name,EST_Relation * & relation4,RelArgType type4)159 void unpack_module_args(LISP args,
160 			EST_Utterance *&utt,
161 			EST_String &relation1_name, EST_Relation *&relation1, RelArgType type1,
162 			EST_String &relation2_name, EST_Relation *&relation2, RelArgType type2,
163 			EST_String &relation3_name, EST_Relation *&relation3, RelArgType type3,
164 			EST_String &relation4_name, EST_Relation *&relation4, RelArgType type4
165 			)
166 {
167   unpack_module_args(args, utt);
168 
169   unpack_relation_arg(utt, CDR_to1(args)?CAR2(args):NIL, relation1_name, relation1, type1);
170   unpack_relation_arg(utt, CDR_to2(args)?CAR3(args):NIL, relation2_name, relation2, type2);
171   unpack_relation_arg(utt, CDR_to3(args)?CAR4(args):NIL, relation3_name, relation3, type3);
172   unpack_relation_arg(utt, CDR_to4(args)?CAR5(args):NIL, relation4_name, relation4, type4);
173 }
174 
unpack_module_args(LISP args,EST_Utterance * & utt,EST_String & relation1_name,EST_Relation * & relation1,RelArgType type1,EST_String & relation2_name,EST_Relation * & relation2,RelArgType type2,EST_String & relation3_name,EST_Relation * & relation3,RelArgType type3,EST_String & relation4_name,EST_Relation * & relation4,RelArgType type4,EST_String & relation5_name,EST_Relation * & relation5,RelArgType type5)175 void unpack_module_args(LISP args,
176 			EST_Utterance *&utt,
177 			EST_String &relation1_name, EST_Relation *&relation1, RelArgType type1,
178 			EST_String &relation2_name, EST_Relation *&relation2, RelArgType type2,
179 			EST_String &relation3_name, EST_Relation *&relation3, RelArgType type3,
180 			EST_String &relation4_name, EST_Relation *&relation4, RelArgType type4,
181 			EST_String &relation5_name, EST_Relation *&relation5, RelArgType type5
182 			)
183 {
184   unpack_module_args(args, utt);
185 
186   unpack_relation_arg(utt, CDR_to1(args)?CAR2(args):NIL, relation1_name, relation1, type1);
187   unpack_relation_arg(utt, CDR_to2(args)?CAR3(args):NIL, relation2_name, relation2, type2);
188   unpack_relation_arg(utt, CDR_to3(args)?CAR4(args):NIL, relation3_name, relation3, type3);
189   unpack_relation_arg(utt, CDR_to4(args)?CAR5(args):NIL, relation4_name, relation4, type4);
190   unpack_relation_arg(utt, CDR_to5(args)?CAR6(args):NIL, relation5_name, relation5, type5);
191 }
192 
193