|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: L T
Length: 11208 (0x2bc8) Types: TextFile Names: »LibTest.c«
└─⟦276d19d6e⟧ Bits:30007243 EUUGD5_I: X11R5 └─⟦af7d3f39a⟧ »./mit-2/mit-2.00« └─⟦0abaffd9e⟧ └─⟦this⟧ »mit/demos/xcmstest/LibTest.c«
/* $XConsortium: LibTest.c,v 1.3 91/05/14 15:02:45 dave Exp $ */ /* * Copyright 1989 1990, Tektronix, Inc. * Copyright 1989 1990 by The Massachusetts Institute of Technology * * All Rights Reserved * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting * documentation, and that the names of MIT and Tektronix not be * used in advertising or publicity pertaining to distribution * of the software without specific prior written permission. * M.I.T. and Tektronix make no representation about the * suitability of this software for any purpose. It is provided * "as is" without any express or implied warranty. * * MIT AND TEKTRONIX DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MIT OR * TEKTRONIX BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH * THE USE OR PERFORMANCE OF THIS SOFTWARE. * * NAME * cmstest - Interactive Library Testing Interface. * * SYNOPSIS * cmstest * * DESCRIPTION * This program is a front-end for testing the library. * It takes commands from stdin. * * FILES * Command Source File: * C source file containing a) definition for the * Command Table (table of command string / function * pointer tuples) and b) function source. * Command Header File: * Header file as a result from running 'autohdr' * on the Command Source File. * Command Object File: * The result of compiling the Command Source File * Library: * The library under test. * Makefile: * All the above files are defined in the Makefile * and generated and appropriately linked to this * program. */ /* * EXTERNAL INCLUDES * Include files that must be exported to any package or * program using this package. */ #include "LibTest.h" #include <X11/Xlib.h> #include <X11/Xlibint.h> /* * EXTERNALS * Declarations that are needed by calling modules. * When using 'autohdr', these declaration will be placed * in the resulting header file. */ int CommandArgc; /* GLOBAL */ char **CommandArgv; /* GLOBAL */ int EchoInput = 0; /* GLOBAL */ /* * INTERNAL INCLUDES * Include files that need NOT be exported to any package or * program using this package. */ #include <stdio.h> #include "CmdTbl.h" /* * INTERNALS * Declarations that are local to this module. * (ignored by 'autohdr'). */ #ifndef LIBTEST_PROMPT #define LIBTEST_PROMPT "What! >" #endif #ifndef LIBTEST_COMMENT_CHAR #define LIBTEST_COMMENT_CHAR '#' #endif #define LIBTEST_EOLN_CHAR '\n' PFStatus LtStrToFuncPtr(); int errno; extern Display *pDpy ; \f /************************************************************************ * * * M A I N * * * ************************************************************************/ /* * NAME * main * * SYNOPSIS */ main(argc, argv) int argc; char **argv; /* * DESCRIPTION * <complete external description of the function> * * RETURNS * <value returned by the function -- not required for void functions> * */ { char buf[BUFSIZ]; PFStatus pfunc; char command[BUFSIZ]; /* * Set global CommandArgc and CommandArgv */ CommandArgc = argc; CommandArgv = argv; /* * Process args as necessary here. */ for (;argc--;argv++) { if (strcmp(*argv, "-echo") == 0) { EchoInput = 1; } } for(;;) { printf("%s", LIBTEST_PROMPT); if (fgets(buf, BUFSIZ, stdin) == NULL) { return; } if (EchoInput) { printf("%s", buf); fflush(stdout); } if ((buf[0] == LIBTEST_COMMENT_CHAR) || (buf[0] == LIBTEST_EOLN_CHAR)) { continue; } if (sscanf(buf, "%s", command) != 0) { if ((pfunc = LtStrToFuncPtr(LIBTEST_CMDTBL, command)) == (PFStatus) -1) { printf("Error: Invalid command\n\n"); fflush(stdout); continue; } (*pfunc)(&buf[strlen(command)]); fflush(stdout); } } } \f /************************************************************************ * * * PRIVATE ROUTINES * * * ************************************************************************/ /* * NAME * _XPrintDefaultError * * SYNOPSIS */ static int _XPrintDefaultError (dpy, event, fp) Display *dpy; XErrorEvent *event; FILE *fp; /* * DESCRIPTION * Prints error message to stderr * This code lifted directly from Xlib Source * XlibInt.c,v 11.124 90/06/15 13:09:20 rws * * RETURNS * int * */ { char buffer[BUFSIZ]; char mesg[BUFSIZ]; char number[32]; char *mtype = "XlibMessage"; register _XExtension *ext = (_XExtension *)NULL; XGetErrorText(dpy, event->error_code, buffer, BUFSIZ); XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ); (void) fprintf(fp, "%s: %s\n ", mesg, buffer); XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d", mesg, BUFSIZ); (void) fprintf(fp, mesg, event->request_code); if (event->request_code < 128) { sprintf(number, "%d", event->request_code); XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ); } else { for (ext = dpy->ext_procs; ext && (ext->codes.major_opcode != event->request_code); ext = ext->next) /* SUPPRESS 530 */ ; if (ext) strcpy(buffer, ext->name); else buffer[0] = '\0'; } (void) fprintf(fp, " (%s)\n ", buffer); if (event->request_code >= 128) { XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d", mesg, BUFSIZ); (void) fprintf(fp, mesg, event->minor_code); if (ext) { sprintf(mesg, "%s.%d", ext->name, event->minor_code); XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ); (void) fprintf(fp, " (%s)", buffer); } fputs("\n ", fp); } if (event->error_code >= 128) { /* kludge, try to find the extension that caused it */ buffer[0] = '\0'; for (ext = dpy->ext_procs; ext; ext = ext->next) { if (ext->error_string) (*ext->error_string)(dpy, event->error_code, &ext->codes, buffer, BUFSIZ); if (buffer[0]) break; } if (buffer[0]) sprintf(buffer, "%s.%d", ext->name, event->error_code - ext->codes.first_error); else strcpy(buffer, "Value"); XGetErrorDatabaseText(dpy, mtype, buffer, "Value 0x%x", mesg, BUFSIZ); if (*mesg) { (void) fprintf(fp, mesg, event->resourceid); fputs("\n ", fp); } } else if ((event->error_code == BadWindow) || (event->error_code == BadPixmap) || (event->error_code == BadCursor) || (event->error_code == BadFont) || (event->error_code == BadDrawable) || (event->error_code == BadColor) || (event->error_code == BadGC) || (event->error_code == BadIDChoice) || (event->error_code == BadValue) || (event->error_code == BadAtom)) { if (event->error_code == BadValue) XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x", mesg, BUFSIZ); else if (event->error_code == BadAtom) XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x", mesg, BUFSIZ); else XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); (void) fprintf(fp, mesg, event->resourceid); fputs("\n ", fp); } XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); (void) fprintf(fp, mesg, event->serial); fputs("\n ", fp); XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d", mesg, BUFSIZ); (void) fprintf(fp, mesg, dpy->request); fputs("\n", fp); if (event->error_code == BadImplementation) return 0; return 1; } \f /************************************************************************ * * * PUBLIC ROUTINES * * * ************************************************************************/ /* * NAME * LtErrorHandler - Special LibTest error handler * * SYNOPSIS */ int LtErrorHandler (pDpy, pError) Display *pDpy ; XErrorEvent *pError ; /* * DESCRIPTION * Traps XErrorEvents * Prints a message to stderr, * Sets a global variable, * Synchronizes output * * RETURNS * int * */ { _XPrintDefaultError (pDpy, pError, stderr); return (1) ; } \f /* * NAME * LtStrToFuncPtr - convert a string to a function pointer * * SYNOPSIS */ PFStatus LtStrToFuncPtr(pde,pstring) FuncTableEntry *pde; /* IN: table of string/functionptr pairs * last entry must contain pair "", 0 */ char *pstring; /* IN: string to be looked up in that table */ /* * DESCRIPTION * Converts a string to an integer define. * * Looks up the string in the table and returns the integer * associated with the string. * * Later may need similar function for unsigned long define. * * RETURNS * The int equivalent of the defined string. * -1 if the string is not found in table * */ { if (!pde) return((PFStatus) -1); /* defend against NULL pointer */ while( strcmp(pde->pstring,"") != 0 ){ if( strcmp(pde->pstring, pstring) == 0){ return(pde->pfunc); } pde++; } return((PFStatus) -1); } \f /* * NAME * LtDefineToStr - convert a define to a string * * SYNOPSIS */ char * LtDefineToStr(pde,define) LtDefineEntry pde[]; /* IN: table of X string-define pairs * last entry must contain pair "", 0 */ int define; /* IN: define to be looked up in that table */ /* * DESCRIPTION * Converts an integer define to a string pointer. * Later may need similar function for unsigned long define. * * Check XuDefineString.h for predefined tables. * * RETURNS * Pointer to a valid string. * If no string is found, returns a pointer to a 0 length string. * */ { while( strcmp(pde->pstring,"") != 0 ){ if( pde->define == define) { return(pde->pstring); } pde++; } return(""); } \f /* * NAME * LtStrToDefine - convert a string to a define * * SYNOPSIS */ int LtStrToDefine(pde,pstring) LtDefineEntry pde[]; /* IN: table of X string-define pairs * last entry must contain pair "", 0 */ char *pstring; /* IN: string to be looked up in that table */ /* * DESCRIPTION * Converts a string to an integer define. * * Looks up the string in the table and returns the integer * associated with the string. * * Later may need similar function for unsigned long define. * * Check XuDefineString.h for predefined tables. * * * RETURNS * The int equivalent of the defined string. * -1 if the string is not found in table * */ { while( strcmp(pde->pstring,"") != 0 ){ if( strcmp(pde->pstring,pstring) == 0){ return(pde->define); } pde++; } return(-1); }