2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: docall.c /main/7 1998/04/17 11:22:59 mgreess $ */
24 /* Copyright (c) 1991, 1992 UNIX System Laboratories, Inc. */
25 /* All Rights Reserved */
27 /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
28 /* UNIX System Laboratories, Inc. */
29 /* The copyright notice above does not evidence any */
30 /* actual or intended publication of such source code. */
33 #include "exksh.h" /* which includes sys/types.h */
35 #include <sys/param.h>
41 #include "exksh_tbls.h"
45 #include <X11/Xosdefs.h>
54 static pp_usage( void ) ;
55 static int call_postprompt(
60 static long get_prdebug( void ) ;
61 static long set_prdebug(
68 struct memtbl Null_tbl = { NULL };
70 static char use[] = "0x%x";
71 static char use2[] = "%s=0x%x";
77 char xk_ret_buffer[100];
78 char *xk_ret_buf = xk_ret_buffer;
79 struct Bfunction xk_prdebug = { get_prdebug, set_prdebug };
86 char buf[BIGBUFSIZ], *p, *bufstart;
87 char *fld, *type, *ptr, *ptr2, **pptr2;
88 memtbl_t tbl[2], *tbl2;
91 char fail = 0, always_ptr;
95 for (i = 1; (i < argc) && argv[i] != NULL && argv[i][0] == '-'; i++) {
112 if (!isdigit(argv[i][0]))
114 ptr = (char *) getaddr(argv[i++]);
116 if (!type || !ptr || (parse_decl(argv[0], tbl, type, 1) == FAIL)) {
123 errmsg = strdup(GETMESSAGE(4,1,
124 "Cannot parse the structure named '%s'; it may not have been defined"));
125 printerrf(argv[0], errmsg, type, NULL, NULL,
126 NULL, NULL, NULL, NULL, NULL);
131 if ((always_ptr || !IS_SIMPLE(tbl)) && !tbl->ptr && !(tbl->flags & F_TYPE_IS_PTR))
133 else while (tbl->ptr > 1) {
134 ptr = *((void **) ptr);
147 while ((i < argc) && (fld = argv[i++])) {
149 *p++ = targvar ? ' ' : '\n';
153 if (!C_PAIR(fld, '.', '\0'))
154 tbl2 = ffind(tbl, fld, (char **)&pptr2);
156 errmsg = strdup(GetSharedMsg(DT_BAD_FIELD_NAME));
157 printerrf(argv[0], errmsg, fld, type,
158 NULL, NULL, NULL, NULL, NULL, NULL);
163 if (XK_PRINT(tbl2, &p, (char *)pptr2, 0, 0, NULL,
164 all_tbl_find) == FAIL)
166 errmsg=strdup(GETMESSAGE(4,2,
167 "Cannot print the field '%s' in structure '%s'"));
168 printerrf(argv[0], errmsg, fld, type,
169 NULL, NULL, NULL, NULL, NULL, NULL);
183 return(fail ? SH_FAIL : SH_SUCC);
188 unsigned long *pargs,
191 char buf[BIGBUFSIZ], *p;
195 for (i = 0; tbls[i].name; i++) {
196 errmsg = strdup(GETMESSAGE(4,3, "Argument %d (type %s):\n\t"));
197 printf(errmsg, i + 1, tbls[i].name);
200 XK_PRINT(tbls + i, &p, (char *)(pargs + i), 0, 0, NULL,
211 errmsg = strdup(GETMESSAGE(4,4,
212 "Please enter p(rint), s(end), q(uit) or field=value\n"));
220 unsigned long *pargs,
226 char * quitStr, *printStr, *sendStr, *promptStr;
229 quitStr = strdup(GETMESSAGE(4,5, "q"));
230 printStr = strdup(GETMESSAGE(4,6, "p"));
231 sendStr = strdup(GETMESSAGE(4,7, "s"));
232 promptStr = strdup(GETMESSAGE(4,8, "Postprompt: "));
236 strcpy(buf, quitStr);
239 fgets(buf, sizeof(buf), stdin);
240 if (strlen(buf) && buf[strlen(buf)-1] == '\n')
241 buf[strlen(buf)-1] = '\0';
243 if (xk_Strncmp(buf, quitStr, 2) == 0)
245 errmsg=strdup(GETMESSAGE(4,9,
246 "Warning: command was not executed\n"));
252 else if (xk_Strncmp(buf, printStr, 2) == 0)
253 allprint(pargs, tbls);
254 else if (xk_Strncmp(buf, sendStr, 2) == 0)
259 else if (!strchr(buf, '=') ||
260 (asl_set(argv0,tbls, buf, (unsigned char **)pargs) == SH_FAIL))
275 #define NONNEGATIVE 2
277 /* In shell, 0 is success so, ZERORET means direct return, NONZERO means
278 ** return the opposite of its truth value and NONNEGATIVE means return
279 ** true if the value IS negative (since FALSE is success)
281 #define CALL_RETURN(RET) return(SET_RET(RET), ((ret_type == ZERORET) ? (RET) : ((ret_type == NONZERO) ? !(RET) : ((RET) < 0))))
282 #define EARLY_RETURN(RET) return(SET_RET(RET))
283 #define SET_RET(RET) (((int) sprintf(xk_ret_buffer, use, (RET))), (int) (xk_ret_buf = xk_ret_buffer), RET)
290 void *pargs[MAX_CALL_ARGS];
291 memtbl_t tblarray[MAX_CALL_ARGS];
292 char freeit[MAX_CALL_ARGS];
293 unsigned long (*func)();
295 char dorun, promptflag;
296 unsigned char freeval, ret_type;
297 register int i, j, ret;
307 errmsg = strdup(GetSharedMsg(DT_NO_FUNC_NAME));
308 printerr(argv[0], errmsg, NULL);
314 for (j = 1; (j < argc) && argv[j][0] == '-'; j++) {
315 for (i = 1; argv[j][i]; i++) {
322 /* reverse sense of return value */
326 /* Non-negative return value is okay */
327 ret_type = NONNEGATIVE;
330 errmsg =strdup(GetSharedMsg(DT_UNKNOWN_OPTION));
331 printerrf(argv[0], errmsg,
332 argv[j], NULL, NULL, NULL,
333 NULL, NULL, NULL, NULL);
341 errmsg = strdup(GetSharedMsg(DT_NO_FUNC_NAME));
342 printerr(argv[0], errmsg, NULL);
347 memset(tblarray, '\0', MAX_CALL_ARGS * sizeof(memtbl_t));
348 memset(pargs, '\0', MAX_CALL_ARGS * sizeof(void *));
349 memset(freeit, '\0', MAX_CALL_ARGS * sizeof(char));
350 func = (unsigned long (*)()) fsym(argv[j], -1);
351 if (!func && ((argv[j][0] != '0') || (UPP(argv[j][1]) != 'X') || !(func = (unsigned long (*)()) strtoul(argv[j], &p, 16)) || *p)) {
352 errmsg = strdup(GETMESSAGE(4,10,
353 "Unable to locate the function '%s'"));
354 printerrf(argv[0], errmsg,
355 argv[j], NULL, NULL, NULL, NULL, NULL, NULL, NULL);
360 for (i = 0; (i < MAX_CALL_ARGS) && (j < argc) && argv[j]; j++, i++) {
364 if (C_PAIR(argv[j], '+', '?')) {
368 else if (C_PAIR(argv[j], '+', '+')) {
372 if (argv[j][0] == '@') {
373 if (!(val = strchr(argv[j] + 1, ':'))) {
378 strncpy(type, argv[j] + 1, val - argv[j] - 1);
379 type[val - argv[j] - 1] = '\0';
381 if (parse_decl(argv[0], tblarray + i, type, 1) == FAIL)
388 if (!strparse(tblarray + i,
389 (char **)(pargs + i), val))
391 errmsg=strdup(GETMESSAGE(4,11,
392 "The value descriptor '%s' does not match the definition for structure '%s'"));
393 printerrf(argv[0], errmsg,
394 val, type, NULL, NULL, NULL,
405 else if (isdigit(argv[j][0])) {
409 tblarray[i] = T_unsigned_long[0];
410 xk_par_int(&p, pargs + i, NULL);
412 else if (strcmp(argv[j], (char *) "NULL") == 0) {
413 tblarray[i] = T_unsigned_long[0];
417 pargs[i] = (void *) argv[j];
418 tblarray[i] = T_string_t[0];
421 /* Process special arguments */
423 asl_set(argv[0], tblarray, argv[j], (unsigned char **)pargs);
428 call_postprompt(argv[0], (unsigned long *)pargs, tblarray,
431 ret = (*func)(pargs[0], pargs[1], pargs[2], pargs[3],
432 pargs[4], pargs[5], pargs[6], pargs[7],
433 pargs[8], pargs[9], pargs[10], pargs[11],
434 pargs[12], pargs[13], pargs[14]);
440 for (i = 0; i < MAX_CALL_ARGS; i++) {
441 if (pargs[i] && freeit[i])
443 /* There is no recourse for failure */
444 XK_FREE(tblarray + i, (char *)(pargs + i), 0, 0,
472 unsigned char **pargs )
479 char field[80], *fldp = field;
480 unsigned long intval, i, newval;
481 unsigned long top, bottom;
484 if ((val = strchr(desc, '=')) == NULL)
486 if (ispunct(val[-1]) && (val[-1] != ']')) {
488 strncpy(field, desc, val - desc - 1);
489 field[val - desc - 1] = '\0';
494 strncpy(field, desc, val - desc);
495 field[val - desc] = '\0';
498 if (isdigit(fldp[0])) {
499 top = bottom = strtoul(fldp, &fldp, 0) - 1;
507 usetbl[1] = Null_tbl;
508 for (i = bottom; i <= top; i++) {
509 usetbl[0] = tblarray[i];
510 ptr = (char *) (pargs + i);
511 if (tbl = ffind(usetbl, fldp, &ptr))
514 if (!tbl || (i > top)) {
515 errmsg=strdup(GETMESSAGE(4,12, "Cannot locate the field '%s'"));
516 printerrf(argv0, errmsg, fldp, NULL, NULL, NULL,
517 NULL, NULL, NULL, NULL);
521 if (!op || !(tbl->flags & F_SIMPLE))
523 if (XK_PARSE(tbl, &val, ptr, 0, 0, NULL, all_tbl_find) < 0)
525 errmsg = strdup(GETMESSAGE(4,13,
526 "Cannot set the following value for the field '%s': %s"));
527 printerrf(argv0, errmsg, val, NULL,
528 NULL, NULL, NULL, NULL, NULL, NULL);
533 xk_par_int(&val, &newval, NULL);
536 intval = ((unsigned long *) ptr)[0];
539 intval = ((unsigned short *) ptr)[0];
542 intval = ((unsigned char *) ptr)[0];
545 if (tbl-size == sizeof(int))
547 intval = ((unsigned int *) ptr)[0];
579 ((unsigned long *) ptr)[0] = intval;
582 ((unsigned short *) ptr)[0] = intval;
585 ((unsigned char *) ptr)[0] = intval;
588 if (tbl->size == sizeof(int))
590 ((unsigned int *) ptr)[0] = intval;
604 void *ptr, *ptr2, **pptr2, *nuptr;
605 memtbl_t tbl[2], *tbl2;
607 unsigned char always_ptr;
608 char pr1[5 * BUFSIZ], pr2[5 * BUFSIZ], *p1, *p2;
614 if (argc > 1 && C_PAIR(argv[i], '-', 'p')) {
627 if (!isdigit(argv[i][0]))
629 ptr = getaddr(argv[i++]);
631 if (!type || !ptr || (parse_decl(argv[0], tbl, type, 1) == FAIL))
635 if ((always_ptr || !IS_SIMPLE(tbl)) && !tbl->ptr && !(tbl->flags & F_TYPE_IS_PTR))
637 else while (tbl->ptr > 1) {
638 ptr = *((void **) ptr);
641 for ( ; (i < argc) && argv[i]; i++) {
645 if (val = strchr(argv[i], '=')) {
647 tbl2 = ffind(tbl, argv[i], (char **)&pptr2);
649 errmsg = strdup(GetSharedMsg(DT_BAD_FIELD_NAME));
650 printerrf(argv[0], errmsg, argv[i],
651 type, NULL, NULL, NULL, NULL, NULL, NULL);
662 XK_PRINT(tbl2, &p1, (char *)pptr2, 0, 0, NULL, all_tbl_find);
663 if (XK_PARSE(tbl2, &val, (char *)&nuptr, 0, 0, NULL,
666 errmsg=strdup(GETMESSAGE(4,15,
667 "Cannot parse the following expression: %s"));
668 printerrf(argv[0], errmsg, argv[i],
669 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
673 XK_PRINT(tbl2, &p2, (char *)&nuptr, 0, 0, NULL, all_tbl_find);
674 XK_FREE(tbl2, (char *)&nuptr, 0, 0, all_tbl_find);
676 if (strcmp(pr1, pr2)) {
677 if (env_get((char *) "PRCOMPARE"))
679 errmsg=strdup(GETMESSAGE(4,16,
680 "The following comparision failed: '%s'\n\tActual: %s\n\tCompare: %s"));
681 printerrf(argv[0], errmsg,
682 argv[i], pr1, pr2, NULL, NULL, NULL,
696 fprintf(stderr,prompt);
701 /* This needs a functional proto, and needs to be extern'ed in docall.h */
708 char *variable = NULL;
711 char buf[5 * BUFSIZ];
720 while ((arg = (char *) va_arg(ap, unsigned long)) && (arg[0] == '-')) {
723 for (i = 1; arg[i]; i++) {
726 variable = va_arg(ap, char *);
739 printerr(argv[0], "Insufficient arguments", NULL);
743 val = (void *) va_arg(ap, unsigned long);
745 if (parse_decl("strprintf", &tbl, name, 1) == FAIL)
748 p = buf + lsprintf(buf, "%s=", variable);
751 if ((always_ptr || !IS_SIMPLE(&tbl)) && !tbl.ptr && !(tbl.flags & F_TYPE_IS_PTR))
753 if (!val && (tbl.ptr || (tbl.flags & F_TYPE_IS_PTR))) {
754 printerr(argv[0], "NULL value argument to strprint", NULL);
757 if (always_ptr && (tbl.flags & F_TYPE_IS_PTR))
758 val = *((void **) val);
759 else while (tbl.ptr > 1) {
760 val = *((void **) val);
763 Pr_tmpnonames = nonames;
764 ret = XK_PRINT(&tbl, &p, (void *) &val, 0, 0, NULL, all_tbl_find);