File:  [Research Unix] / researchv9 / jtools / src / pi / format.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#include "univ.h"
#include "format.pri"
#include <ctype.h>
#include "symtab.pub"
#include "symbol.h"
SRCFILE("format.c")

char *Bls::af(PRINTF_ARGS)
{
	char x[1024], *q = x;

	trace( "%d.af(%s ...) %s", this, fmt, text );
	IF_LIVE(!this) return "Bls::af";
	if( p<text+TBLS && fmt ){
		sprintf(x, PRINTF_COPY);
		while( *q && p<text+TBLS ) *p++ = *q++;
		*p = 0;
	}
	return text;
}

Bls::Bls(PRINTF_ARGS)
{
	clear();
	af(PRINTF_COPY);
}

Bls::Bls(Bls &b)
{
	clear();
	af("%s", b.text);
}

Format::Format(long f, SymTab *s)	{ format = f; stab = s; }

char *FmtByte(int c)
{	static char buf[8];

	switch( c &= 0xFF ){
	case '\0'	: return "\\0";	
	case '\b'	: return "\\b";	
	case '\f'	: return "\\f";	
	case '\n'	: return "\\n";	
	case '\r'	: return "\\r";	
	case '\t'	: return "\\t";	
	case '\v'	: return "\\v";	
	case ' '	: return " ";		/* see ikeya!<ctype.h> */	
	case '\''	: return "\\\'";
	case '\"'	: return "\\\"";
	case '\\'	: return "\\\\";
	}
	sprintf( buf, isascii(c)&&isprint(c)?"%c":"\\%03o", c );
 	return buf;
}

char *FmtAscii(unsigned long c)
{
	static char buf[32];

	if( c == 0 ) return "0";
	strcpy(buf, "'");
	int lead = 1; int byte = 4;			// cfront bug
	for( ; byte; --byte, c<<=8 ){
		if( (c&0xFF000000) || !lead ){
			strcat(buf, FmtByte(c>>24));
			lead = 0;
		}
	}
	return strcat(buf, "'");
}

void Format::grow(char *b)
{
	accum.af("%s%s", sep, b);
	sep = "=";
}

void Format::growtime(long t)
{
	char *time(long*);
	grow(ctime(&t));
}
	
void Format::grow(char *fmt, long l)
{
	char buf[32];

	sprintf(buf, fmt, l);
	grow(buf);
}

void Format::grow(char *fmt, double d)
{
	char buf[32];

	trace( "%d.grow(%s,%g)", this, fmt, d );
	sprintf(buf, fmt, d);
	if( fmt[1]=='g' && !strcmp(buf, "0") )
		grow("0.0");
	else
		grow(buf);
}

char *Format::f(long lng, double dbl)
{
	Symbol *s;

	if( !this ) return "Format::f";

	accum.clear();
	sep = "";

	if( !format ) format = F_HEX;

	if( format&F_MASK8  ) lng &= 0xFF;
	if( format&F_MASK16 ) lng &= 0xFFFF;

	if( format&F_FLOAT  ) grow("%g",      dbl);
	if( format&F_DOUBLE ) grow("%g",      dbl);
	if( format&F_DBLHEX ) grow("0x%X_%X", dbl);

	if( format&F_SYMBOLIC
	 && lng
	 && stab
	 && (s = stab->loctosym(SSet(U_FUNC,U_GLB,U_STA,U_STMT), lng)) ){
		lng -= s->range.lo;
		grow(s->text());
		if( !lng )
			format = 0;
		else {
			sep =  "+";
			if( !(format&F_HOAD) ) format |= F_HEX;
		}
	}

	if( format&F_TIME ) growtime(lng);
	if( (format&F_HOAD) && lng>=0 && lng<=7 ) grow("%d", lng);
	else {
		if( format&F_OCTAL   ) grow("0%o",  lng);
		if( format&F_DECIMAL ) grow("%u",   lng);
		if( format&F_HEX     ) grow("0x%X", lng);
		if( format&F_ASCII   ) grow(FmtAscii(lng));

		if( format&F_EXT8 ) lng = (char ) lng;
		if( format&F_EXT16) lng = (short) lng;

		if( format&F_SIGNED
		 && (lng<0 || !(format&F_DECIMAL)) ) grow("%d", lng);
	}
	return accum.text;
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.