From 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 Mon Sep 17 00:00:00 2001 From: Joe Hunkeler Date: Tue, 11 Aug 2015 16:51:37 -0400 Subject: Repatch (from linux) of OSX IRAF --- unix/os/zzpstr.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 unix/os/zzpstr.c (limited to 'unix/os/zzpstr.c') diff --git a/unix/os/zzpstr.c b/unix/os/zzpstr.c new file mode 100644 index 00000000..30648b65 --- /dev/null +++ b/unix/os/zzpstr.c @@ -0,0 +1,176 @@ +#include +#include +#include +#include + +#define import_spp +#include + +/* + * ZZPSTR.C -- Support for debugging SPP programs. + * + * zzpstr (s1, s2) # Write a debug message to the process stderr + * zzlstr (s1, s2) # Write a debug message to /tmp/k.log + * spp_printstr (s) # GDB support function + * spp_printmemc (memc_p) # GDB support function + * + * The procedures zzpstr and zzlstr are meant to be called from within + * compiled SPP code to write debug messages to either the process stderr + * or to a log file. This is different than writing to SPP STDERR since + * the latter is a pseudofile (it gets sent to the CL before being written + * out). In other words zzpstr/zzlstr are low level debug functions, + * comparable to a host fprintf. + * + * spp_printstr and spp_printmemc are called from a debugger (GDB) to + * print char strings. spp_printstr prints a char variable as an EOS + * terminated string. spp_printmemc does the same thing, but takes a Memc + * pointer variable as input. + * + * The following commands can be added to your .gdbinit file to make it + * easier to use these functions: + * + * define ps + * call spp_printstr ($arg0) + * end + * + * define pc + * call spp_printmemc ($arg0) + * end + * + * Then you can type e.g., "ps fname" to print char variable fname, + * or "pc ip" to print the string pointed to by SPP Memc pointer "ip". + * Both of these functions will print tabs and newlines as \t and \n, + * and other control codes as \ooo where ooo is the octal value of the + * character. + */ + +#define LOGFILE "/tmp/k.log" + +void spp_printmemc (long memc_ptr); +void spp_printstr (XCHAR *s); + + + +/* SPP_DEBUG -- Dummy function called to link the SPP debug functions into + * a program. + */ +int spp_debug (void) { return (0); } + + +/* ZZPSTR -- Write SPP text data directly to the host stderr. Up to two + * strings may be ouptut. Either may be the null pointer to disable. + * A newline is added at the end if not present in the last string. + */ +int +zzpstr_ (XCHAR *s1, XCHAR *s2) +{ + register XCHAR *s, *ip; + register char *op; + char buf[4096]; + int lastch = 0; + + + if ( (s = s1) ) { + for (ip=s, op=buf; (*op = *ip++); op++) + ; + lastch = *(op-1); + write (2, buf, op-buf); + } + + if ( (s = s2) ) { + for (ip=s, op=buf; (*op = *ip++); op++) + ; + lastch = *(op-1); + write (2, buf, op-buf); + } + + if (lastch != '\n') + write (2, "\n", 1); + + return (XOK); +} + + +/* ZZLSTR -- Write SPP text data to a log file. + */ +int +zzlstr_ (XCHAR *s1, XCHAR *s2) +{ + register XCHAR *s, *ip; + register char *op; + char buf[4096]; + int lastch = 0; + int status = 0, fd; + + if ((fd = open (LOGFILE, O_CREAT|O_WRONLY|O_APPEND, 0644)) < 0) + return (fd); + + if ( (s = s1) ) { + for (ip=s, op=buf; (*op = *ip++); op++) + ; + lastch = *(op-1); + status = write (fd, buf, op-buf); + } + + if ( (s = s2) ) { + for (ip=s, op=buf; (*op = *ip++); op++) + ; + lastch = *(op-1); + status = write (fd, buf, op-buf); + } + + if (lastch != '\n') + status = write (fd, "\n", 1); + + status = close (fd); + return (status); +} + + +/* SPP_PRINTSTR -- GDB callable debug function to print an EOS terminated SPP + * string passed as a char array. + */ +void +spp_printstr (XCHAR *s) +{ + register XCHAR *ip; + register char *op, *otop; + static char obuf[1024]; + int ch; + + for (ip=s+1, op=obuf, otop=obuf+1020; (ch = *ip); ip++) { + if (!isprint (ch)) { + if (ch == '\t') { + *op++ = '\\'; + *op++ = 't'; + } else if (ch == '\n') { + *op++ = '\\'; + *op++ = 'n'; + } else { + *op++ = '\\'; + *op++ = ((ch >> 6) & 07) + '0'; + *op++ = ((ch >> 3) & 07) + '0'; + *op++ = ( ch & 07) + '0'; + } + } else + *op++ = ch; + + if (op >= otop) + break; + } + + *op++ = '\0'; + printf ("%s\n", obuf); + fflush (stdout); +} + + +/* SPP_PRINTMEMC -- GDB callable debug function to print an EOS terminated SPP + * string passed as a pointer to char. + */ +void +spp_printmemc (long memc_ptr) +{ + XCHAR *str = (XCHAR *) ((memc_ptr - 1) * 2 - 2); + spp_printstr (str); +} -- cgit