|
|
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: T s
Length: 5114 (0x13fa)
Types: TextFile
Names: »splat.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Tools/splat/splat.c«
/* splat.c: produces a ASN.1 dump */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Tools/splat/RCS/splat.c,v 5.0 90/09/20 16:31:01 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Tools/splat/RCS/splat.c,v 5.0 90/09/20 16:31:01 pp Exp Locker: pp $
*
* $Log: splat.c,v $
* Revision 5.0 90/09/20 16:31:01 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <varargs.h>
void advise();
/* --------------------- Begin Routines -------------------------------- */
char *myname;
int process1 (), process2 ();
main (argc, argv, envp)
int argc;
char **argv,
**envp;
{
extern char *optarg;
extern int optind;
int opt;
register char *cp;
register FILE * fp;
int status = 0;
IFP fnx = process1;
myname = argv[0];
while((opt = getopt(argc, argv, "d")) != EOF)
switch (opt) {
case 'd':
fnx = process2;
break;
default:
fprintf (stderr, "Usage: %s", myname);
break;
}
argc -= optind;
argv += optind;
if (argc == 0)
status = (*fnx) ("(stdin)", stdin);
else
while (cp = *argv++) {
if ((fp = fopen (cp, "r")) == NULL) {
advise (cp, "unable to read");
status++;
continue;
}
status += (*fnx) (cp, fp);
(void) fclose (fp);
}
exit (status);
}
/* --------------------- Static Routines ------------------------------- */
static int process1 (file, fp)
register char *file;
register FILE *fp;
{
register PE pe;
register PS ps;
PS ps_out;
if ((ps = ps_alloc (std_open)) == NULLPS) {
advise ("process", "ps_alloc");
return 1;
}
if (std_setup (ps, fp) == NOTOK) {
advise (NULLCP, "%s: std_setup loses", file);
return 1;
}
if ((ps_out = ps_alloc (std_open)) == NULLPS)
printf ("failed on ps_alloc\n");
if (std_setup (ps_out, stdout) != OK)
printf ("failed to asssign stdout\n");
for (;;) {
if ((pe = ps2pe (ps)) == NULLPE)
if (ps -> ps_errno) {
advise (NULLCP, "ps2pe: %s", ps_error(ps -> ps_errno));
ps_free (ps);
return 1;
}
else {
ps_free (ps);
return 0;
}
pe2pl (ps_out, pe);
pe_free (pe);
}
}
#define ps_advise(ps, str) advise (NULLCP, "%s: %s", str, ps_error(ps -> ps_errno));
int process2 (file, fp)
char *file;
FILE *fp;
{
register PE pe;
register PS ps;
PS ps_out;
if ((ps = ps_alloc (std_open)) == NULLPS) {
advise ("process", "ps_alloc");
return 1;
}
if (std_setup (ps, fp) == NOTOK) {
advise (NULLCP, "%s: std_setup loses", file);
return 1;
}
for (;;) {
if (read_stuff (ps, 0) == NOTOK)
return 1;
}
}
read_stuff (ps, depth)
PS ps;
int depth;
{
PElementClass class;
PElementForm form;
PElementID id;
int len;
if (ps_read_id (ps, 1, &class, &form, &id) == NOTOK) {
ps_advise (ps, "ps_read_id");
return NOTOK;
}
printf ("%*sClass %s, form %s, id %d ", depth * 2, "",
pe_classlist[class],
form == PE_FORM_PRIM ? "primitive" : "constructor",
id);
if (ps_read_len (ps, &len) == NOTOK) {
ps_advise (ps, "ps_read_len");
return NOTOK;
}
printf (len == PE_LEN_INDF ? "length indefinite\n" : "length %d\n", len);
if (form == PE_FORM_PRIM) {
if (len == 0) {
if (class == PE_CLASS_UNIV && id == 0)
return DONE;
else return OK;
}
else {
char *str = malloc (len);
if (ps_read (ps, str, len) == NOTOK) {
ps_advise (ps, "ps_read");
return NOTOK;
}
hexdump (str, len, depth);
free (str);
}
}
else {
if (len == PE_LEN_INDF) {
int res;
for (;;) {
res = read_stuff (ps, depth + 1);
if (res == NOTOK)
return res;
if (res == DONE)
break;
}
}
else {
int cc = ps -> ps_byteno + len;
for (;;) {
if (read_stuff (ps, depth + 1) == NOTOK)
return NOTOK;
if (ps -> ps_byteno >= cc)
break;
}
}
}
return OK;
}
hexdump (s, n, depth)
char *s;
int n;
{
int i;
char *hexstr = "0123456789ABCDEF";
printf ("%*s", depth * 2, "");
for (i = depth * 2; n > 0; n--, i+=2, s++) {
putchar (hexstr[(*s>>4) & 0xf]);
putchar (hexstr[(*s)&0xf]);
if (i > 70) {
putchar ('\n');
i = depth;
printf ("%*s", depth * 2, "");
}
}
putchar ('\n');
}
#ifndef lint
void _advise ();
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
_exit (1);
}
#else
/* VARARGS */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
static void _advise (ap)
va_list ap;
{
char buffer[BUFSIZ];
asprintf (buffer, ap);
(void) fflush (stdout);
fprintf (stderr, "%s: ", myname);
(void) fputs (buffer, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
#else
/* VARARGS */
void advise (what, fmt)
char *what,
*fmt;
{
advise (what, fmt);
}
#endif