]> git.saurik.com Git - apple/bootx.git/blame - bootx.tproj/ci.subproj/ci.c
BootX-36.tar.gz
[apple/bootx.git] / bootx.tproj / ci.subproj / ci.c
CommitLineData
04fee52e
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * ci.c - Functions for accessing Open Firmware's Client Interface
24 *
25 * Copyright (c) 1998-2000 Apple Computer, Inc.
26 *
27 * DRI: Josh de Cesare
28 */
29
30#include <sl.h>
31
32static ClientInterfacePtr gCIPtr;
33
34long InitCI(ClientInterfacePtr ciPtr)
35{
36 gCIPtr = ciPtr;
37
38 return 0;
39}
40
41long CallCI(CIArgs *ciArgsPtr)
42{
43 long ret;
44
45 ret = (*gCIPtr)(ciArgsPtr);
46 return ret;
47}
48
49
50// Device Tree
51
52// Peer take a phandle and returns the next peer.
53// It returns zero of there are no more peers.
54CICell Peer(CICell phandle)
55{
56 CIArgs ciArgs;
57 CICell peer_ph;
58 long ret;
59
60 ciArgs.service = "peer";
61 ciArgs.nArgs = 1;
62 ciArgs.nReturns = 1;
63 ciArgs.args.peer.phandle = phandle;
64
65 ret = CallCI(&ciArgs);
66 if (ret != 0) return kCIError;
67
68 peer_ph = ciArgs.args.peer.peerPhandle;
69
70 return peer_ph;
71}
72
73// Child take a phandle and returns the first child.
74// It returns zero of there in no child.
75CICell Child(CICell phandle)
76{
77 CIArgs ciArgs;
78 CICell child_ph;
79 long ret;
80
81 ciArgs.service = "child";
82 ciArgs.nArgs = 1;
83 ciArgs.nReturns = 1;
84 ciArgs.args.child.phandle = phandle;
85
86 ret = CallCI(&ciArgs);
87 if (ret != 0) return kCIError;
88
89 child_ph = ciArgs.args.child.childPhandle;
90
91 return child_ph;
92}
93
94// Parent take a phandle and returns the parent node.
95// It returns zero of if the phandle is the root node.
96CICell Parent(CICell phandle)
97{
98 CIArgs ciArgs;
99 CICell parent_ph;
100 long ret;
101
102 ciArgs.service = "parent";
103 ciArgs.nArgs = 1;
104 ciArgs.nReturns = 1;
105 ciArgs.args.parent.childPhandle = phandle;
106
107 ret = CallCI(&ciArgs);
108 if (ret != 0) return kCIError;
109
110 parent_ph = ciArgs.args.parent.parentPhandle;
111
112 return parent_ph;
113}
114
115// FindDevice take a device spec and returns the phandle.
116// It returns zero of if the device was not found.
117CICell FindDevice(char *devSpec)
118{
119 CIArgs ciArgs;
120 CICell phandle;
121 long ret;
122
123 ciArgs.service = "finddevice";
124 ciArgs.nArgs = 1;
125 ciArgs.nReturns = 1;
126 ciArgs.args.finddevice.devSpec = devSpec;
127
128 ret = CallCI(&ciArgs);
129 if (ret != 0) return kCIError;
130
131 phandle = ciArgs.args.finddevice.phandle;
132
133 return phandle;
134}
135
136// InstanceToPath take an ihandle, buf and buflen. Set the device path
137// to the package in buf upto buflen characters and returns the length
138// Length will be -1 if the ihandle is invalid.
139CICell InstanceToPath(CICell ihandle, char *buf, long buflen)
140{
141 CIArgs ciArgs;
142 CICell length;
143 long ret;
144
145 ciArgs.service = "instance-to-path";
146 ciArgs.nArgs = 3;
147 ciArgs.nReturns = 1;
148 ciArgs.args.instanceToPath.ihandle = ihandle;
149 ciArgs.args.instanceToPath.buf = buf;
150 ciArgs.args.instanceToPath.buflen = buflen;
151
152 ret = CallCI(&ciArgs);
153 if (ret != 0) return kCIError;
154
155 length = ciArgs.args.instanceToPath.length;
156
157 return length;
158}
159
160// InstanceToPackage take an ihandle and returns the phandle for it.
161// returns -1 if the phandle can't be found.
162CICell InstanceToPackage(CICell ihandle)
163{
164 CIArgs ciArgs;
165 CICell phandle;
166 long ret;
167
168 ciArgs.service = "instance-to-package";
169 ciArgs.nArgs = 1;
170 ciArgs.nReturns = 1;
171 ciArgs.args.instanceToPackage.ihandle = ihandle;
172
173 ret = CallCI(&ciArgs);
174 if (ret != 0) return kCIError;
175
176 phandle = ciArgs.args.instanceToPackage.phandle;
177
178 return phandle;
179}
180
181// InstanceToPackages
182
183// PackageToPath take a phandle, buf and buflen. Set the device path
184// to the package in buf upto buflen characters and returns the length
185// Length will be -1 if the phandle is invalid.
186CICell PackageToPath(CICell phandle, char *buf, long buflen)
187{
188 CIArgs ciArgs;
189 CICell length;
190 long ret;
191
192 if (gOFVersion >= kOFVersion2x) {
193 ciArgs.service = "package-to-path";
194 ciArgs.nArgs = 3;
195 ciArgs.nReturns = 1;
196 ciArgs.args.packageToPath.phandle = phandle;
197 ciArgs.args.packageToPath.buf = buf;
198 ciArgs.args.packageToPath.buflen = buflen;
199
200 ret = CallCI(&ciArgs);
201 if (ret != 0) return kCIError;
202
203 length = ciArgs.args.packageToPath.length;
204 } else {
205 ret = CallMethod_3_1(SLWordsIH, "slw_pwd", phandle,
206 (CICell)buf, buflen, &length);
207 if (ret != 0) return kCIError;
208
209 buf[length] = '\0';
210 }
211
212 return length;
213}
214
215// Canon
216
217// GetPropLen takes a phandle and prop name
218// and returns the size of the property
219// or -1 if the property is not valid.
220CICell GetPropLen(CICell phandle, char *name)
221{
222 CIArgs ciArgs;
223 CICell size;
224 long ret;
225
226 ciArgs.service = "getproplen";
227 ciArgs.nArgs = 2;
228 ciArgs.nReturns = 1;
229 ciArgs.args.getproplen.phandle = phandle;
230 ciArgs.args.getproplen.name = name;
231
232 ret = CallCI(&ciArgs);
233 if (ret != 0) return kCIError;
234
235 size = ciArgs.args.getproplen.size;
236
237 return size;
238}
239
240// GetProp takes a phandle, prop name, buffer and length
241// and copied the property value in to the buffer.
242// returns -1 if the property is not valid.
243CICell GetProp(CICell phandle, char *name, char *buf, long buflen)
244{
245 CIArgs ciArgs;
246 CICell size;
247 long ret;
248
249 ciArgs.service = "getprop";
250 ciArgs.nArgs = 4;
251 ciArgs.nReturns = 1;
252 ciArgs.args.getprop.phandle = phandle;
253 ciArgs.args.getprop.name = name;
254 ciArgs.args.getprop.buf = buf;
255 ciArgs.args.getprop.buflen = buflen;
256
257 ret = CallCI(&ciArgs);
258 if (ret != 0) return kCIError;
259
260 size = ciArgs.args.getprop.size;
261
262 return size;
263}
264
265// NextProp takes a phandle, prev name, and a buffer
266// and copied the next property name in to the buffer.
267// returns -1 if the property is not valid.
268// returns 0 if the prev was the last property.
269// returns 1 otherwise.
270CICell NextProp(CICell phandle, char *previous, char *buf)
271{
272 CIArgs ciArgs;
273 CICell flag;
274 long ret;
275
276 ciArgs.service = "nextprop";
277 ciArgs.nArgs = 3;
278 ciArgs.nReturns = 1;
279 ciArgs.args.nextprop.phandle = phandle;
280 ciArgs.args.nextprop.previous = previous;
281 ciArgs.args.nextprop.buf = buf;
282
283 ret = CallCI(&ciArgs);
284 if (ret != 0) return kCIError;
285
286 flag = ciArgs.args.nextprop.flag;
287
288 return flag;
289}
290
291// SetProp takes a phandle, prop name, buffer and length
292// and copied the buffer in to the property value.
293// returns -1 if the property could not be set or created.
294CICell SetProp(CICell phandle, char *name, char *buf, long buflen)
295{
296 CIArgs ciArgs;
297 CICell size;
298 long ret;
299
300 ciArgs.service = "setprop";
301 ciArgs.nArgs = 4;
302 ciArgs.nReturns = 1;
303 ciArgs.args.setprop.phandle = phandle;
304 ciArgs.args.setprop.name = name;
305 ciArgs.args.setprop.buf = buf;
306 ciArgs.args.setprop.buflen = buflen;
307
308 ret = CallCI(&ciArgs);
309 if (ret != 0) return kCIError;
310
311 size = ciArgs.args.setprop.size;
312
313 return size;
314}
315
316
317// Device I/O
318
319// Open takes a device specifier and returns an iHandle
320// It returns zero if the device can not be found or opened.
321CICell Open(char *devSpec)
322{
323 CIArgs ciArgs;
324 CICell ihandle;
325 long ret;
326
327 ciArgs.service = "open";
328 ciArgs.nArgs = 1;
329 ciArgs.nReturns = 1;
330 ciArgs.args.open.devSpec = devSpec;
331
332 ret = CallCI(&ciArgs);
333 if (ret != 0) return 0;
334
335 ihandle = ciArgs.args.open.ihandle;
336
337 return ihandle;
338}
339
340// Close takes an iHandle and closes the device.
341void Close(CICell ihandle)
342{
343 CIArgs ciArgs;
344
345 ciArgs.service = "close";
346 ciArgs.nArgs = 1;
347 ciArgs.nReturns = 0;
348 ciArgs.args.close.ihandle = ihandle;
349
350 CallCI(&ciArgs);
351}
352
353// Read takes an iHandle, an address and a length and return the actual
354// Length read. Returns -1 if the operaction failed.
355CICell Read(CICell ihandle, long addr, long length)
356{
357 CIArgs ciArgs;
358 long actual;
359 long ret;
360
361 ciArgs.service = "read";
362 ciArgs.nArgs = 3;
363 ciArgs.nReturns = 1;
364 ciArgs.args.read.ihandle = ihandle;
365 ciArgs.args.read.addr = addr;
366 ciArgs.args.read.length = length;
367
368 ret = CallCI(&ciArgs);
369 if (ret != 0) return kCIError;
370
371 actual = ciArgs.args.read.actual;
372
373 // Spin the wait cursor.
374 Spin();
375
376 return actual;
377}
378
379// Write takes an iHandle, an address and a length and return the actual
380// Length written. Returns -1 if the operaction failed.
381CICell Write(CICell ihandle, long addr, long length)
382{
383 CIArgs ciArgs;
384 long actual;
385 long ret;
386
387 ciArgs.service = "write";
388 ciArgs.nArgs = 3;
389 ciArgs.nReturns = 1;
390 ciArgs.args.write.ihandle = ihandle;
391 ciArgs.args.write.addr = addr;
392 ciArgs.args.write.length = length;
393
394 ret = CallCI(&ciArgs);
395 if (ret != 0) return kCIError;
396
397 actual = ciArgs.args.write.actual;
398
399 return actual;
400}
401
402// Seek takes an iHandle, and a 64 bit position
403// and moves to that address in file.
404// returns seeks result, or -1 if seek is not supported.
405CICell Seek(CICell ihandle, long long position)
406{
407 CIArgs ciArgs;
408 long ret;
409
410 ciArgs.service = "seek";
411 ciArgs.nArgs = 3;
412 ciArgs.nReturns = 1;
413 ciArgs.args.seek.ihandle = ihandle;
414 ciArgs.args.seek.pos_high = position >> 32;
415 ciArgs.args.seek.pos_low = position & 0x00000000FFFFFFFFULL;
416
417 ret = CallCI(&ciArgs);
418 if (ret != 0) return kCIError;
419
420 ret = ciArgs.args.seek.result;
421
422 return ret;
423}
424
425
426// Other Device Method Invocation
427
428// Lots of CallMethod_n_m functions...
429// n is number of args, m is number of returns.
430
431long CallMethod_0_0(CICell iHandle, char *method)
432{
433 CIArgs ciArgs;
434 long ret;
435
436 ciArgs.service = "call-method";
437 ciArgs.nArgs = 2;
438 ciArgs.nReturns = 1;
439 ciArgs.args.callMethod_0_0.iHandle = iHandle;
440 ciArgs.args.callMethod_0_0.method = method;
441
442 ret = CallCI(&ciArgs);
443 if (ret != 0) return kCIError;
444 if (ciArgs.args.callMethod_0_0.catchResult != 0) return kCICatch;
445
446 return kCINoError;
447}
448
449long CallMethod_0_1(CICell iHandle, char *method, CICell *ret1)
450{
451 CIArgs ciArgs;
452 long ret;
453
454 ciArgs.service = "call-method";
455 ciArgs.nArgs = 2;
456 ciArgs.nReturns = 2;
457 ciArgs.args.callMethod_0_1.iHandle = iHandle;
458 ciArgs.args.callMethod_0_1.method = method;
459
460 ret = CallCI(&ciArgs);
461 if (ret != 0) return kCIError;
462 if (ciArgs.args.callMethod_0_1.catchResult != 0) return kCICatch;
463
464 *ret1 = ciArgs.args.callMethod_0_1.return1;
465
466 return kCINoError;
467}
468
469long CallMethod_1_0(CICell iHandle, char *method, CICell arg1)
470{
471 CIArgs ciArgs;
472 long ret;
473
474 ciArgs.service = "call-method";
475 ciArgs.nArgs = 3;
476 ciArgs.nReturns = 1;
477 ciArgs.args.callMethod_1_0.iHandle = iHandle;
478 ciArgs.args.callMethod_1_0.method = method;
479 ciArgs.args.callMethod_1_0.arg1 = arg1;
480
481 ret = CallCI(&ciArgs);
482 if (ret != 0) return kCIError;
483 if (ciArgs.args.callMethod_1_0.catchResult != 0) return kCICatch;
484
485 return kCINoError;
486}
487
488long CallMethod_1_1(CICell iHandle, char *method, CICell arg1, CICell *ret1)
489{
490 CIArgs ciArgs;
491 long ret;
492
493 ciArgs.service = "call-method";
494 ciArgs.nArgs = 3;
495 ciArgs.nReturns = 2;
496 ciArgs.args.callMethod_1_1.iHandle = iHandle;
497 ciArgs.args.callMethod_1_1.method = method;
498 ciArgs.args.callMethod_1_1.arg1 = arg1;
499
500 ret = CallCI(&ciArgs);
501 if (ret != 0) return kCIError;
502 if (ciArgs.args.callMethod_1_0.catchResult != 0) return kCICatch;
503
504 *ret1 = ciArgs.args.callMethod_1_1.return1;
505
506 return kCINoError;
507}
508
509long CallMethod_2_0(CICell iHandle, char *method,
510 CICell arg1, CICell arg2)
511{
512 CIArgs ciArgs;
513 long ret;
514
515 ciArgs.service = "call-method";
516 ciArgs.nArgs = 4;
517 ciArgs.nReturns = 1;
518 ciArgs.args.callMethod_2_0.iHandle = iHandle;
519 ciArgs.args.callMethod_2_0.method = method;
520 ciArgs.args.callMethod_2_0.arg1 = arg1;
521 ciArgs.args.callMethod_2_0.arg2 = arg2;
522
523 ret = CallCI(&ciArgs);
524 if (ret != 0) return kCIError;
525 if (ciArgs.args.callMethod_2_0.catchResult != 0) return kCICatch;
526
527 return kCINoError;
528}
529
530long CallMethod_3_0(CICell iHandle, char *method,
531 CICell arg1, CICell arg2, CICell arg3)
532{
533 CIArgs ciArgs;
534 long ret;
535
536 ciArgs.service = "call-method";
537 ciArgs.nArgs = 5;
538 ciArgs.nReturns = 1;
539 ciArgs.args.callMethod_3_0.iHandle = iHandle;
540 ciArgs.args.callMethod_3_0.method = method;
541 ciArgs.args.callMethod_3_0.arg1 = arg1;
542 ciArgs.args.callMethod_3_0.arg2 = arg2;
543 ciArgs.args.callMethod_3_0.arg3 = arg3;
544
545 ret = CallCI(&ciArgs);
546 if (ret != 0) return kCIError;
547 if (ciArgs.args.callMethod_3_0.catchResult != 0) return kCICatch;
548
549 return kCINoError;
550}
551
552long CallMethod_3_1(CICell iHandle, char *method,
553 CICell arg1, CICell arg2, CICell arg3, CICell *ret1)
554{
555 CIArgs ciArgs;
556 long ret;
557
558 ciArgs.service = "call-method";
559 ciArgs.nArgs = 5;
560 ciArgs.nReturns = 2;
561 ciArgs.args.callMethod_3_1.iHandle = iHandle;
562 ciArgs.args.callMethod_3_1.method = method;
563 ciArgs.args.callMethod_3_1.arg1 = arg1;
564 ciArgs.args.callMethod_3_1.arg2 = arg2;
565 ciArgs.args.callMethod_3_1.arg3 = arg3;
566
567 ret = CallCI(&ciArgs);
568 if (ret != 0) return kCIError;
569 if (ciArgs.args.callMethod_3_1.catchResult != 0) return kCICatch;
570
571 *ret1 = ciArgs.args.callMethod_3_1.return1;
572
573 return kCINoError;
574}
575
576long CallMethod_4_0(CICell iHandle, char *method,
577 CICell arg1, CICell arg2, CICell arg3, CICell arg4)
578{
579 CIArgs ciArgs;
580 long ret;
581
582 ciArgs.service = "call-method";
583 ciArgs.nArgs = 6;
584 ciArgs.nReturns = 1;
585 ciArgs.args.callMethod_4_0.iHandle = iHandle;
586 ciArgs.args.callMethod_4_0.method = method;
587 ciArgs.args.callMethod_4_0.arg1 = arg1;
588 ciArgs.args.callMethod_4_0.arg2 = arg2;
589 ciArgs.args.callMethod_4_0.arg3 = arg3;
590 ciArgs.args.callMethod_4_0.arg4 = arg4;
591
592 ret = CallCI(&ciArgs);
593 if (ret != 0) return kCIError;
594 if (ciArgs.args.callMethod_4_0.catchResult != 0) return kCICatch;
595
596 return kCINoError;
597}
598
599long CallMethod_5_0(CICell iHandle, char *method, CICell arg1, CICell arg2,
600 CICell arg3, CICell arg4, CICell arg5)
601{
602 CIArgs ciArgs;
603 long ret;
604
605 ciArgs.service = "call-method";
606 ciArgs.nArgs = 7;
607 ciArgs.nReturns = 1;
608 ciArgs.args.callMethod_5_0.iHandle = iHandle;
609 ciArgs.args.callMethod_5_0.method = method;
610 ciArgs.args.callMethod_5_0.arg1 = arg1;
611 ciArgs.args.callMethod_5_0.arg2 = arg2;
612 ciArgs.args.callMethod_5_0.arg3 = arg3;
613 ciArgs.args.callMethod_5_0.arg4 = arg4;
614 ciArgs.args.callMethod_5_0.arg5 = arg5;
615
616 ret = CallCI(&ciArgs);
617 if (ret != 0) return kCIError;
618 if (ciArgs.args.callMethod_5_0.catchResult != 0) return kCICatch;
619
620 return kCINoError;
621}
622
623long CallMethod_6_0(CICell iHandle, char *method, CICell arg1, CICell arg2,
624 CICell arg3, CICell arg4, CICell arg5, CICell arg6)
625{
626 CIArgs ciArgs;
627 long ret;
628
629 ciArgs.service = "call-method";
630 ciArgs.nArgs = 8;
631 ciArgs.nReturns = 1;
632 ciArgs.args.callMethod_6_0.iHandle = iHandle;
633 ciArgs.args.callMethod_6_0.method = method;
634 ciArgs.args.callMethod_6_0.arg1 = arg1;
635 ciArgs.args.callMethod_6_0.arg2 = arg2;
636 ciArgs.args.callMethod_6_0.arg3 = arg3;
637 ciArgs.args.callMethod_6_0.arg4 = arg4;
638 ciArgs.args.callMethod_6_0.arg5 = arg5;
639 ciArgs.args.callMethod_6_0.arg6 = arg6;
640
641 ret = CallCI(&ciArgs);
642 if (ret != 0) return kCIError;
643 if (ciArgs.args.callMethod_6_0.catchResult != 0) return kCICatch;
644
645 return kCINoError;
646}
647
648
649// Memory
650
651// Claim takes a virt address, a size, and an alignment.
652// It return baseaddr or -1 for claim failed.
653CICell Claim(CICell virt, CICell size, CICell align)
654{
655 CIArgs ciArgs;
656 CICell baseaddr;
657 long ret;
658
659 if (gOFVersion >= kOFVersion2x) {
660 // Claim actually works, so use it.
661 ciArgs.service = "claim";
662 ciArgs.nArgs = 3;
663 ciArgs.nReturns = 1;
664 ciArgs.args.claim.virt = virt;
665 ciArgs.args.claim.size = size;
666 ciArgs.args.claim.align = align;
667
668 ret = CallCI(&ciArgs);
669 if (ret != 0) return kCIError;
670
671 baseaddr = ciArgs.args.claim.baseaddr;
672 } else {
673 // Claim does not work. Do it by hand.
674 if ((gMMUIH == 0) || (gMMUIH == 0)) return kCIError;
675
676 // Get the physical memory
677 ret = CallMethod_3_1(gMemoryIH, "claim", virt, size, 0, &baseaddr);
678 if ((ret != kCINoError) || (virt != baseaddr)) return kCIError;
679
680 // Get the logical memory
681 ret = CallMethod_3_1(gMMUIH, "claim", virt, size, 0, &baseaddr);
682 if ((ret != kCINoError) || (virt != baseaddr)) return kCIError;
683
684 // Map them together.
685 ret = CallMethod_4_0(gMMUIH, "map", virt, virt, size, 0);
686 if (ret != kCINoError) return kCIError;
687 }
688
689 return baseaddr;
690}
691
692// Release takes a virt address, a size
693void Release(CICell virt, CICell size)
694{
695 CIArgs ciArgs;
696
697 ciArgs.service = "release";
698 ciArgs.nArgs = 2;
699 ciArgs.nReturns = 0;
700 ciArgs.args.claim.virt = virt;
701 ciArgs.args.claim.size = size;
702
703 CallCI(&ciArgs);
704}
705
706
707// Control Transfer
708
709// Boot trys to boot the bootspec
710void Boot(char *bootspec)
711{
712 CIArgs ciArgs;
713
714 ciArgs.service = "boot";
715 ciArgs.nArgs = 1;
716 ciArgs.nReturns = 0;
717 ciArgs.args.boot.bootspec = bootspec;
718
719 CallCI(&ciArgs);
720}
721
722// Enter the user interface.
723// Executing the 'go' command returns to the client.
724void Enter(void)
725{
726 CIArgs ciArgs;
727
728 ciArgs.service = "enter";
729 ciArgs.nArgs = 0;
730 ciArgs.nReturns = 0;
731
732 CallCI(&ciArgs);
733}
734
735// Exit the client program.
736void Exit(void)
737{
738 CIArgs ciArgs;
739
740 ciArgs.service = "exit";
741 ciArgs.nArgs = 0;
742 ciArgs.nReturns = 0;
743
744 CallCI(&ciArgs);
745}
746
747// Clain
748
749// Quiesce stops any async tasks in Open Firmware.
750void Quiesce(void)
751{
752 CIArgs ciArgs;
753
754 ciArgs.service = "quiesce";
755 ciArgs.nArgs = 0;
756 ciArgs.nReturns = 0;
757
758 CallCI(&ciArgs);
759}
760
761
762// User Interface
763
764// Lots of Interpret_n_m fundtions...
765// n is number of args, m is number of returns.
766
767long Interpret_0_0(char *forthString)
768{
769 CIArgs ciArgs;
770 long ret;
771
772 ciArgs.service = "interpret";
773 ciArgs.nArgs = 1;
774 ciArgs.nReturns = 1;
775 ciArgs.args.interpret_0_0.forth = forthString;
776
777 ret = CallCI(&ciArgs);
778 if (ret != 0) return kCIError;
779 if (ciArgs.args.interpret_0_0.catchResult != 0) return kCICatch;
780
781 return kCINoError;
782}
783
784long Interpret_1_0(char *forthString, CICell arg1)
785{
786 CIArgs ciArgs;
787 long ret;
788
789 ciArgs.service = "interpret";
790 ciArgs.nArgs = 2;
791 ciArgs.nReturns = 1;
792 ciArgs.args.interpret_1_0.forth = forthString;
793 ciArgs.args.interpret_1_0.arg1 = arg1;
794
795 ret = CallCI(&ciArgs);
796 if (ret != 0) return kCIError;
797 if (ciArgs.args.interpret_1_0.catchResult != 0) return kCICatch;
798
799 return kCINoError;
800}
801
802long Interpret_1_1(char *forthString, CICell arg1, CICell *ret1)
803{
804 CIArgs ciArgs;
805 long ret;
806
807 ciArgs.service = "interpret";
808 ciArgs.nArgs = 2;
809 ciArgs.nReturns = 2;
810 ciArgs.args.interpret_1_1.forth = forthString;
811 ciArgs.args.interpret_1_1.arg1 = arg1;
812
813 ret = CallCI(&ciArgs);
814 if (ret != 0) return kCIError;
815 if (ciArgs.args.interpret_1_1.catchResult != 0) return kCICatch;
816
817 *ret1 = ciArgs.args.interpret_1_1.return1;
818
819 return kCINoError;
820}
821
822long Interpret_2_1(char *forthString, CICell arg1, CICell arg2, CICell *ret1)
823{
824 CIArgs ciArgs;
825 long ret;
826
827 ciArgs.service = "interpret";
828 ciArgs.nArgs = 3;
829 ciArgs.nReturns = 2;
830 ciArgs.args.interpret_2_1.forth = forthString;
831 ciArgs.args.interpret_2_1.arg1 = arg1;
832 ciArgs.args.interpret_2_1.arg2 = arg2;
833
834 ret = CallCI(&ciArgs);
835 if (ret != 0) return kCIError;
836 if (ciArgs.args.interpret_2_1.catchResult != 0) return kCICatch;
837
838 *ret1 = ciArgs.args.interpret_2_1.return1;
839
840 return kCINoError;
841}
842
843long Interpret_3_1(char *forthString, CICell arg1, CICell arg2, CICell arg3,
844 CICell *ret1)
845{
846 CIArgs ciArgs;
847 long ret;
848
849 ciArgs.service = "interpret";
850 ciArgs.nArgs = 4;
851 ciArgs.nReturns = 2;
852 ciArgs.args.interpret_3_1.forth = forthString;
853 ciArgs.args.interpret_3_1.arg1 = arg1;
854 ciArgs.args.interpret_3_1.arg2 = arg2;
855 ciArgs.args.interpret_3_1.arg3 = arg3;
856
857 ret = CallCI(&ciArgs);
858 if (ret != 0) return kCIError;
859 if (ciArgs.args.interpret_3_1.catchResult != 0) return kCICatch;
860
861 *ret1 = ciArgs.args.interpret_3_1.return1;
862
863 return kCINoError;
864}
865
866long Interpret_3_2(char *forthString, CICell arg1, CICell arg2, CICell arg3,
867 CICell *ret1, CICell *ret2)
868{
869 CIArgs ciArgs;
870 long ret;
871
872 ciArgs.service = "interpret";
873 ciArgs.nArgs = 4;
874 ciArgs.nReturns = 3;
875 ciArgs.args.interpret_3_2.forth = forthString;
876 ciArgs.args.interpret_3_2.arg1 = arg1;
877 ciArgs.args.interpret_3_2.arg2 = arg2;
878 ciArgs.args.interpret_3_2.arg3 = arg3;
879
880 ret = CallCI(&ciArgs);
881 if (ret != 0) return kCIError;
882 if (ciArgs.args.interpret_3_2.catchResult != 0) return kCICatch;
883
884 *ret1 = ciArgs.args.interpret_3_2.return1;
885 *ret2 = ciArgs.args.interpret_3_2.return2;
886
887 return kCINoError;
888}
889
890long Interpret_4_0(char *forthString, CICell arg1, CICell arg2, CICell arg3,
891 CICell arg4)
892{
893 CIArgs ciArgs;
894 long ret;
895
896 ciArgs.service = "interpret";
897 ciArgs.nArgs = 5;
898 ciArgs.nReturns = 1;
899 ciArgs.args.interpret_4_0.forth = forthString;
900 ciArgs.args.interpret_4_0.arg1 = arg1;
901 ciArgs.args.interpret_4_0.arg2 = arg2;
902 ciArgs.args.interpret_4_0.arg3 = arg3;
903 ciArgs.args.interpret_4_0.arg4 = arg4;
904
905 ret = CallCI(&ciArgs);
906 if (ret != 0) return kCIError;
907 if (ciArgs.args.interpret_4_0.catchResult != 0) return kCICatch;
908
909 return kCINoError;
910}
911
912long Interpret_0_1(char *forthString, CICell *ret1)
913{
914 CIArgs ciArgs;
915 long ret;
916
917 ciArgs.service = "interpret";
918 ciArgs.nArgs = 1;
919 ciArgs.nReturns = 2;
920 ciArgs.args.interpret_0_1.forth = forthString;
921
922 ret = CallCI(&ciArgs);
923 if (ret != 0) return kCIError;
924 if (ciArgs.args.interpret_0_1.catchResult != 0) return kCICatch;
925
926 *ret1 = ciArgs.args.interpret_0_1.return1;
927
928 return kCINoError;
929}
930
931long Interpret_0_2(char *forthString, CICell *ret1, CICell *ret2)
932{
933 CIArgs ciArgs;
934 long ret;
935
936 ciArgs.service = "interpret";
937 ciArgs.nArgs = 1;
938 ciArgs.nReturns = 3;
939 ciArgs.args.interpret_0_2.forth = forthString;
940
941 ret = CallCI(&ciArgs);
942 if (ret != 0) return kCIError;
943 if (ciArgs.args.interpret_0_2.catchResult != 0) return kCICatch;
944
945 *ret1 = ciArgs.args.interpret_0_2.return1;
946 *ret2 = ciArgs.args.interpret_0_2.return2;
947
948 return kCINoError;
949}
950
951long Interpret_0_3(char *forthString, CICell *ret1, CICell *ret2, CICell *ret3)
952{
953 CIArgs ciArgs;
954 long ret;
955
956 ciArgs.service = "interpret";
957 ciArgs.nArgs = 1;
958 ciArgs.nReturns = 4;
959 ciArgs.args.interpret_0_3.forth = forthString;
960
961 ret = CallCI(&ciArgs);
962 if (ret != 0) return kCIError;
963 if (ciArgs.args.interpret_0_3.catchResult != 0) return kCICatch;
964
965 *ret1 = ciArgs.args.interpret_0_3.return1;
966 *ret2 = ciArgs.args.interpret_0_3.return2;
967 *ret3 = ciArgs.args.interpret_0_3.return3;
968
969 return kCINoError;
970}
971
972long Interpret_1_3(char *forthString, CICell arg1, CICell *ret1, CICell *ret2,
973 CICell *ret3)
974{
975 CIArgs ciArgs;
976 long ret;
977
978 ciArgs.service = "interpret";
979 ciArgs.nArgs = 2;
980 ciArgs.nReturns = 4;
981 ciArgs.args.interpret_1_3.forth = forthString;
982 ciArgs.args.interpret_1_3.arg1 = arg1;
983
984 ret = CallCI(&ciArgs);
985 if (ret != 0) return kCIError;
986 if (ciArgs.args.interpret_1_3.catchResult != 0) return kCICatch;
987
988 *ret1 = ciArgs.args.interpret_1_3.return1;
989 *ret2 = ciArgs.args.interpret_1_3.return2;
990 *ret3 = ciArgs.args.interpret_1_3.return3;
991
992 return kCINoError;
993}
994
995long Interpret_2_3(char *forthString, CICell arg1, CICell arg2, CICell *ret1,
996 CICell *ret2, CICell *ret3)
997{
998 CIArgs ciArgs;
999 long ret;
1000
1001 ciArgs.service = "interpret";
1002 ciArgs.nArgs = 3;
1003 ciArgs.nReturns = 4;
1004 ciArgs.args.interpret_2_3.forth = forthString;
1005 ciArgs.args.interpret_2_3.arg1 = arg1;
1006 ciArgs.args.interpret_2_3.arg2 = arg2;
1007
1008 ret = CallCI(&ciArgs);
1009 if (ret != 0) return kCIError;
1010 if (ciArgs.args.interpret_2_3.catchResult != 0) return kCICatch;
1011
1012 *ret1 = ciArgs.args.interpret_2_3.return1;
1013 *ret2 = ciArgs.args.interpret_2_3.return2;
1014 *ret3 = ciArgs.args.interpret_2_3.return3;
1015
1016 return kCINoError;
1017}
1018
1019long Interpret_2_4(char *forthString, CICell arg1, CICell arg2, CICell *ret1,
1020 CICell *ret2, CICell *ret3, CICell *ret4)
1021{
1022 CIArgs ciArgs;
1023 long ret;
1024
1025 ciArgs.service = "interpret";
1026 ciArgs.nArgs = 3;
1027 ciArgs.nReturns = 5;
1028 ciArgs.args.interpret_2_4.forth = forthString;
1029 ciArgs.args.interpret_2_4.arg1 = arg1;
1030 ciArgs.args.interpret_2_4.arg2 = arg2;
1031
1032 ret = CallCI(&ciArgs);
1033 if (ret != 0) return kCIError;
1034 if (ciArgs.args.interpret_2_4.catchResult != 0) return kCICatch;
1035
1036 *ret1 = ciArgs.args.interpret_2_4.return1;
1037 *ret2 = ciArgs.args.interpret_2_4.return2;
1038 *ret3 = ciArgs.args.interpret_2_4.return3;
1039 *ret4 = ciArgs.args.interpret_2_4.return4;
1040
1041 return kCINoError;
1042}
1043
1044long Interpret_2_0(char *forthString, CICell arg1, CICell arg2)
1045{
1046 CIArgs ciArgs;
1047 long ret;
1048
1049 ciArgs.service = "interpret";
1050 ciArgs.nArgs = 3;
1051 ciArgs.nReturns = 1;
1052 ciArgs.args.interpret_2_0.forth = forthString;
1053 ciArgs.args.interpret_2_0.arg1 = arg1;
1054 ciArgs.args.interpret_2_0.arg2 = arg2;
1055
1056 ret = CallCI(&ciArgs);
1057 if (ret != 0) return kCIError;
1058 if (ciArgs.args.interpret_2_0.catchResult != 0) return kCICatch;
1059
1060 return kCINoError;
1061}
1062
1063long Interpret_2_2(char *forthString, CICell arg1, CICell arg2, CICell *ret1,
1064 CICell *ret2)
1065{
1066 CIArgs ciArgs;
1067 long ret;
1068
1069 ciArgs.service = "interpret";
1070 ciArgs.nArgs = 3;
1071 ciArgs.nReturns = 3;
1072 ciArgs.args.interpret_2_2.forth = forthString;
1073 ciArgs.args.interpret_2_2.arg1 = arg1;
1074 ciArgs.args.interpret_2_2.arg2 = arg2;
1075
1076 ret = CallCI(&ciArgs);
1077 if (ret != 0) return kCIError;
1078 if (ciArgs.args.interpret_2_2.catchResult != 0) return kCICatch;
1079
1080 *ret1 = ciArgs.args.interpret_2_2.return1;
1081 *ret2 = ciArgs.args.interpret_2_2.return2;
1082
1083 return kCINoError;
1084}
1085
1086long Interpret_3_0(char *forthString, CICell arg1, CICell arg2, CICell arg3)
1087{
1088 CIArgs ciArgs;
1089 int ret;
1090
1091 ciArgs.service = "interpret";
1092 ciArgs.nArgs = 4;
1093 ciArgs.nReturns = 1;
1094 ciArgs.args.interpret_3_0.forth = forthString;
1095 ciArgs.args.interpret_3_0.arg1 = arg1;
1096 ciArgs.args.interpret_3_0.arg2 = arg2;
1097 ciArgs.args.interpret_3_0.arg3 = arg3;
1098
1099 ret = CallCI(&ciArgs);
1100 if (ret != 0) return kCIError;
1101 if (ciArgs.args.interpret_3_0.catchResult != 0) return kCICatch;
1102
1103 return kCINoError;
1104}