1: #ifdef LIBC_SCCS 2: <@(#)doprnt.s 5.4 (Berkeley) 1/25/87\0> 3: .even 4: #endif LIBC_SCCS 5: 6: /* 7: * doprnt(fmt, argl, iop) 8: * char *fmt, *argl; 9: * FILE *iop; 10: * 11: * Output argl to iop using fmt - implements printf, etc. Special version of 12: * doprnt for csh which doesn't need any floating point support. 13: */ 14: 15: .data 16: nulstr: 17: <(null)\0> 18: .even 19: swtab: 20: decimal; 'd 21: octal; 'o 22: hex; 'x 23: charac; 'c 24: string; 's 25: longorunsg; 'l 26: longorunsg; 'L 27: unsigned; 'u 28: remote; 'r 29: long; 'D 30: loct; 'O 31: lhex; 'X 32: lunsigned; 'U 33: 0; 0 34: .text 35: 36: .globl __strout, csv, cret 37: 38: width = -10. 39: formp = -12. 40: rjust = -14. 41: ndfnd = -16. 42: ndigit = -18. 43: zfill = -20. 44: 45: .globl __doprnt 46: __doprnt: 47: jsr r5,csv 48: sub $128.+12.,sp 49: mov 4(r5),formp(r5) / format 50: mov 6(r5),r4 51: loop: 52: mov sp,r3 53: mov formp(r5),r1 54: 2: 55: movb (r1)+,r2 56: beq 2f 57: cmp r2,$'% 58: beq 2f 59: movb r2,(r3)+ 60: br 2b 61: 2: 62: mov r1,formp(r5) 63: cmp r3,sp 64: beq 2f 65: mov sp,r0 66: mov 8(r5),-(sp) 67: clr -(sp) 68: mov r0,-(sp) / string 69: mov r3,-(sp) / count 70: sub r0,(sp) 71: jsr pc,__strout 72: add $8,sp 73: 2: 74: tst r2 75: bne 2f 76: jmp cret 77: 2: 78: mov sp,r3 79: 2: 80: clr rjust(r5) 81: clr ndigit(r5) 82: mov $' ,zfill(r5) 83: cmpb *formp(r5),$'- 84: bne 2f 85: inc formp(r5) 86: inc rjust(r5) 87: 2: 88: cmpb *formp(r5),$'0 89: bne 2f 90: mov $'0,zfill(r5) 91: 2: 92: jsr r3,gnum 93: mov r1,width(r5) 94: clr ndfnd(r5) 95: cmp r0,$'. 96: bne 1f 97: jsr r3,gnum 98: mov r1,ndigit(r5) 99: 1: 100: mov $swtab,r1 101: 1: 102: mov (r1)+,r2 103: bne 2f 104: movb r0,(r3)+ 105: jmp prbuf 106: 2: 107: cmp r0,(r1)+ 108: bne 1b 109: jmp (r2) 110: 111: longorunsg: 112: movb *formp(r5),r0 113: inc formp(r5) 114: cmp r0,$'o 115: beq loct 116: cmp r0,$'x 117: beq lhex 118: cmp r0,$'d 119: beq long 120: cmp r0,$'u 121: beq lunsigned 122: dec formp(r5) 123: br unsigned 124: 125: octal: 126: clr r0 127: br 1f 128: loct: 129: mov (r4)+,r0 130: 1: 131: mov $8.,r2 132: br 2f 133: 134: hex: 135: clr r0 136: br 1f 137: 138: lhex: 139: mov (r4)+,r0 140: 1: 141: mov $16.,r2 142: 2: 143: mov (r4)+,r1 144: br compute 145: 146: decimal: 147: mov (r4)+,r1 148: sxt r0 149: bmi 3f 150: br 2f 151: 152: unsigned: 153: clr r0 154: br 1f 155: 156: long: 157: mov (r4)+,r0 158: bge 1f 159: mov (r4)+,r1 160: 3: 161: neg r0 162: neg r1 163: sbc r0 164: movb $'-,(r3)+ 165: br 2f 166: 167: lunsigned: 168: mov (r4)+,r0 169: 1: 170: mov (r4)+,r1 171: 2: 172: mov $10.,r2 173: 174: /* 175: * Algorithm courtesy Keith Davis 176: */ 177: compute: 178: mov r5,-(sp) 179: mov r4,-(sp) 180: mov r0,r4 181: mov ndigit(r5),r0 182: mov r1,r5 183: ashc $0,r4 184: beq 1f 185: tst r0 186: beq 1f 187: movb $'0,(r3)+ 188: 1: 189: jsr pc,1f 190: mov (sp)+,r4 191: mov (sp)+,r5 192: br prbuf 193: 194: 1: 195: clr r0 196: mov r4,r1 197: beq 2f 198: div r2,r0 199: mov r0,r4 200: mov r1,r0 201: 2: 202: mov r5,r1 203: asl r2 204: div r2,r0 205: asr r2 206: asl r0 207: cmp r2,r1 208: bgt 2f 209: sub r2,r1 210: inc r0 211: 2: 212: mov r1,-(sp) 213: mov r0,r5 214: bne 2f 215: tst r4 216: beq 1f 217: 2: 218: jsr pc,1b 219: 1: 220: mov (sp)+,r0 221: add $'0,r0 222: cmp r0,$'9 223: ble 1f 224: add $'a-'0-10.,r0 225: 1: 226: movb r0,(r3)+ 227: rts pc 228: 229: charac: 230: mov $' ,zfill(r5) 231: mov (r4)+,r0 232: bic $!377,r0 233: beq prbuf 234: movb r0,(r3)+ 235: br prbuf 236: 237: string: 238: mov $' ,zfill(r5) 239: mov ndigit(r5),r1 240: mov (r4),r2 241: mov r2,r3 242: bne 1f 243: mov $nulstr,r2 244: mov r2,r3 245: mov r2,(r4) 246: 1: 247: tstb (r2)+ 248: beq 1f 249: inc r3 250: sob r1,1b 251: 1: 252: mov (r4)+,r2 253: br prstr 254: 255: remote: 256: mov (r4)+,r4 257: mov (r4)+,formp(r5) 258: jmp loop 259: 260: prbuf: 261: mov sp,r2 262: prstr: 263: sub r2,r3 264: mov width(r5),r1 265: sub r3,r1 266: bge 1f 267: clr r1 268: 1: 269: tst rjust(r5) 270: bne 1f 271: neg r1 272: 1: 273: mov zfill(r5),-(sp) 274: mov 8(r5),-(sp) 275: mov r1,-(sp) 276: mov r2,-(sp) / string 277: mov r3,-(sp) / count 278: jsr pc,__strout 279: add $10.,sp 280: jmp loop 281: 282: gnum: 283: clr ndfnd(r5) 284: clr r1 285: 1: 286: movb *formp(r5),r0 287: inc formp(r5) 288: sub $'0,r0 289: cmp r0,$'*-'0 290: bne 2f 291: mov (r4)+,r0 292: br 3f 293: 2: 294: cmp r0,$9. 295: bhi 1f 296: 3: 297: inc ndfnd(r5) 298: mul $10.,r1 299: add r0,r1 300: br 1b 301: 1: 302: add $'0,r0 303: rts r3