Initial revision
This commit is contained in:
parent
b63bf2720c
commit
cb96da9bfa
8 changed files with 294 additions and 0 deletions
14
modules/src/print/doprnt.c
Normal file
14
modules/src/print/doprnt.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#include <system.h>
|
||||||
|
#include "param.h"
|
||||||
|
|
||||||
|
doprnt(fp, fmt, argp)
|
||||||
|
File *fp;
|
||||||
|
char *fmt;
|
||||||
|
int argp[];
|
||||||
|
{
|
||||||
|
char buf[SSIZE];
|
||||||
|
|
||||||
|
sys_write(fp, buf, _format(buf, fmt, (char *)argp));
|
||||||
|
}
|
99
modules/src/print/format.c
Normal file
99
modules/src/print/format.c
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
char *long2str();
|
||||||
|
|
||||||
|
static int
|
||||||
|
integral(c)
|
||||||
|
{
|
||||||
|
switch (c) {
|
||||||
|
case 'b':
|
||||||
|
return -2;
|
||||||
|
case 'd':
|
||||||
|
return 10;
|
||||||
|
case 'o':
|
||||||
|
return -8;
|
||||||
|
case 'u':
|
||||||
|
return -10;
|
||||||
|
case 'x':
|
||||||
|
return -16;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_format(buf, fmt, argp)
|
||||||
|
char *buf, *fmt;
|
||||||
|
char *argp;
|
||||||
|
{
|
||||||
|
register char *pf = fmt, *pa = argp;
|
||||||
|
register char *pb = buf;
|
||||||
|
|
||||||
|
while (*pf) {
|
||||||
|
if (*pf == '%') {
|
||||||
|
register width, base, pad, npad;
|
||||||
|
char *arg;
|
||||||
|
char cbuf[2];
|
||||||
|
char *badformat = "<bad format>";
|
||||||
|
|
||||||
|
/* get padder */
|
||||||
|
if (*++pf == '0') {
|
||||||
|
pad = '0';
|
||||||
|
++pf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pad = ' ';
|
||||||
|
|
||||||
|
/* get width */
|
||||||
|
width = 0;
|
||||||
|
while (*pf >= '0' && *pf <= '9')
|
||||||
|
width = 10 * width + *pf++ - '0';
|
||||||
|
|
||||||
|
/* get text and move pa */
|
||||||
|
if (*pf == 's') {
|
||||||
|
arg = *(char **)pa;
|
||||||
|
pa += sizeof(char *);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (*pf == 'c') {
|
||||||
|
cbuf[0] = * (char *) pa;
|
||||||
|
cbuf[1] = '\0';
|
||||||
|
pa += sizeof(int);
|
||||||
|
arg = &cbuf[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (*pf == 'l') {
|
||||||
|
/* alignment ??? */
|
||||||
|
if (base = integral(*++pf)) {
|
||||||
|
arg = long2str(*(long *)pa, base);
|
||||||
|
pa += sizeof(long);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pf--;
|
||||||
|
arg = badformat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (base = integral(*pf)) {
|
||||||
|
arg = long2str((long)*(int *)pa, base);
|
||||||
|
pa += sizeof(int);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (*pf == '%')
|
||||||
|
arg = "%";
|
||||||
|
else
|
||||||
|
arg = badformat;
|
||||||
|
|
||||||
|
npad = width - strlen(arg);
|
||||||
|
|
||||||
|
while (npad-- > 0)
|
||||||
|
*pb++ = pad;
|
||||||
|
|
||||||
|
while (*pb++ = *arg++);
|
||||||
|
pb--;
|
||||||
|
pf++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*pb++ = *pf++;
|
||||||
|
}
|
||||||
|
return pb - buf;
|
||||||
|
}
|
15
modules/src/print/fprint.c
Normal file
15
modules/src/print/fprint.c
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#include <system.h>
|
||||||
|
#include "param.h"
|
||||||
|
|
||||||
|
/*VARARGS1*/
|
||||||
|
fprint(fp, fmt, args)
|
||||||
|
File *fp;
|
||||||
|
char *fmt;
|
||||||
|
int args;
|
||||||
|
{
|
||||||
|
char buf[SSIZE];
|
||||||
|
|
||||||
|
sys_write(fp, buf, _format(buf, fmt, &args));
|
||||||
|
}
|
3
modules/src/print/param.h
Normal file
3
modules/src/print/param.h
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#define SSIZE 1024
|
124
modules/src/print/print.3
Normal file
124
modules/src/print/print.3
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
.TH PRINT 3ACK "86/04/02"
|
||||||
|
.SH NAME
|
||||||
|
print, fprint, sprint, doprnt -- very simple formatted-output routines
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
.B #include <system.h>
|
||||||
|
.PP
|
||||||
|
.B print(format [, arg] ... )
|
||||||
|
.B char *format;
|
||||||
|
.PP
|
||||||
|
.B fprint(filep, format [, arg] ... )
|
||||||
|
.B File *filep;
|
||||||
|
.B char *format;
|
||||||
|
.PP
|
||||||
|
.B sprint(s, format [, arg] ... )
|
||||||
|
.B char *s, *format;
|
||||||
|
.PP
|
||||||
|
.B doprnt(filep, format, args)
|
||||||
|
.B File *filep;
|
||||||
|
.B char *format;
|
||||||
|
.B int args[];
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.I Print
|
||||||
|
writes output on standard output.
|
||||||
|
.I Fprint
|
||||||
|
and
|
||||||
|
.I doprnt
|
||||||
|
place output on the open file known by
|
||||||
|
.IR filep .
|
||||||
|
.I Sprint
|
||||||
|
places `output' in the string
|
||||||
|
.IR s ,
|
||||||
|
followed by the character `\\0'.
|
||||||
|
.PP
|
||||||
|
Each of these functions converts, formats and prints its arguments, following
|
||||||
|
the
|
||||||
|
.I format
|
||||||
|
argument, under control of
|
||||||
|
.IR format .
|
||||||
|
.I Format
|
||||||
|
is a character string which contains two types of objects: plain characters,
|
||||||
|
which are simply copied to the output destination, and conversion
|
||||||
|
specifications, each of which causes conversion and printing of the next
|
||||||
|
successive argument.
|
||||||
|
.PP
|
||||||
|
A conversion specification is introduced by the character %.
|
||||||
|
Following the %, there may be
|
||||||
|
.IP \(bu
|
||||||
|
an optional row of decimal digits specifying the field width;
|
||||||
|
if the converted integral value has fewer characters than
|
||||||
|
the field width, it will be blank-padded on the left;
|
||||||
|
if the field width begins with a zero, zero-padding will be done;
|
||||||
|
.IP \(bu
|
||||||
|
the character
|
||||||
|
.B l
|
||||||
|
specifying that a following
|
||||||
|
.BR b ,
|
||||||
|
.BR d ,
|
||||||
|
.BR o ,
|
||||||
|
.B u
|
||||||
|
or
|
||||||
|
.B x
|
||||||
|
corresponds to a long-integer argument;
|
||||||
|
.IP \(bu
|
||||||
|
a character which indicates the type of conversion to be applied.
|
||||||
|
.LP
|
||||||
|
.PP
|
||||||
|
The conversion characters and their meanings are
|
||||||
|
.IP \fBbdox\fP
|
||||||
|
The next argument is an integer and is converted to binary, decimal, octal
|
||||||
|
or hexadecimal notation respectively.
|
||||||
|
.IP \fBc\fP
|
||||||
|
Next argument is a character and is put directly into the resulting string.
|
||||||
|
the field width is one character.
|
||||||
|
.IP \fBs\fP
|
||||||
|
Next argument is taken to be a character pointer and characters from the
|
||||||
|
string are taken until a null character is reached; a specified field width
|
||||||
|
is not taken into account.
|
||||||
|
.IP \fBu\fP
|
||||||
|
The unsigned integer argument is converted to decimal.
|
||||||
|
.LP
|
||||||
|
.PP
|
||||||
|
Integral arguments are not truncated, even if their size exceeds the specified
|
||||||
|
field width.
|
||||||
|
Padding takes place only if the specified field width exceeds the actual width.
|
||||||
|
.PP
|
||||||
|
The printing routines build the string to be printed internally and use
|
||||||
|
.I sys_write
|
||||||
|
to print it.
|
||||||
|
.I Doprnt
|
||||||
|
takes
|
||||||
|
.I args
|
||||||
|
as the address of the arguments of the format string.
|
||||||
|
This allows routines, e.g.
|
||||||
|
.IR print ,
|
||||||
|
to be defined as follows:
|
||||||
|
.br
|
||||||
|
.RS
|
||||||
|
.nf
|
||||||
|
/*VARARGS1*/
|
||||||
|
print(fmt, argv)
|
||||||
|
char *fmt;
|
||||||
|
int argv;
|
||||||
|
{
|
||||||
|
doprnt(STDOUT, fmt, &argv);
|
||||||
|
}
|
||||||
|
.fi
|
||||||
|
.RE
|
||||||
|
.SH FILES
|
||||||
|
.nf
|
||||||
|
~em/modules/lib/libprint.a
|
||||||
|
.fi
|
||||||
|
.SH MODULES
|
||||||
|
system(3), string(3)
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
.PP
|
||||||
|
Each illegal conversion specification is replaced by the string "<bad\ format>".
|
||||||
|
.SH BUGS
|
||||||
|
The maximum length of the string to be printed is 1024 characters.
|
||||||
|
.SH SEE ALSO
|
||||||
|
printf(3)
|
||||||
|
.SH AUTHOR
|
||||||
|
Erik Baalbergen <erikb@vu44.UUCP>
|
14
modules/src/print/print.c
Normal file
14
modules/src/print/print.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#include <system.h>
|
||||||
|
#include "param.h"
|
||||||
|
|
||||||
|
/*VARARGS1*/
|
||||||
|
print(fmt, args)
|
||||||
|
char *fmt;
|
||||||
|
int args;
|
||||||
|
{
|
||||||
|
char buf[SSIZE];
|
||||||
|
|
||||||
|
sys_write(STDOUT, buf, _format(buf, fmt, &args));
|
||||||
|
}
|
11
modules/src/print/print.h
Normal file
11
modules/src/print/print.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#define stdin STDIN
|
||||||
|
#define stdout STDOUT
|
||||||
|
#define stderr STDERR
|
||||||
|
|
||||||
|
#define printf print
|
||||||
|
#define sprintf sprint
|
||||||
|
#define fprintf fprint
|
||||||
|
|
||||||
|
#define FILE File
|
14
modules/src/print/sprint.c
Normal file
14
modules/src/print/sprint.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/* $Header$ */
|
||||||
|
|
||||||
|
#include <system.h>
|
||||||
|
#include "param.h"
|
||||||
|
|
||||||
|
/*VARARGS1*/
|
||||||
|
char *
|
||||||
|
sprint(buf, fmt, args)
|
||||||
|
char *buf, *fmt;
|
||||||
|
int args;
|
||||||
|
{
|
||||||
|
buf[_format(buf, fmt, &args)] = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue