13 #define STARTUPMSG " +++ Interactive trace. \"Trace Off\" to end debug. ENTER to continue."
16 /* This picky compiler claims about unused formal parameters.
17 * This is correct but hides (for human eyes) other errors since they
18 * are many and we can't reduce them all.
19 * Error 4100 is "unused formal parameter".
21 # pragma warning(disable:4100)
24 static void message( char *msg
)
26 printf( " %s", msg
) ;
31 static void mycomplain( char *msg
)
33 fprintf( stderr
, "Complaint: %s\n", msg
) ;
36 static void iverify( char *msg
, int first
, int second
)
39 printf( "\nInt verify: %s: %d ^= %d\n", msg
, first
, second
) ;
42 static void sverify( char *msg
, PRXSTRING first
, char *second
)
47 printf( "\nSecond is null, first: %d<%s>\n", (int) first
->strlength
,
50 else if (strlen(second
) != first
->strlength
)
52 printf( "\nString length: %s: %d ^=%d\n", msg
,
53 (int) first
->strlength
, (int) strlen(second
)) ;
54 printf( " first=%4d<%s>\n", (int) first
->strlength
, first
->strptr
) ;
55 printf( " secnd=%4d<%s>\n", (int) strlen(second
), second
) ;
58 if (memcmp(second
, first
->strptr
, first
->strlength
))
59 printf( "\nString contents: %s: <%s> ^== <%s>\n", msg
,
60 first
->strptr
, second
) ;
66 LONG APIENTRY
instore_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
68 RXSIOSAY_PARM
*psiosay
;
69 iverify( "Exitfunction", ExNum
, RXSIO
) ;
70 iverify( "Subfunction", Subfun
, RXSIOSAY
) ;
71 psiosay
= (RXSIOSAY_PARM
*)PBlock
;
72 sverify( "Exit string", &(psiosay
->rxsio_string
), "foobar" ) ;
74 return RXEXIT_HANDLED
;
77 static void instore( void )
83 message( "instore" ) ;
85 RexxRegisterExitExe( "Foo", (PFN
)instore_exit
, NULL
) ;
87 Exits
[0].sysexit_name
= "Foo" ;
88 Exits
[0].sysexit_code
= RXSIO
;
89 Exits
[1].sysexit_code
= RXENDLST
;
91 Instore
[0].strptr
= "say 'foobar'" ;
92 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
93 Instore
[1].strptr
= NULL
;
94 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
97 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "", RXCOMMAND
,
100 Instore
[0].strptr
= NULL
;
101 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "", RXCOMMAND
,
102 Exits
, NULL
, NULL
) ;
104 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "", RXCOMMAND
,
105 Exits
, NULL
, NULL
) ;
107 RexxFreeMemory( Instore
[1].strptr
) ;
108 RexxDeregisterExit( "Foo", NULL
) ;
112 LONG APIENTRY
trace_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
114 RXSIOTRC_PARM
*psiotrc
;
115 iverify( "Exitfunction", ExNum
, RXSIO
) ;
116 if (Subfun
==RXSIOTRC
)
118 psiotrc
= (RXSIOTRC_PARM
*)PBlock
;
119 sverify( "Exit string", &(psiotrc
->rxsio_string
),
120 " 1 *-* trace off" ) ;
123 mycomplain( "Unexpected subfunction\n" ) ;
125 return RXEXIT_HANDLED
;
128 static void trace( void )
130 RXSTRING Instore
[2] ;
136 RexxRegisterExitExe( "Foo", (PFN
)trace_exit
, NULL
) ;
138 Exits
[0].sysexit_name
= "Foo" ;
139 Exits
[0].sysexit_code
= RXSIO
;
140 Exits
[1].sysexit_code
= RXENDLST
;
142 Instore
[0].strptr
= "trace all;trace off" ;
143 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
144 Instore
[1].strptr
= NULL
;
146 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
147 Exits
, NULL
, NULL
) ;
149 RexxDeregisterExit( "Foo", NULL
) ;
153 LONG APIENTRY
intertrc_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
156 static char *data
[] = {
158 " 2 *-* say 'hallo'",
170 RXSIOTRC_PARM
*psiotrc
;
171 RXSIOSAY_PARM
*psiosay
;
172 RXSIODTR_PARM
*psiodtr
;
174 iverify( "Exitfunction", ExNum
, RXSIO
) ;
184 iverify( "Subfunction", Subfun
, RXSIOTRC
) ;
185 psiotrc
= (RXSIOTRC_PARM
*)PBlock
;
186 sverify( "Trace output", &(psiotrc
->rxsio_string
),data
[cnt
]);
191 iverify( "Subfunction", Subfun
, RXSIOSAY
) ;
192 psiosay
= (RXSIOSAY_PARM
*)PBlock
;
193 sverify( "Say output", &(psiosay
->rxsio_string
), data
[cnt
]);
198 iverify( "Subfunction", Subfun
, RXSIODTR
) ;
199 psiodtr
= (RXSIODTR_PARM
*)PBlock
;
200 psiodtr
->rxsiodtr_retc
.strptr
= data
[cnt
] ;
201 psiodtr
->rxsiodtr_retc
.strlength
= strlen(data
[cnt
]) ;
205 fprintf( stderr
, "Out of order msg subfunc=%ld\n", Subfun
) ;
206 return RXEXIT_NOT_HANDLED
;
208 return RXEXIT_HANDLED
;
211 static void intertrc( void )
213 RXSTRING Instore
[2] ;
217 message( "intertrc" ) ;
219 RexxRegisterExitExe( "Foo", (PFN
)intertrc_exit
, NULL
) ;
221 Exits
[0].sysexit_name
= "Foo" ;
222 Exits
[0].sysexit_code
= RXSIO
;
223 Exits
[1].sysexit_code
= RXENDLST
;
225 Instore
[0].strptr
= "trace ?int\nsay 'hallo'; trace off" ;
226 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
227 Instore
[1].strptr
= NULL
;
229 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
230 Exits
, NULL
, NULL
) ;
232 RexxDeregisterExit( "Foo", NULL
) ;
239 LONG APIENTRY
pull_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
242 static char *data
[] = {
250 RXSIOSAY_PARM
*psiosay
;
251 RXSIOTRD_PARM
*psiotrd
;
253 iverify( "Exitfunction", ExNum
, RXSIO
) ;
259 iverify( "Subfunction", Subfun
, RXSIOSAY
) ;
260 psiosay
= (RXSIOSAY_PARM
*)PBlock
;
261 sverify( "Trace output", &(psiosay
->rxsio_string
),data
[cnt
]);
266 iverify( "Subfunction", Subfun
, RXSIOTRD
) ;
267 psiotrd
= (RXSIOTRD_PARM
*)PBlock
;
268 strcpy(psiotrd
->rxsiotrd_retc
.strptr
,data
[cnt
]) ;
269 psiotrd
->rxsiotrd_retc
.strlength
= strlen(data
[cnt
]) ;
273 fprintf( stderr
, "Out of order msg subfunc=%ld\n", Subfun
) ;
274 return RXEXIT_NOT_HANDLED
;
276 return RXEXIT_HANDLED
;
279 static void pull( void )
281 RXSTRING Instore
[2] ;
287 RexxRegisterExitExe( "Foo", (PFN
)pull_exit
, NULL
) ;
289 Exits
[0].sysexit_name
= "Foo" ;
290 Exits
[0].sysexit_code
= RXSIO
;
291 Exits
[1].sysexit_code
= RXENDLST
;
294 "pull bar;say bar;push 'foo';pull bar;say bar;parse pull bar;say bar" ;
295 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
296 Instore
[1].strptr
= NULL
;
298 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
299 Exits
, NULL
, NULL
) ;
301 RexxDeregisterExit( "Foo", NULL
) ;
305 LONG APIENTRY
env_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
308 static char data
[10];
309 RXENVGET_PARM
*penvget
;
310 RXENVSET_PARM
*penvset
;
312 iverify( "Exitfunction", ExNum
, RXENV
) ;
316 iverify( "Subfunction", Subfun
, RXENVGET
) ;
317 penvget
= (RXENVGET_PARM
*)PBlock
;
318 sverify( "Envget name", &(penvget
->rxenv_name
),"FRED");
319 strcpy(penvget
->rxenv_value
.strptr
,"initial") ;
320 penvget
->rxenv_value
.strlength
= strlen(data
) ;
324 iverify( "Subfunction", Subfun
, RXENVSET
) ;
325 penvset
= (RXENVSET_PARM
*)PBlock
;
326 sverify( "Envset name", &(penvset
->rxenv_name
),"FRED");
327 sverify( "Envset value", &(penvset
->rxenv_value
),"junk");
328 strcpy( data
, "mess" );
332 iverify( "Subfunction", Subfun
, RXENVGET
) ;
333 penvget
= (RXENVGET_PARM
*)PBlock
;
334 sverify( "Envget name", &(penvget
->rxenv_name
),"FRED");
335 strcpy(penvget
->rxenv_value
.strptr
,data
) ;
336 penvget
->rxenv_value
.strlength
= strlen(data
) ;
340 fprintf( stderr
, "Out of order msg subfunc=%ld\n", Subfun
) ;
341 return RXEXIT_NOT_HANDLED
;
343 return RXEXIT_HANDLED
;
346 static void env( void )
348 RXSTRING Instore
[2] ;
354 RexxRegisterExitExe( "Foo", (PFN
)env_exit
, NULL
) ;
356 Exits
[0].sysexit_name
= "Foo" ;
357 Exits
[0].sysexit_code
= RXENV
;
358 Exits
[1].sysexit_code
= RXENDLST
;
361 "call value 'FRED', 'junk', 'ENVIRONMENT'; if value('FRED',,'ENVIRONMENT') <> 'mess' then say 'setenv/getenv failed'" ;
362 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
363 Instore
[1].strptr
= NULL
;
365 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
366 Exits
, NULL
, NULL
) ;
368 RexxDeregisterExit( "Foo", NULL
) ;
374 LONG APIENTRY
query_init_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
382 data
.strptr
= result
;
383 rc
= RexxCreateQueue( result
, sizeof(result
), name
, &dup
) ;
384 iverify( "Query Init exit", rc
, RXQUEUE_OK
) ;
385 data
.strlength
= strlen(result
);
386 sverify( "Query Init exit", &data
, name
) ;
387 iverify( "Query Init dup", dup
, 0L ) ;
389 data
.strptr
= "line1";
390 data
.strlength
= strlen(data
.strptr
);
391 rc
= RexxAddQueue( name
, &data
, RXQUEUE_FIFO
) ;
392 iverify( "Query Init exit", rc
, RXQUEUE_OK
) ;
394 data
.strptr
= "line2";
395 data
.strlength
= strlen(data
.strptr
);
396 rc
= RexxAddQueue( name
, &data
, RXQUEUE_FIFO
) ;
397 iverify( "Query Init exit", rc
, RXQUEUE_OK
) ;
399 return RXEXIT_HANDLED
;
402 LONG APIENTRY
query_term_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
409 rc
= RexxQueryQueue( "FRED", &count
) ;
410 iverify( "Query Term exit", rc
, RXQUEUE_OK
) ;
411 iverify( "Query Term count", count
, 2L ) ;
413 rc
= RexxPullQueue( "FRED", &data
, ×tamp
, RXQUEUE_NOWAIT
);
414 iverify( "Query Term exit", rc
, RXQUEUE_OK
) ;
415 sverify( "Query Term data", &data
, "2line" ) ;
416 RexxFreeMemory( data
.strptr
) ;
418 rc
= RexxPullQueue( "FRED", &data
, ×tamp
, RXQUEUE_NOWAIT
);
419 iverify( "Query Term exit", rc
, RXQUEUE_OK
) ;
420 sverify( "Query Term data", &data
, "1line" ) ;
421 RexxFreeMemory( data
.strptr
) ;
423 rc
= RexxDeleteQueue( "FRED" );
424 iverify( "Query Init exit", rc
, RXQUEUE_OK
) ;
426 rc
= RexxDeleteQueue( "TEST1" );
427 iverify( "Query Init exit", rc
, RXQUEUE_OK
) ;
429 return RXEXIT_HANDLED
;
432 LONG APIENTRY
it_init_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
440 shv
.shvname
.strptr
= name
;
441 shv
.shvnamelen
= shv
.shvname
.strlength
= strlen(name
) ;
442 shv
.shvvalue
.strptr
= value
;
443 shv
.shvvaluelen
= shv
.shvvalue
.strlength
= strlen(value
) ;
444 shv
.shvcode
= RXSHV_SYSET
;
446 rc
= RexxVariablePool( &shv
) ;
447 iverify( "Init exit", rc
, RXSHV_NEWV
) ;
448 iverify( "Init exit", shv
.shvret
, RXSHV_NEWV
) ;
449 return RXEXIT_HANDLED
;
453 LONG APIENTRY
it_term_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
460 strcpy( value
, "" ) ;
463 shv
.shvname
.strptr
= name
;
464 shv
.shvnamelen
= shv
.shvname
.strlength
= strlen(name
) ;
465 shv
.shvvalue
.strptr
= value
;
466 shv
.shvvaluelen
= 64 ;
467 shv
.shvcode
= RXSHV_SYFET
;
469 rc
= RexxVariablePool( &shv
) ;
470 iverify( "Term exit", rc
, RXSHV_NEWV
) ;
471 iverify( "Term exit", shv
.shvret
, RXSHV_NEWV
) ;
472 sverify( "Term exit:", &(shv
.shvvalue
), "MYVAR" ) ;
476 shv
.shvname
.strptr
= name
;
477 shv
.shvnamelen
= shv
.shvname
.strlength
= strlen(name
) ;
479 /* The value is the same as above (value) and therefore valid */
481 shv
.shvvalue
.strptr
= value
;
482 shv
.shvvaluelen
= 64 ;
483 shv
.shvvalue
.strlength
= strlen(value
) ; /* not allowed! not 0-terminated */
485 shv
.shvcode
= RXSHV_SYFET
;
487 rc
= RexxVariablePool( &shv
) ;
488 iverify( "Term exit", rc
, RXSHV_OK
) ;
489 iverify( "Term exit", shv
.shvret
, RXSHV_OK
) ;
490 sverify( "Term exit:", &(shv
.shvvalue
), "baz" ) ;
492 return RXEXIT_HANDLED
;
496 LONG APIENTRY
it_say_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
502 RXSIOSAY_PARM
*psiosay
;
504 iverify( "Say exit", ExNum
, RXSIO
) ;
505 iverify( "Say exit", Subfun
, RXSIOSAY
) ;
506 psiosay
= (RXSIOSAY_PARM
*)PBlock
;
507 sverify( "Say exit", &(psiosay
->rxsio_string
), "foz" ) ;
511 shv
.shvname
.strptr
= name
;
512 shv
.shvnamelen
= shv
.shvname
.strlength
= strlen(name
) ;
513 shv
.shvvalue
.strptr
= value
;
514 shv
.shvvaluelen
= 64 ;
515 shv
.shvcode
= RXSHV_SYFET
;
517 rc
= RexxVariablePool( &shv
) ;
518 iverify( "Say exit", rc
, RXSHV_NEWV
) ;
519 iverify( "Say exit", shv
.shvret
, RXSHV_NEWV
) ;
520 sverify( "Say exit:", &(shv
.shvvalue
), "MYVAR.1" ) ;
522 return RXEXIT_HANDLED
;
525 static void init_term(void)
527 RXSTRING Instore
[2] ;
531 message( "init/term" ) ;
533 RexxRegisterExitExe( "init", (PFN
)it_init_exit
, NULL
) ;
534 RexxRegisterExitExe( "term", (PFN
)it_term_exit
, NULL
) ;
535 RexxRegisterExitExe( "say", (PFN
)it_say_exit
, NULL
) ;
537 Exits
[0].sysexit_name
= "init" ;
538 Exits
[0].sysexit_code
= RXINI
;
539 Exits
[1].sysexit_name
= "term" ;
540 Exits
[1].sysexit_code
= RXTER
;
541 Exits
[2].sysexit_name
= "say" ;
542 Exits
[2].sysexit_code
= RXSIO
;
543 Exits
[3].sysexit_code
= RXENDLST
;
546 "say foo\n\n\nbar='baz'\nexit" ;
547 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
548 Instore
[1].strptr
= NULL
;
550 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
551 Exits
, NULL
, NULL
) ;
553 RexxDeregisterExit( "init", NULL
) ;
554 RexxDeregisterExit( "term", NULL
) ;
555 RexxDeregisterExit( "say", NULL
) ;
560 LONG APIENTRY
vars_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
564 RXSIOSAY_PARM
*psiosay
;
566 iverify( "Say exit", ExNum
, RXSIO
) ;
567 iverify( "Say exit", Subfun
, RXSIOSAY
) ;
569 psiosay
= (RXSIOSAY_PARM
*)PBlock
;
570 sverify( "Say exit", &(psiosay
->rxsio_string
), "Hello" ) ;
572 shv
[0].shvnext
= &(shv
[1]) ;
573 shv
[0].shvname
.strptr
= "BAR" ;
574 shv
[0].shvname
.strlength
= strlen( shv
[0].shvname
.strptr
) ;
575 shv
[0].shvnamelen
= shv
[0].shvname
.strlength
;
576 shv
[0].shvvalue
.strptr
= "B-value-AR" ;
577 shv
[0].shvvalue
.strlength
= strlen( shv
[0].shvvalue
.strptr
) ;
578 shv
[0].shvvaluelen
= shv
[0].shvvalue
.strlength
;
579 shv
[0].shvcode
= RXSHV_SYSET
;
581 /* Try to get it with lower case letters */
582 shv
[1].shvnext
= &(shv
[2]) ;
583 shv
[1].shvname
.strptr
= "bar " ;
584 shv
[1].shvname
.strlength
= strlen( shv
[1].shvname
.strptr
) ;
585 shv
[1].shvnamelen
= shv
[1].shvname
.strlength
;
586 shv
[1].shvvalue
.strptr
= RexxAllocateMemory( 64 ) ;
587 shv
[1].shvvalue
.strlength
= 64 ;
588 shv
[1].shvvaluelen
= shv
[1].shvvalue
.strlength
;
589 shv
[1].shvcode
= RXSHV_SYFET
;
591 /* then we use capital letters */
592 shv
[2].shvnext
= &(shv
[3]) ;
593 shv
[2].shvname
.strptr
= "BAR" ;
594 shv
[2].shvname
.strlength
= strlen( shv
[2].shvname
.strptr
) ;
595 shv
[2].shvnamelen
= shv
[2].shvname
.strlength
;
596 shv
[2].shvvalue
.strptr
= RexxAllocateMemory( 64 ) ;
597 shv
[2].shvvalue
.strlength
= 64 ;
598 shv
[2].shvvaluelen
= shv
[2].shvvalue
.strlength
;
599 shv
[2].shvcode
= RXSHV_SYFET
;
601 /* Then we set it to something else */
602 shv
[3].shvnext
= &(shv
[4]) ;
603 shv
[3].shvname
.strptr
= "BAR" ;
604 shv
[3].shvname
.strlength
= strlen( shv
[3].shvname
.strptr
) ;
605 shv
[3].shvnamelen
= shv
[3].shvname
.strlength
;
606 shv
[3].shvvalue
.strptr
= "new value" ;
607 shv
[3].shvvalue
.strlength
= strlen( shv
[3].shvvalue
.strptr
) ;
608 shv
[3].shvvaluelen
= shv
[3].shvvalue
.strlength
;
609 shv
[3].shvcode
= RXSHV_SYSET
;
612 shv
[4].shvnext
= &(shv
[5]) ;
613 shv
[4].shvname
.strptr
= "BAR" ;
614 shv
[4].shvname
.strlength
= strlen( shv
[4].shvname
.strptr
) ;
615 shv
[4].shvnamelen
= shv
[4].shvname
.strlength
;
616 shv
[4].shvvalue
.strptr
= RexxAllocateMemory( 64 ) ;
617 shv
[4].shvvalue
.strlength
= 64 ;
618 shv
[4].shvvaluelen
= shv
[4].shvvalue
.strlength
;
619 shv
[4].shvcode
= RXSHV_SYFET
;
622 shv
[5].shvnext
= &(shv
[6]) ;
623 shv
[5].shvname
.strptr
= "BAR" ;
624 shv
[5].shvname
.strlength
= strlen( shv
[5].shvname
.strptr
) ;
625 shv
[5].shvnamelen
= shv
[5].shvname
.strlength
;
626 shv
[5].shvvalue
.strptr
= NULL
;
627 shv
[5].shvvalue
.strlength
= 0 ;
628 shv
[5].shvvaluelen
= shv
[5].shvvalue
.strlength
;
629 shv
[5].shvcode
= RXSHV_SYDRO
;
631 /* And then we try to get it again */
632 shv
[6].shvnext
= &(shv
[7]) ;
633 shv
[6].shvname
.strptr
= "BAR" ;
634 shv
[6].shvname
.strlength
= strlen( shv
[6].shvname
.strptr
) ;
635 shv
[6].shvnamelen
= shv
[6].shvname
.strlength
;
636 shv
[6].shvvalue
.strptr
= RexxAllocateMemory( 64 ) ;
637 shv
[6].shvvalue
.strlength
= 64 ;
638 shv
[6].shvvaluelen
= shv
[6].shvvalue
.strlength
;
639 shv
[6].shvcode
= RXSHV_SYFET
;
641 shv
[7].shvnext
= &(shv
[8]) ;
642 shv
[7].shvname
.strptr
= "FOO" ;
643 shv
[7].shvname
.strlength
= strlen( shv
[7].shvname
.strptr
) ;
644 shv
[7].shvnamelen
= shv
[7].shvname
.strlength
;
645 shv
[7].shvvalue
.strptr
= "OOPS" ;
646 shv
[7].shvvalue
.strlength
= strlen( shv
[7].shvvalue
.strptr
) ;
647 shv
[7].shvvaluelen
= shv
[7].shvvalue
.strlength
;
648 shv
[7].shvcode
= RXSHV_SYSET
;
650 shv
[8].shvnext
= &(shv
[9]) ;
651 shv
[8].shvname
.strptr
= "ABC.FOO" ;
652 shv
[8].shvname
.strlength
= strlen( shv
[8].shvname
.strptr
) ;
653 shv
[8].shvnamelen
= shv
[8].shvname
.strlength
;
654 shv
[8].shvvalue
.strptr
= "hello, there! ... this is a long string" ;
655 shv
[8].shvvalue
.strlength
= strlen( shv
[8].shvvalue
.strptr
) ;
656 shv
[8].shvvaluelen
= shv
[8].shvvalue
.strlength
;
657 shv
[8].shvcode
= RXSHV_SYSET
;
659 shv
[9].shvnext
= NULL
;
660 shv
[9].shvname
.strptr
= "ABC.OOPS" ;
661 shv
[9].shvname
.strlength
= strlen( shv
[9].shvname
.strptr
) ;
662 shv
[9].shvnamelen
= shv
[9].shvname
.strlength
;
663 shv
[9].shvvalue
.strptr
= RexxAllocateMemory(16) ;
664 shv
[9].shvvalue
.strlength
= 16 ;
665 shv
[9].shvvaluelen
= shv
[9].shvvalue
.strlength
;
666 shv
[9].shvcode
= RXSHV_SYFET
;
669 rc
= RexxVariablePool( shv
) ;
670 iverify( "Term exit", rc
, RXSHV_TRUNC
| RXSHV_BADN
| RXSHV_NEWV
) ;
672 iverify( "Term exit1 ", shv
[0].shvret
, RXSHV_NEWV
) ;
673 iverify( "Term exit2 ", shv
[1].shvret
, RXSHV_BADN
) ;
674 iverify( "Term exit3 ", shv
[2].shvret
, RXSHV_OK
) ;
675 iverify( "Term exit4 ", shv
[3].shvret
, RXSHV_OK
) ;
676 iverify( "Term exit5 ", shv
[4].shvret
, RXSHV_OK
) ;
677 iverify( "Term exit6 ", shv
[5].shvret
, RXSHV_OK
) ;
678 iverify( "Term exit7 ", shv
[6].shvret
, RXSHV_NEWV
) ;
679 iverify( "Term exit8 ", shv
[7].shvret
, RXSHV_NEWV
) ;
680 iverify( "Term exit9 ", shv
[8].shvret
, RXSHV_NEWV
) ;
681 iverify( "Term exit10", shv
[9].shvret
, RXSHV_TRUNC
) ;
684 sverify( "Term exit1 ", &(shv
[2].shvvalue
), "B-value-AR" ) ;
685 sverify( "Term exit2 ", &(shv
[4].shvvalue
), "new value" ) ;
686 sverify( "Term exit3 ", &(shv
[6].shvvalue
), "BAR" ) ;
687 sverify( "Term exit4 ", &(shv
[9].shvvalue
), "hello, there! .." ) ;
689 return RXEXIT_HANDLED
;
692 static void vars(void)
694 RXSTRING Instore
[2] ;
700 RexxRegisterExitExe( "hepp", (PFN
)vars_exit
, NULL
) ;
702 Exits
[0].sysexit_name
= "hepp" ;
703 Exits
[0].sysexit_code
= RXSIO
;
704 Exits
[1].sysexit_code
= RXENDLST
;
708 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
709 Instore
[1].strptr
= NULL
;
711 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
712 Exits
, NULL
, NULL
) ;
714 RexxDeregisterExit( "hepp", NULL
) ;
720 LONG APIENTRY
source_exit( LONG code
, LONG subcode
, PEXIT ptr
)
724 Req
[0].shvnext
= &(Req
[1]) ;
725 Req
[0].shvcode
= RXSHV_PRIV
;
726 Req
[0].shvname
.strptr
= "SOURCE" ;
727 Req
[0].shvname
.strlength
= strlen( Req
[0].shvname
.strptr
) ;
728 Req
[0].shvnamelen
= Req
[0].shvname
.strlength
;
729 Req
[0].shvvalue
.strptr
= NULL
;
731 Req
[1].shvnext
= &(Req
[2]) ;
732 Req
[1].shvcode
= RXSHV_PRIV
;
733 Req
[1].shvname
.strptr
= "VERSION" ;
734 Req
[1].shvname
.strlength
= strlen( Req
[1].shvname
.strptr
) ;
735 Req
[1].shvnamelen
= Req
[1].shvname
.strlength
;
736 Req
[1].shvvalue
.strptr
= NULL
;
738 Req
[2].shvnext
= &(Req
[3]) ;
739 Req
[2].shvcode
= RXSHV_PRIV
;
740 Req
[2].shvname
.strptr
= "PARM" ;
741 Req
[2].shvname
.strlength
= strlen( Req
[2].shvname
.strptr
) ;
742 Req
[2].shvnamelen
= Req
[2].shvname
.strlength
;
743 Req
[2].shvvalue
.strptr
= NULL
;
745 Req
[3].shvnext
= &(Req
[4]) ;
746 Req
[3].shvcode
= RXSHV_PRIV
;
747 Req
[3].shvname
.strptr
= "PARM.1" ;
748 Req
[3].shvname
.strlength
= strlen( Req
[3].shvname
.strptr
) ;
749 Req
[3].shvnamelen
= Req
[3].shvname
.strlength
;
750 Req
[3].shvvalue
.strptr
= NULL
;
752 Req
[4].shvnext
= &(Req
[5]) ;
753 Req
[4].shvcode
= RXSHV_PRIV
;
754 Req
[4].shvname
.strptr
= "PARM.2" ;
755 Req
[4].shvname
.strlength
= strlen( Req
[4].shvname
.strptr
) ;
756 Req
[4].shvnamelen
= Req
[4].shvname
.strlength
;
757 Req
[4].shvvalue
.strptr
= NULL
;
759 Req
[5].shvnext
= NULL
;
760 Req
[5].shvcode
= RXSHV_PRIV
;
761 Req
[5].shvname
.strptr
= "QUENAME" ;
762 Req
[5].shvname
.strlength
= strlen( Req
[5].shvname
.strptr
) ;
763 Req
[5].shvnamelen
= Req
[5].shvname
.strlength
;
764 Req
[5].shvvalue
.strptr
= NULL
;
766 iverify( "Termin exit", code
, RXTER
) ;
767 iverify( "Termin exit", subcode
, RXTEREXT
) ;
769 RexxVariablePool( Req
) ;
771 iverify( "Source", Req
[0].shvret
, RXSHV_OK
) ;
772 iverify( "Version", Req
[1].shvret
, RXSHV_OK
) ;
773 if (memcmp(Req
[1].shvvalue
.strptr
, "REXX", 4 ))
774 mycomplain( "Invalid Rexx source string\n" ) ;
776 iverify( "Parms", Req
[2].shvret
, RXSHV_OK
) ;
777 sverify( "Parms", &(Req
[2].shvvalue
), "1" ) ;
779 iverify( "Parm1a", Req
[3].shvret
, RXSHV_OK
) ;
780 sverify( "Parm1b", &(Req
[3].shvvalue
), "one two three" ) ;
782 iverify( "Parm2a", Req
[4].shvret
, RXSHV_OK
) ;
783 sverify( "Parm2b", &(Req
[4].shvvalue
), NULL
) ;
785 iverify( "QueName", Req
[5].shvret
, RXSHV_OK
) ;
786 sverify( "QueName", &(Req
[5].shvvalue
), "default" ) ;
788 return RXEXIT_HANDLED
;
793 static void source( void )
796 RXSTRING Instore
[2] ;
802 RexxRegisterExitExe("hei", (PFN
)source_exit
, NULL
) ;
804 Exits
[0].sysexit_name
= "hei" ;
805 Exits
[0].sysexit_code
= RXTER
;
806 Exits
[1].sysexit_code
= RXENDLST
;
808 Params
[0].strptr
= "one two three" ;
809 Params
[0].strlength
= strlen( Params
[0].strptr
) ;
811 Instore
[0].strptr
= "nop" ;
812 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
813 Instore
[1].strptr
= NULL
;
815 rc
= RexxStart( 1, Params
, "Testing", Instore
, "Foo", RXCOMMAND
,
816 Exits
, NULL
, NULL
) ;
818 RexxDeregisterExit( "hei", NULL
) ;
824 LONG APIENTRY
parms( LONG code
, LONG subcode
, PEXIT ptr
)
827 RXSTRING Instore
[2] ;
830 static int done
= 0 ;
836 RexxRegisterExitExe("hei", (PFN
)parms
, NULL
) ;
838 Exits
[0].sysexit_name
= "hei" ;
839 Exits
[0].sysexit_code
= RXTER
;
840 Exits
[1].sysexit_code
= RXENDLST
;
842 Params
[0].strptr
= "one two three" ;
843 Params
[0].strlength
= strlen( Params
[0].strptr
) ;
844 Params
[1].strptr
= NULL
;
845 Params
[1].strlength
= 5 ;
846 Params
[2].strptr
= "" ;
847 Params
[2].strlength
= strlen( Params
[2].strptr
) ;
848 Params
[3].strptr
= "four five" ;
849 Params
[3].strlength
= strlen( Params
[3].strptr
) ;
850 Params
[4].strptr
= NULL
;
851 Params
[4].strlength
= 10 ;
853 Instore
[0].strptr
= "nop" ;
854 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
855 Instore
[1].strptr
= NULL
;
857 rc
= RexxStart( 5, Params
, "Testing", Instore
, "Foo", RXFUNCTION
,
858 Exits
, NULL
, NULL
) ;
861 printf("not done\n") ;
863 RexxDeregisterExit( "hei", NULL
) ;
871 Req
[0].shvnext
= &(Req
[1]) ;
872 Req
[0].shvcode
= RXSHV_PRIV
;
873 Req
[0].shvname
.strptr
= "PARM" ;
874 Req
[0].shvname
.strlength
= strlen( Req
[0].shvname
.strptr
) ;
875 Req
[0].shvnamelen
= Req
[0].shvname
.strlength
;
876 Req
[0].shvvalue
.strptr
= NULL
;
878 Req
[1].shvnext
= &(Req
[2]) ;
879 Req
[1].shvcode
= RXSHV_PRIV
;
880 Req
[1].shvname
.strptr
= "PARM.1" ;
881 Req
[1].shvname
.strlength
= strlen( Req
[1].shvname
.strptr
) ;
882 Req
[1].shvnamelen
= Req
[1].shvname
.strlength
;
883 Req
[1].shvvalue
.strptr
= NULL
;
885 Req
[2].shvnext
= &(Req
[3]) ;
886 Req
[2].shvcode
= RXSHV_PRIV
;
887 Req
[2].shvname
.strptr
= "PARM.2" ;
888 Req
[2].shvname
.strlength
= strlen( Req
[2].shvname
.strptr
) ;
889 Req
[2].shvnamelen
= Req
[2].shvname
.strlength
;
890 Req
[2].shvvalue
.strptr
= NULL
;
892 Req
[3].shvnext
= &(Req
[4]) ;
893 Req
[3].shvcode
= RXSHV_PRIV
;
894 Req
[3].shvname
.strptr
= "PARM.3" ;
895 Req
[3].shvname
.strlength
= strlen( Req
[3].shvname
.strptr
) ;
896 Req
[3].shvnamelen
= Req
[3].shvname
.strlength
;
897 Req
[3].shvvalue
.strptr
= NULL
;
899 Req
[4].shvnext
= &(Req
[5]) ;
900 Req
[4].shvcode
= RXSHV_PRIV
;
901 Req
[4].shvname
.strptr
= "PARM.4" ;
902 Req
[4].shvname
.strlength
= strlen( Req
[4].shvname
.strptr
) ;
903 Req
[4].shvnamelen
= Req
[4].shvname
.strlength
;
904 Req
[4].shvvalue
.strptr
= NULL
;
906 Req
[5].shvnext
= &(Req
[6]) ;
907 Req
[5].shvcode
= RXSHV_PRIV
;
908 Req
[5].shvname
.strptr
= "PARM.5" ;
909 Req
[5].shvname
.strlength
= strlen( Req
[5].shvname
.strptr
) ;
910 Req
[5].shvnamelen
= Req
[5].shvname
.strlength
;
911 Req
[5].shvvalue
.strptr
= NULL
;
913 Req
[6].shvnext
= NULL
;
914 Req
[6].shvcode
= RXSHV_PRIV
;
915 Req
[6].shvname
.strptr
= "PARM.6" ;
916 Req
[6].shvname
.strlength
= strlen( Req
[6].shvname
.strptr
) ;
917 Req
[6].shvnamelen
= Req
[6].shvname
.strlength
;
918 Req
[6].shvvalue
.strptr
= NULL
;
920 iverify( "Termin exit", code
, RXTER
) ;
921 iverify( "Termin exit", subcode
, RXTEREXT
) ;
923 RexxVariablePool( Req
) ;
925 iverify( "Parm", Req
[0].shvret
, RXSHV_OK
) ;
926 sverify( "Parm", &(Req
[0].shvvalue
), "5" ) ;
928 iverify( "Parm1", Req
[1].shvret
, RXSHV_OK
) ;
929 sverify( "Parm1", &(Req
[1].shvvalue
), "one two three" ) ;
931 iverify( "Parm2", Req
[2].shvret
, RXSHV_OK
) ;
932 sverify( "Parm2", &(Req
[2].shvvalue
), NULL
) ;
934 iverify( "Parm3", Req
[3].shvret
, RXSHV_OK
) ;
935 sverify( "Parm3", &(Req
[3].shvvalue
), "" ) ;
937 iverify( "Parm4", Req
[4].shvret
, RXSHV_OK
) ;
938 sverify( "Parm4", &(Req
[4].shvvalue
), "four five" ) ;
940 iverify( "Parm5", Req
[5].shvret
, RXSHV_OK
) ;
941 sverify( "Parm5", &(Req
[5].shvvalue
), NULL
) ;
943 iverify( "Parm6", Req
[6].shvret
, RXSHV_OK
) ;
944 sverify( "Parm6", &(Req
[6].shvvalue
), NULL
) ;
946 return RXEXIT_HANDLED
;
954 LONG APIENTRY
allvars( LONG code
, LONG subcode
, PEXIT ptr
)
957 RXSTRING Instore
[2] ;
960 static int done
= 0 ;
966 RexxRegisterExitExe("hei", (PFN
)allvars
, NULL
) ;
968 Exits
[0].sysexit_name
= "hei" ;
969 Exits
[0].sysexit_code
= RXTER
;
970 Exits
[1].sysexit_code
= RXENDLST
;
972 Params
[0].strptr
= "one two three" ;
973 Params
[0].strlength
= strlen( Params
[0].strptr
) ;
974 Params
[1].strptr
= NULL
;
975 Params
[1].strlength
= 5 ;
976 Params
[2].strptr
= "" ;
977 Params
[2].strlength
= strlen( Params
[2].strptr
) ;
978 Params
[3].strptr
= "four five" ;
979 Params
[3].strlength
= strlen( Params
[3].strptr
) ;
980 Params
[4].strptr
= NULL
;
981 Params
[4].strlength
= 10 ;
983 Instore
[0].strptr
= "foo='one';bar='';foo.='two';foo.bar='three';"
984 "foo.4='four';foo.5='five';drop foo.5 foo.6" ;
986 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
987 Instore
[1].strptr
= NULL
;
989 rc
= RexxStart( 5, Params
, "Testing", Instore
, "Foo", RXFUNCTION
,
990 Exits
, NULL
, NULL
) ;
993 printf("not done\n") ;
995 RexxDeregisterExit( "hei", NULL
) ;
1004 for (i
=0; i
<10; i
++)
1006 Req
[i
].shvnext
= (i
<10-1) ? (&(Req
[i
+1])) : NULL
;
1007 Req
[i
].shvcode
= RXSHV_NEXTV
;
1008 Req
[i
].shvname
.strptr
= Req
[i
].shvvalue
.strptr
= NULL
;
1011 iverify( "Termin exit", code
, RXTER
) ;
1012 iverify( "Termin exit", subcode
, RXTEREXT
) ;
1014 RexxVariablePool( Req
) ;
1016 iverify( "Parm0", Req
[0].shvret
, RXSHV_OK
) ;
1017 sverify( "Parm0a", &(Req
[0].shvname
), "BAR" ) ;
1018 sverify( "Parm0b", &(Req
[0].shvvalue
), "" ) ;
1020 iverify( "Parm1", Req
[1].shvret
, RXSHV_OK
) ;
1021 sverify( "Parm1a", &(Req
[1].shvname
), "FOO." ) ;
1022 sverify( "Parm1b", &(Req
[1].shvvalue
), "three" ) ;
1024 iverify( "Parm2", Req
[2].shvret
, RXSHV_OK
) ;
1025 sverify( "Parm2a", &(Req
[2].shvname
), "FOO.4" ) ;
1026 sverify( "Parm2b", &(Req
[2].shvvalue
), "four" ) ;
1028 iverify( "Parm3", Req
[3].shvret
, RXSHV_OK
) ;
1029 sverify( "Parm3a", &(Req
[3].shvname
), "FOO.5" ) ;
1030 sverify( "Parm3b", &(Req
[3].shvvalue
), "FOO.5" ) ;
1032 iverify( "Parm4", Req
[4].shvret
, RXSHV_OK
) ;
1033 sverify( "Parm4a", &(Req
[4].shvname
), "FOO.6" ) ;
1034 sverify( "Parm4b", &(Req
[4].shvvalue
), "FOO.6" ) ;
1036 iverify( "Parm5", Req
[5].shvret
, RXSHV_OK
) ;
1037 sverify( "Parm5a", &(Req
[5].shvname
), "FOO." ) ;
1038 sverify( "Parm5b", &(Req
[5].shvvalue
), "two" ) ;
1040 iverify( "Parm6", Req
[6].shvret
, RXSHV_OK
) ;
1041 sverify( "Parm6a", &(Req
[6].shvname
), "FOO" ) ;
1042 sverify( "Parm6b", &(Req
[6].shvvalue
), "one" ) ;
1044 iverify( "Parm", Req
[7].shvret
, RXSHV_LVAR
) ;
1045 iverify( "Parm", Req
[8].shvret
, RXSHV_OK
) ;
1046 iverify( "Parm", Req
[9].shvret
, RXSHV_OK
) ;
1048 return RXEXIT_HANDLED
;
1057 ULONG APIENTRY
extfunc( PCSZ name
, ULONG params
, RXSTRING
*parm
, PCSZ stck
, RXSTRING
*ptr
)
1059 RXSTRING Instore
[2] ;
1063 static int done
= 0 ;
1067 message("extfunc") ;
1069 RexxRegisterFunctionExe("EXTFUNC", (PFN
)extfunc
) ;
1071 Instore
[0].strptr
= "return extfunc('asdf','qwer',,'zxcv') + 'EXTFUNC'('asdf',,'wer','werrew')" ;
1072 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
1073 Instore
[1].strptr
= NULL
;
1075 Result
.strlength
= 10 ;
1076 Result
.strptr
= RexxAllocateMemory( 10 ) ;
1078 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXFUNCTION
,
1079 NULL
, &nret
, &Result
) ;
1081 sverify( "extfunc", &Result
, "7" ) ;
1082 iverify( "extfunc", nret
, 7 ) ;
1085 printf("not done\n") ;
1087 RexxDeregisterFunction( "EXTFUNC" ) ;
1097 ptr
->strptr
[0] = '3' ;
1098 ptr
->strlength
= 1 ;
1103 ptr
->strptr
[0] = '4' ;
1104 ptr
->strlength
= 1 ;
1110 LONG APIENTRY
subcom_exit( LONG ExNum
, LONG Subfun
, PEXIT PBlock
)
1112 RXCMDHST_PARM
*pcmdhst
;
1114 iverify( "Subcom Funcion", ExNum
, RXCMD
) ;
1115 iverify( "Subcom Subfunc", Subfun
, RXCMDHST
) ;
1116 pcmdhst
= (RXCMDHST_PARM
*)PBlock
;
1117 pcmdhst
->rxcmd_retc
.strlength
= 2;
1118 strcpy(pcmdhst
->rxcmd_retc
.strptr
,"16");
1120 return RXEXIT_HANDLED
;
1123 ULONG APIENTRY
run_subcom(PRXSTRING Command
, PUSHORT Flags
, PRXSTRING Retstr
)
1125 RXSYSEXIT Exits
[4] ;
1126 RXSTRING Instore
[2] ;
1131 if (Command
== NULL
)
1135 RexxRegisterExitExe( "slhepp", (PFN
)subcom_exit
, NULL
) ;
1137 Exits
[0].sysexit_name
= "slhepp" ;
1138 Exits
[0].sysexit_code
= RXCMD
;
1139 Exits
[1].sysexit_code
= RXENDLST
;
1141 RexxRegisterSubcomExe("SUBCOM", (PFN
)run_subcom
, NULL
) ;
1143 Instore
[0].strptr
= "'foobar asdf qwer'" ;
1144 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
1145 Instore
[1].strptr
= NULL
;
1147 Result
.strlength
= 20 ;
1148 Result
.strptr
= RexxAllocateMemory( 20 ) ;
1150 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "SUBCOM", RXCOMMAND
,
1151 Exits
, &nret
, &Result
) ;
1153 /* sverify( "subcom result", &Result, "16" ) ; */
1154 /* iverify( "subcom retc", nret, 16 ) ; */
1156 RexxDeregisterSubcom( "SUBCOM" , NULL
) ;
1157 RexxDeregisterExit( "slhepp", NULL
) ;
1163 sprintf(Retstr
->strptr
,"%ld",Command
->strlength
) ;
1164 Retstr
->strlength
= strlen(Retstr
->strptr
);
1165 *Flags
= RXSUBCOM_OK
;
1171 static void qtest( void )
1173 RXSTRING Instore
[2] ;
1174 RXSYSEXIT Exits
[3] ;
1179 message( "queue" ) ;
1181 rc
= RexxCreateQueue( result
, sizeof(result
), NULL
, &dup
) ;
1182 iverify( "qtest-before", rc
, RXQUEUE_OK
) ;
1183 iverify( "qtest-before", dup
, 0L ) ;
1185 Exits
[0].sysexit_name
= "query_init" ;
1186 Exits
[0].sysexit_code
= RXINI
;
1187 Exits
[1].sysexit_name
= "query_term" ;
1188 Exits
[1].sysexit_code
= RXTER
;
1189 Exits
[2].sysexit_code
= RXENDLST
;
1190 RexxRegisterExitExe( "query_init", (PFN
)query_init_exit
, NULL
) ;
1191 RexxRegisterExitExe( "query_term", (PFN
)query_init_exit
, NULL
) ;
1193 Instore
[0].strptr
= "call rxqueue 'Set', 'test1';"
1194 "if queued() \\= 2 then say 'error:line 2';"
1196 "if line \\= 'line1' then say 'error:line 4';"
1198 "if line \\= 'line2' then say 'error:line 5';"
1199 "if rxqueue('Create','FRED') \\= 'FRED' then say 'error:line 6';"
1200 "push '1line';push '2line';" ;
1201 Instore
[0].strlength
= strlen( Instore
[0].strptr
) ;
1202 Instore
[1].strptr
= NULL
;
1203 rc
= RexxStart( 0, NULL
, "Testing", Instore
, "Foo", RXCOMMAND
,
1204 Exits
, NULL
, NULL
) ;
1206 RexxFreeMemory( Instore
[1].strptr
) ;
1207 RexxDeregisterExit( "query_init", NULL
) ;
1208 RexxDeregisterExit( "query_term", NULL
) ;
1210 rc
= RexxDeleteQueue( result
);
1211 iverify( "qtest-after", rc
, RXQUEUE_OK
) ;
1214 static void (*(routines
[]))(void) = {
1227 static RexxExitHandler
*(exits
[]) = {
1234 static RexxFunctionHandler
*(efuncs
[]) = {
1239 static RexxSubcomHandler
*(scfuncs
[]) = {
1245 int main( int argc
, char *argv
[] )
1247 void (**fptr
)( void ) ;
1248 RexxExitHandler
**eptr
;
1249 RexxFunctionHandler
**gptr
;
1250 RexxSubcomHandler
**sptr
;
1254 /* We want to see surprisings at once: */
1255 setvbuf(stdout
,NULL
,_IONBF
,0);
1256 setvbuf(stderr
,NULL
,_IONBF
,0);
1257 printf( "Regina Rexx API Tester\n" );
1258 printf( "----------------------\n" );
1260 version
.strlength
= 0;
1261 version
.strptr
= NULL
;
1262 /* This might not work if we check another Rexx: */
1263 versioncode
= ReginaVersion(&version
);
1264 printf("Regina's version is %lu.%02lu",
1266 versioncode
& 0xFF);
1269 printf(" (in complete \"%s\")",version
.strptr
);
1270 RexxFreeMemory(version
.strptr
);
1274 for( fptr
=routines
; *fptr
; fptr
++ )
1277 for( eptr
=exits
; *eptr
; eptr
++ )
1278 (*eptr
)( -1, -1, NULL
) ;
1280 for( gptr
=efuncs
; *gptr
; gptr
++ )
1281 (*gptr
)( NULL
, 0, NULL
, NULL
, NULL
) ;
1283 for( sptr
=scfuncs
; *sptr
; sptr
++ )
1284 (*sptr
)( NULL
, 0, NULL
) ;
1285 #if !defined(NO_EXTERNAL_QUEUES)