|
|
1.1 root 1: .th EQUEL UNIX 3/14/79
2: .if n .ds EE EQUEL
3: .if t .ds EE \s-2EQUEL\s0
4: .sh NAME
5: equel \- Embedded QUEL interface to C
6: .sh SYNOPSIS
7: .bd equel
8: [
9: .bd \-d
10: ] [
11: .bd \-f
12: ] [
13: .bd \-r
14: ] file.q ...
15: .sh DESCRIPTION
16: .it Equel
17: provides the user with a method of interfacing
18: the general purpose programming language ``C'' with
19: \*(II.
20: It consists of the
21: \*(EE
22: pre-compiler and the
23: \*(EE
24: runtime library.
25: .s1
26: .bd Compilation
27: .s2
28: The precompiler is invoked with the statement:
29: .s3
30: .ti +5
31: .bd equel
32: [<flags>] file1.q [<flags>] file2.q ...
33: .s3
34: where file\c
35: .it n\c
36: \&.q
37: are the source input file names,
38: which must end with
39: .bd \&.q.
40: The output is written to the file
41: ``file\c
42: .it n\c
43: \&.c''.
44: As many files as wished may be specified.
45: .br
46: The flags that may be used are:
47: .de xp
48: .s3
49: .lp +5 5
50: .if n \\$1\t\c
51: .if t \fB\\$1\fP\t\c
52: ..
53: .xp \-d
54: Generate code to print source listing file name
55: and line number when a run-time error occurs. This
56: can be useful for debugging, but takes up process space.
57: Defaults to off.
58: .xp \-f
59: Forces code to be on the same line in the output file
60: as it is in the input file to ease interpreting C diagnostic
61: messages.
62: \*(EE
63: will usually try to get all C code lines in the
64: output file on the same lines as they were in the
65: input file.
66: Sometimes it
67: must break up queries into several lines to avoid C-preprocessor line
68: overflows, possibly moving
69: some C code ahead some lines.
70: With the
71: .bd \-f
72: flag specified this will never happen and, though the line buffer
73: may overflow, C lines will be on the right line.
74: This is useful
75: for finding the line in the
76: source
77: file that C error diagnostics on the
78: output
79: file refer to.
80: .xp \-r
81: Resets flags to default values.
82: Used to supress other flags for
83: some of the files in the argument list.
84: .i0
85: .dt
86: .s3
87: The output files may than be compiled using the C compiler:
88: .s3
89: .ti +5
90: .bd cc
91: file1.c file2.c ...
92: .bd \-lq
93: .s3
94: The
95: .bd \-lq
96: requests the use of the
97: \*(EE
98: object library.
99: .s3
100: All
101: \*(EE
102: routines and globals begin with the characters "II",
103: and so all globals variables and procedure names of the form
104: II\c
105: .it xxx
106: are reserved for use by
107: \*(EE
108: and should be avoided by
109: \*(EE
110: users.
111: .s1
112: .bd "Basic Syntax"
113: .s2
114: \*(EE
115: commands are indicated by lines which begin with a double
116: pound sign (``##'').
117: Other lines are simply copied as is.
118: All normal
119: \*(II
120: commands may be used in
121: \*(EE
122: and have the same effect as if invoked through the interactive
123: terminal monitor.
124: Only retrieve commands with no result relation
125: specified have a different syntax and meaning.
126: .s3
127: The format of retrieve without a result relation is modified to:
128: .s3
129: .in +5
130: ## retrieve (C-variable = a_fcn { , C-variable = a_fcn } )
131: .s3
132: .ti -5
133: optionally followed (immediately) by:
134: .s3
135: ## [
136: .bd where
137: .it qual
138: ]
139: .br
140: ## {
141: .br
142: /\*(** C-code \*(**/
143: .br
144: ## }
145: .i0
146: .s3
147: This statement causes the ``C-code'' to be executed once for
148: each tuple retrieved,
149: with the ``C-variable''s set appropriately.
150: Numeric values of any type are converted as necessary.
151: No conversion is done between numeric and character values.
152: (The normal \*(II
153: .it ascii
154: function may be used for this purpose.)
155: .s3
156: Also, the following
157: \*(EE
158: commands are permitted.
159: .in +5
160: .sp
161: .ti -5
162: .bd "## ingres"
163: [ingres flags] data_base_name
164: .br
165: This command starts
166: \*(II
167: running, and directs all dynamically following queries to
168: the database
169: .it data_base_name.
170: It is a run-time error to execute this command twice
171: without an intervening ``## exit'',
172: as well as to issue queries while an ``## ingres'' statement is
173: not in effect.
174: Each flag should be enclosed in quotes to avoid confusion in the
175: \*(EE
176: parser:
177: .s3
178: ## ingres "\-f4f10.2" "\-i212" demo
179: .s3
180: .ti -5
181: .bd "## exit"
182: .br
183: Exit simply exits from
184: \*(II.
185: It is equivalent to the
186: .bd \eq
187: command to the teletype monitor.
188: .i0
189: .s1
190: .bd "Parametrized Quel Statements"
191: .s2
192: Quel statements with target lists may be ``parametrized''.
193: This is indicated by
194: preceding the statement with the keyword ``param''.
195: The target list of a parametrized statement has the form:
196: .s3
197: (
198: .it "tl_var, argv"
199: )
200: .s3
201: where
202: .it tl_var
203: is taken to be a string pointer at execution time (it may
204: be a string constant) and interpreted as follows.
205: For any parametrized
206: \*(EE
207: statement except a retrieve without a
208: result relation (no ``into rel'') (i.e. append, copy, create, replace,
209: retrieve into) the string
210: .it tl_var
211: is taken to be a regular target list
212: except that wherever a `%' appears a valid
213: \*(II
214: type (f4, f8, i2, i4, c)
215: is expected to follow.
216: Each of these is replaced by the value of the
217: corresponding entry into
218: .it argv
219: (starting at 0)
220: which is interpreted to be a pointer to a variable of the type indicated
221: by the `%' sequence.
222: Neither
223: .it argv
224: nor the variables which it points to
225: need be declared to
226: \*(EE.
227: For example:
228: .ne 12
229: .nf
230: .s3
231: .in +5
232: char \*(**argv[10];
233:
234: argv[0] = &double_var;
235: argv[1] = &int_var;
236: ## param append to rel
237: ## ("dom1 = %f8, dom2 = %i2", argv)
238: ## /\*(** to escape the "%<ingres_type>" mechanism use "%%" \*(**/
239: ## /\*(** This places a single `%' in the string. \*(**/
240: .i0
241: .fi
242: .s3
243: On a retrieve to C-variables, within
244: .it tl_var,
245: instead of
246: the C-variable to retrieve
247: into, the same `%' escape sequences are used to denote the type of the
248: corresponding argv entry
249: into which the value will be retrieved.
250: .s3
251: The qualification of any query may be replaced by a string valued variable,
252: whose contents is interpreted at run time
253: as the text of the qualification.
254: .s3
255: The
256: .it copy
257: statement may also be parametrized.
258: The form of the parametrized
259: .it copy
260: is analogous to the other parametrized statements: the target list
261: may be parametrized
262: in the same manner as the
263: .it append
264: statements, and furthermore, the
265: .bd from/into
266: keyword may be replaced by a string valued variable
267: whose content at run time should be
268: .bd into
269: or
270: .bd from.
271: .s1
272: .bd "Declarations"
273: .s2
274: Any valid C variable declaration on a line
275: beginning with a ``\c
276: .bd ##\c
277: \&''
278: declares a C-variable that may be used
279: in an
280: \*(EE
281: statement and as a normal
282: variable.
283: All variables must be declared before being used.
284: Anywhere a constant may appear in an
285: \*(II
286: command,
287: a C-variable may appear.
288: The value of the C-variable is substituted at execution time.
289: .s3
290: Neither nested structures nor variables of type
291: .it char
292: (as opposed to pointer to char or array of char)
293: are allowed.
294: Furthermore, there are two restrictions in the way variables are
295: referenced within
296: \*(EE
297: statements.
298: All variable usages must be dereferenced
299: and/or subscripted (for arrays and pointers),
300: or selected (for structure variables) to yield lvalues (scalar values).
301: .it Char
302: variables are used by
303: \*(EE
304: as a means to use
305: .it strings.
306: Therefore when using a
307: .it char
308: array or pointer it must be dereferenced only to a ``\c
309: .it "char \*(**\*|\c"
310: \&''.
311: Also, variables may not have parentheses in their references.
312: For example:
313: .ne 12
314: .nf
315: .in +5
316: .s3
317: ## struct xxx
318: ## {
319: int i;
320: ## int \*(**ip;
321: ## } \*(**\*(**struct_var;
322:
323: /\*(** not allowed \*(**/
324: ## delete p where p.ifield = \*(**(\*(**struct_var)->ip
325:
326: /\*(** allowed \*(**/
327: ## delete p where p.ifield = \*(**struct_var[0]->ip
328: .i0
329: .fi
330: .s3
331: C variables declared to
332: \*(EE
333: have either global or local scope.
334: Their scope is local if their declaration is within a free
335: (not bound to a retrieve)
336: block declared to \*(EE.
337: For example:
338: .s3
339: .ne 10
340: .in +5
341: .nf
342: /\*(** globals scope variable \*(**/
343: ## int Gint;
344:
345: func(i)
346: int i;
347: ## {
348: /\*(** local scope variable \*(**/
349: ## int \*(**gintp;
350: ...
351: ## }
352: .fi
353: .in -5
354: .s3
355: If a variable of one of the char types is used almost anywhere
356: in an
357: \*(EE
358: statement
359: the content of that variable is used at run time.
360: For example:
361: .nf
362: .in +5
363: .s3
364: ## char \*(**dbname[MAXDATABASES + 1];
365: int current_db;
366:
367: dbname[current_db] = "demo";
368: ## ingres dbname[current_db]
369: .in -5
370: .fi
371: .s3
372: will cause
373: \*(II
374: to be invoked with data base ``demo''.
375: However, if a variable's name is to be used as a
376: constant, then the non-referencing operator `#' should be used.
377: For example:
378: .nf
379: .ne 13
380: .in +5
381: .s3
382: ## char \*(**demo;
383:
384: demo = "my_database";
385:
386: /\*(** ingres \-d my_database \*(**/
387: ## ingres "\-d" demo
388:
389: /\*(** ingres \-d demo \*(**/
390: ## ingres "\-d" #demo
391: .in -5
392: .fi
393: .s3
394: The C-preprocessor's #include feature may be used
395: on files containing
396: equel statements and declarations if these files
397: are named
398: .it anything\c
399: .bd \&.q.h.
400: An
401: \*(EE
402: processed version of the file, which will
403: be #included by the C-preprocessor, is left in
404: .it anything\c
405: .bd \&.c.h.
406: .s1
407: .bd "Errors and Interrupts"
408: .s2
409: \*(II
410: and run-time
411: \*(EE
412: errors cause the routine
413: .bd IIerror
414: to be called,
415: with the error number and the parameters to the error in an
416: array of string pointers as in a C language main routine.
417: The error message will be looked up
418: and printed. before printing the error message, the routine
419: (\*(**IIprint_err)() is called with the error number that ocurred as
420: its single argument.
421: The error message corresponding to the error number returned
422: by (\*(**IIprint_err)() will be printed.
423: Printing will be supressed if (\*(**IIprint_err)() returns 0.
424: IIprint_err may be reassigned to, and
425: is useful for programs which map
426: \*(II
427: errors into their own
428: error messages.
429: In addition, if the ``\c
430: .bd \-d\c
431: \&''
432: flag was set the file name and line number of the error will be printed.
433: The user may write an IIerror routine to do other tasks
434: as long as the setting of IIerrflag is not modified
435: as this is used to exit retrieves correctly.
436: .s3
437: Interrupts are caught by equel if they are not being ignored.
438: This insures that the rest of \*(II is in sync with the
439: \*(EE
440: process.
441: There is a function pointer, IIinterrupt, which points to a function to
442: call after the interrupt is caught. The user may use this to service the
443: interrupt.
444: It is initialized to "exit()" and is called with \*-1 as its argument.
445: For example:
446: .nf
447: .s3
448: extern int (\*(**IIinterrupt)();
449: extern reset();
450:
451: setexit();
452: IIinterrupt = reset;
453: mainloop();
454: .s3
455: .fi
456: To ignore interrupts, signal() should be called before the
457: ## ingres satatement is executed.
458: .sh FILES
459: .in +5
460: .ti -5
461: \&.../files/error7_\*(**
462: .br
463: Can be used by
464: the user to decipher \*(II error numbers.
465: .ti -5
466: /lib/libq.a
467: .br
468: Run time library.
469: .sh "SEE ALSO"
470: \&.../doc/other/equeltut.q,
471: C reference manual,
472: ingres(UNIX),
473: quel(QUEL)
474: .sh BUGS
475: The C-code embedded in the tuple-by-tuple retrieve operation
476: may not contain additional
477: QUEL statements or recursive invocations of
478: \*(II.
479: .s3
480: There is no way to specify an
481: .bd i1
482: format C-variable.
483: .s3
484: Includes of an equel file within a parameterized target list,
485: or within a C variable's array subscription brackets, isn't
486: done correctly.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.