/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: /cvsup/minix/src/commands/aal/format.c,v 1.1.1.1 2005/04/21 14:53:57 beng Exp $ */ #if __STDC__ #include #else #include #endif extern 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; } /*VARARGS2*/ /*FORMAT1 $ %s = char * %l = long %c = int %[uxbo] = unsigned int %d = int $ */ int _format(buf, fmt, argp) char *buf, *fmt; register va_list argp; { register char *pf = fmt; register char *pb = buf; while (*pf) { if (*pf == '%') { register width, base, pad, npad; char *arg; char cbuf[2]; char *badformat = ""; /* get padder */ if (*++pf == '0') { pad = '0'; ++pf; } else pad = ' '; /* get width */ width = 0; while (*pf >= '0' && *pf <= '9') width = 10 * width + *pf++ - '0'; if (*pf == 's') { arg = va_arg(argp, char *); } else if (*pf == 'c') { cbuf[0] = va_arg(argp, int); cbuf[1] = '\0'; arg = &cbuf[0]; } else if (*pf == 'l') { /* alignment ??? */ if (base = integral(*++pf)) { arg = long2str(va_arg(argp,long), base); } else { pf--; arg = badformat; } } else if (base = integral(*pf)) { arg = long2str((long)va_arg(argp,int), base); } 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; }