|
|
1.1 ! root 1: .TH PRINT 3 ! 2: .CT 2 file_io ! 3: .SH NAME ! 4: print, fprint, sprint, fmtinstall \(mi print formatted output ! 5: .SH SYNOPSIS ! 6: .nf ! 7: .BR "int print(format \fR[\fP , arg \fR]\fP ... )" ! 8: .B char \(**format; ! 9: .PP ! 10: .BR "int fprint(fildes, format \fR[\fP , arg \fR]\fP ... )" ! 11: .B int fildes; ! 12: .B char \(**format; ! 13: .PP ! 14: .BR "int sprint(s, format \fR[\fP , arg \fR]\fP ... )" ! 15: .B char \(**s, \(**format; ! 16: .PP ! 17: .B fmtinstall(c, fn) ! 18: .B char c; ! 19: .B int (*fn)(); ! 20: .PP ! 21: .B strconv(s, f1, f2) ! 22: .B char *s; ! 23: .PP ! 24: .B extern int printcol; ! 25: .fi ! 26: .SH DESCRIPTION ! 27: .I Print ! 28: places output on the standard output. ! 29: .I Fprint ! 30: places output on the named output ! 31: file descriptor; ! 32: a buffered form ! 33: is described in ! 34: .IR fio (3). ! 35: .I Sprint ! 36: places output ! 37: followed by the null character ! 38: .RB ( \e0 ) ! 39: in consecutive bytes starting at ! 40: .IR s ; ! 41: it is the user's responsibility to ensure that ! 42: enough storage is available. ! 43: Each function returns the number of characters ! 44: transmitted (not including the ! 45: .B \e0 ! 46: in the case of ! 47: .IR sprint ), ! 48: or ! 49: a negative value if an output error was encountered. ! 50: .PP ! 51: Each of these functions ! 52: converts, formats, and prints its ! 53: trailing arguments ! 54: under control of a ! 55: .IR format ! 56: string. ! 57: The ! 58: .I format ! 59: contains two types of objects: ! 60: plain characters, which are simply copied to the ! 61: output stream, ! 62: and conversion specifications, ! 63: each of which results in fetching of ! 64: zero or more ! 65: arguments. ! 66: The results are undefined if there are arguments of the ! 67: wrong type or too few ! 68: arguments for the format. ! 69: If the format is exhausted while ! 70: arguments remain, the excess ! 71: are ignored. ! 72: .PP ! 73: Each conversion specification has the following format ! 74: .PP ! 75: .B "% [flags] [[\(mi] digits [. digits]] verb ! 76: .PP ! 77: The ! 78: .I flags ! 79: modify the meaning of ! 80: the conversion verb. ! 81: The first (possibly negative) number is called ! 82: .IR f1 , ! 83: the second number is ! 84: .IR f2 . ! 85: The flags and numbers are arguments to ! 86: the ! 87: .I verb ! 88: described below. ! 89: .PP ! 90: The numeric verbs ! 91: .BR d , ! 92: .BR o , ! 93: and ! 94: .B x ! 95: format their arguments in decimal, ! 96: octal and hex respectively. ! 97: Each interprets the flags ! 98: .BR h , ! 99: .BR l , ! 100: .BR u , ! 101: to mean short, ! 102: long, ! 103: and unsigned. ! 104: If neither ! 105: short nor long is specified, ! 106: then the arg is an ! 107: .BR int . ! 108: If unsigned is specified, ! 109: then the arg is interpreted as a ! 110: positive number and no sign is output. ! 111: .I F1 ! 112: is the minimum field width and, ! 113: if negative, ! 114: means left justified rather than right justified; ! 115: in both cases, padding is done with blanks. ! 116: The converted number is padded with ! 117: .B 0 ! 118: on the left to at least ! 119: .I f2 ! 120: characters. ! 121: .PP ! 122: The floating point verbs ! 123: .BR f , ! 124: .BR e , ! 125: and ! 126: .B g ! 127: take a double argument. ! 128: No flags apply to floating point conversions. ! 129: .I F1 ! 130: is the minimum field width and, ! 131: if negative, ! 132: means left justified. ! 133: .I F2 ! 134: is the number of digits that are converted after the decimal place. ! 135: The first unconverted digit has suffered decimal rounding. ! 136: The ! 137: .B f ! 138: verb produces output of the form ! 139: .RB [ - ] digits [ .digits\fR]. ! 140: .B e ! 141: conversion appends an exponent ! 142: .BR e [ - ] digits . ! 143: The ! 144: .B g ! 145: verb will output the arg in either ! 146: .B e ! 147: or ! 148: .B f ! 149: with the goal of producing the smallest output. ! 150: .PP ! 151: The ! 152: .B s ! 153: verb copies a string ! 154: (pointer to character) ! 155: to the output. ! 156: The number of characters copied ! 157: .RI ( n ) ! 158: is the minimum ! 159: of the size of the string and ! 160: .IR f2 . ! 161: These ! 162: .I n ! 163: characters are justified within a field of ! 164: .I f1 ! 165: characters as described above. ! 166: .PP ! 167: The ! 168: .B c ! 169: verb copies a single character (int) ! 170: justified within a field of ! 171: .I f1 ! 172: characters as described above. ! 173: .PP ! 174: .I Fmtinstall ! 175: is used to install your own conversions and flags. ! 176: .I Fn ! 177: should be declared as ! 178: .EX ! 179: int fn(o, f1, f2, f3) ! 180: void *o; ! 181: int f1, f2, f3; ! 182: .EE ! 183: .I Fn ! 184: is passed a pointer ! 185: .I o ! 186: to whatever argument appears in ! 187: the list to ! 188: .IR print . ! 189: .I Fn ! 190: should return the size of the argument in bytes so ! 191: .I print ! 192: can skip over it. ! 193: .I F1 ! 194: and ! 195: .I f2 ! 196: are the decoded numbers in the conversion. ! 197: A missing ! 198: .I f1 ! 199: is denoted by the value zero. ! 200: A missing ! 201: .I f2 ! 202: is denoted by a negative number. ! 203: .I F3 ! 204: is the logical or of all the ! 205: flags seen in the conversion. ! 206: If ! 207: .I c ! 208: is a flag, ! 209: .I fn ! 210: should return a negative number ! 211: that is negated and then logically ! 212: .IR or ed ! 213: with any other flags ! 214: and ultimately ! 215: passed to a conversion routine. ! 216: All interpretation of ! 217: .IR f1 , ! 218: .IR f2 , ! 219: and ! 220: .I f3 ! 221: is left up to the conversion routine. ! 222: The standard flags are ! 223: .LR h (2), ! 224: .LR l (1), ! 225: and ! 226: .LR u (4). ! 227: .PP ! 228: .I Sprint ! 229: is designed to be recursive in order to ! 230: help prepare output in custom conversion routines. ! 231: .PP ! 232: The output of any conversion routine must be passed through ! 233: .IR strconv . ! 234: .I S ! 235: is the character string, ! 236: .I f1 ! 237: and ! 238: .I f2 ! 239: have the same meaning as above. ! 240: .PP ! 241: .I Printcol ! 242: indicates the position of the next output character. ! 243: Tabs, backspaces and carriage returns are interpreted appropriately. ! 244: .SH EXAMPLES ! 245: This adds a verb to print complex numbers. ! 246: .EX ! 247: typedef struct { ! 248: double r, i; ! 249: } complex; ! 250: complex x = { 1.5, -2.3 }; ! 251: int Xconv(); ! 252: ! 253: main() ! 254: { ! 255: ! 256: fmtinstall('X', Xconv); ! 257: print("x = %X\en", x); ! 258: } ! 259: ! 260: Xconv(o, f1, f2, f3) ! 261: complex *o; ! 262: { ! 263: char str[50]; ! 264: ! 265: sprint(str, "(%g,%g)", o->r, o->i); ! 266: strconv(str, f1, f2); ! 267: return(sizeof(complex)); ! 268: } ! 269: .EE ! 270: .SH SEE ALSO ! 271: .IR fio (3), ! 272: .IR printf (3) ! 273: .SH BUGS ! 274: There are internal buffers which may overflow silently.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.