np@ic.ac.uk (Nigel Perry) (10/18/89)
I recently offered enhancements to LSC3 stdio libraries to: * %k and %lk formats for printf() (& Co.) These formats print ints (%k) and longs (%lk) as characters, useful for ResType values. * New 'device' ".SF" for fopen() and friends. The 'device' ".SF" causes fopen() is prompt for a file using the Standard File get (read/append access) or put (write access) dialogs. This saves the user calling Standard File themselves, converting the volRef/name pair to a full pathname, and then calling fopen()... * Added fdopen() and fdreopen() routines. These mimic their Unix counterparts but take a volume reference as well as a name. * Added in asm{...} statements. Doesn't add functionality, just decreases size to offset increase caused by new code... I've had a number of requests, so below are diff's to the files stdopen.c, printf-3.c & stdio.h. I'm also send an archive to sumex containing: new library, new stdio.h, example program and diffs. Enjoy, Nigel. ******************************** Filename: printf-3.c, new file. -------------------------------- Filename: printf-3.c, original file. 7 */ 8 /* 9 Modified by Nigel Perry, May 1989 10 11 Added %k and %lk format to print word/longs as characters 12 Code controlled by #ifdef CHARINT 13 14 ) 1989, Nigel Perry 15 */ 16 17 /* add in %k format */ 18 #define CHARINT 19 -------------------------------- 7 */ 8 22 23 #ifndef _stdioh_ -------------------------------- 11 12 #include "config.h" 13 14 #ifndef _stdioh_ 287 { 288 Boolean left_justify; /* flag to indicate left justification */ 289 Boolean do_precision; /* flag limited precision */ -------------------------------- 278 { 279 Boolean left_justify; /* flag to indicate left justiccation */ 280 Boolean do_precision; /* flag limited precision */ 635 break; 636 #ifdef CHARINT 637 case 'k': 638 { register char *arg_hold; 639 640 length = its_a_long ? sizeof(long) : sizeof(int); 641 arg_hold = argument + length; 642 if (do_precision && length > precision) length = precision; 643 width -= length; 644 645 if(!left_justify) padd(BLANKS, width); 646 while (--length >= 0) 647 (*outputx)(*argument++); 648 if(left_justify) padd(BLANKS, width); 649 650 argument = arg_hold; 651 } 652 break; 653 #endif 654 -------------------------------- 626 break; 627 4 mismatches. ******************************** Filename: stdopen.c, new file. -------------------------------- Filename: stdopen.c, original file. 5 */ 6 /* 7 Modified by Nigel Perry, May 1989 8 9 Added new "driver" name ".SF" which uses the Standard File Package 10 to select a file. 11 12 All .SF code #ifdef'ed by STDFILE 13 14 Added fdopen() and fdreopen() routines to open files given 15 volume reference and name. 16 17 All fdopen() code #ifdef'ed by FDOPEN 18 19 Added inline traps. All asm code #ifdef'ed by USEASM 20 21 ) 1989, Nigel Perry 22 */ 23 24 /* if defined will include new ".SF" "driver" */ 25 #define STDFILE 26 /* if defined will include fdopen() code */ 27 #define FDOPEN 28 /* do trap calls inline */ 29 #define USEASM 30 31 #ifndef _stdioh_ -------------------------------- 5 */ 6 7 #ifndef _stdioh_ 42 43 #ifdef USEASM 44 #include <asm.h> 45 #endif 46 47 #ifdef STDFILE 48 #ifndef _StdFilePkg_ 49 #include <StdFilePkg.h> 50 #endif 51 52 /* "Point" to place dialog */ 53 #define GETWHERE 0x00470052L 54 #define PUTWHERE 0x004f0068L 55 #define NIL (void *)0 56 #define EMPTY ((char *)0xA02) /* low memory global OneOne */ 57 /* used for "" and "\p" */ 58 59 #endif 60 61 static Boolean _exiting_closeall_flag = false; -------------------------------- 18 19 static Boolean _exiting_closeall_flag = false; 66 #line 0 xfopen 67 #ifdef FDOPEN 68 static FILE *xfopen(volref,nameptr,type,who) 69 int volref; 70 #else 71 static FILE *xfopen(nameptr,type,who) 72 #endif 73 char *nameptr; -------------------------------- 24 #line 0 xfopen 25 static FILE *xfopen(nameptr,type,who) 26 char *nameptr; 89 register Ptr p; 90 #ifdef STDFILE 91 SFReply reply; 92 SFTypeList types; 93 Boolean SFdriver = false; 94 #endif 95 #ifdef FDOPEN 96 Boolean FDopen = false; 97 #endif 98 -------------------------------- 42 register Ptr p; 43 157 158 #ifndef STDFILE 159 #ifdef FDOPEN 160 if(volref != 0) 161 FDopen = true; 162 else 163 #endif 164 CtoPstr(nameptr); 165 #else 166 #ifdef FDOPEN 167 if(volref != 0) 168 FDopen = true; 169 else 170 #endif 171 /* I would use *((long *)nameptr) == '.SF\0' if it were aligned... */ 172 if( nameptr[0] == '.' && nameptr[1] == 'S' 173 && nameptr[2] == 'F' && nameptr[3] == '\0' ) 174 { SFdriver = true; 175 if(!create || add) 176 SFGetFile(GETWHERE, EMPTY, NIL, -1, types, NIL, &reply); 177 else 178 SFPutFile(PUTWHERE, EMPTY, EMPTY, NIL, &reply); 179 if(!reply.good) 180 { errno = bdNamErr; 181 return(NULL); 182 } 183 } 184 else 185 CtoPstr(nameptr); 186 #endif 187 188 #ifndef USEASM 189 p = NewPtr((long)BUFSIZ); 190 #else 191 asm 192 { move.l #BUFSIZ,d0 193 _NewPtr 194 movea.l a0,p 195 } 196 #endif 197 198 do { 199 200 #ifdef STDFILE 201 if(!SFdriver) 202 { 203 #endif 204 #ifdef FDOPEN 205 if(!FDopen) 206 { 207 #endif 208 /* pdg 7/29/86 - look only via default path */ 209 pb.ioNamePtr = 0; 210 #ifndef USEASM 211 if (PBGetVol(&pb, false)) pb.ioVRefNum = 0; 212 #else 213 asm 214 { lea pb,a0 215 _PBGetVol 216 beq.s @2 217 clr.w pb.ioVRefNum 218 @2 219 } 220 #endif 221 #ifdef FDOPEN 222 } 223 else 224 pb.ioVRefNum = volref; 225 #endif 226 pb.ioNamePtr = (StringPtr)nameptr; 227 #ifdef STDFILE 228 } 229 else 230 { pb.ioNamePtr = (StringPtr)&reply.fName; 231 pb.ioVRefNum = reply.vRefNum; 232 } 233 #endif 234 pb.ioVersNum = 0; -------------------------------- 102 103 CtoPstr(nameptr); 104 105 p = NewPtr((long)BUFSIZ); 106 107 do { 108 109 /* pdg 7/29/86 - look only via default path */ 110 111 pb.ioNamePtr = 0; 112 if (PBGetVol(&pb, false)) pb.ioVRefNum = 0; 113 114 115 pb.ioNamePtr = (StringPtr)nameptr; 116 pb.ioVersNum = 0; 237 238 #ifndef USEASM 239 new = PBOpen(&pb,false); 240 #else 241 asm 242 { lea pb,a0 243 _PBOpen 244 move.w d0,new 245 } 246 #endif 247 248 if ((new == fnfErr) && (create)) 249 { 250 #ifndef USEASM 251 if (err = (PBCreate(&pb,false))) goto err_exit; 252 #else 253 asm 254 { lea pb,a0 255 _PBCreate 256 bne @err_exit 257 } 258 #endif 259 -------------------------------- 119 120 new = PBOpen(&pb,false); 121 122 if ((new == fnfErr) && (create)) 123 { 124 if (err = (PBCreate(&pb,false))) goto err_exit; 125 263 pb2.ioFVersNum = pb.ioVersNum; 264 #ifndef USEASM 265 if (err = (PBGetFInfo(&pb2,false))) goto err_exit; 266 #else 267 asm 268 { lea pb2,a0 269 _PBGetFInfo 270 bne @err_exit 271 } 272 #endif 273 274 pb2.ioFlFndrInfo.fdType = 'TEXT'; 275 pb2.ioFlFndrInfo.fdCreator = '????'; 276 #ifndef USEASM 277 if (err = (PBSetFInfo(&pb2,false))) goto err_exit; 278 #else 279 asm 280 { lea pb2,a0 281 _PBSetFInfo 282 bne @err_exit 283 } 284 #endif 285 -------------------------------- 129 pb2.ioFVersNum = pb.ioVersNum; 130 if (err = (PBGetFInfo(&pb2,false))) goto err_exit; 131 132 pb2.ioFlFndrInfo.fdType = 'TEXT'; 133 pb2.ioFlFndrInfo.fdCreator = '????'; 134 if (err = (PBSetFInfo(&pb2,false))) goto err_exit; 135 295 { 296 #ifndef USEASM 297 if(err = (PBGetEOF(&pb,false))) goto err_exit; 298 #else 299 asm 300 { lea pb,a0 301 _PBGetEOF 302 bne @err_exit 303 } 304 #endif 305 306 pb.ioPosOffset = (long)pb.ioMisc; 307 pb.ioPosMode = fsFromStart; 308 #ifndef USEASM 309 err = PBSetFPos(&pb,false); 310 if ((err!=noErr) && (err!=eofErr)) goto err_exit; 311 #else 312 asm 313 { lea pb,a0 314 _PBSetFPos 315 beq.s @1 316 cmp.w #eofErr,d0 317 bne @err_exit 318 @1 319 } 320 #endif 321 } -------------------------------- 145 { 146 if(err = (PBGetEOF(&pb,false))) goto err_exit; 147 148 pb.ioPosOffset = (long)pb.ioMisc; 149 pb.ioPosMode = fsFromStart; 150 err = PBSetFPos(&pb,false); 151 if ((err!=noErr) && (err!=eofErr)) goto err_exit; 152 } 328 pb2.ioFVersNum = pb.ioVersNum; 329 #ifndef USEASM 330 if (err = (PBGetFInfo(&pb2,false))) goto err_exit; -------------------------------- 159 pb2.ioFVersNum = pb.ioVersNum; 160 if (err = (PBGetFInfo(&pb2,false))) goto err_exit; 340 new = PBOpen(&pb,false); 341 #else 342 asm 343 { lea pb2,a0 344 _PBGetFInfo 345 bne @err_exit 346 lea pb,a0 347 _PBClose 348 bne @err_exit 349 lea pb,a0 350 _PBDelete 351 bne @err_exit 352 lea pb,a0 353 _PBCreate 354 bne @err_exit 355 lea pb2,a0 356 _PBSetFInfo 357 bne @err_exit 358 lea pb,a0 359 _PBOpen 360 move.l d0,new 361 } 362 #endif 363 create = false; -------------------------------- 170 new = PBOpen(&pb,false); 171 create = false; 387 who->inbuf = 0; 388 #ifdef STDFILE 389 #ifdef FDOPEN 390 if(!SFdriver && !FDopen) 391 #else 392 if(!SFDriver) 393 #endif 394 #else 395 #ifdef FDOPEN 396 if(!FDopen) 397 #endif 398 #endif 399 PtoCstr(nameptr); 400 if (_init_onexit == false) -------------------------------- 195 who->inbuf = 0; 196 PtoCstr(nameptr); 197 if (_init_onexit == false) 425 err_exit: 426 #ifndef USEASM 427 errno = err; 428 #else 429 asm 430 { move.l d0,errno 431 } 432 #endif 433 434 exit_noset: 435 436 #ifndef USEASM 437 DisposPtr(p); 438 #else 439 asm 440 { movea.l p,a0 441 _DisposPtr 442 } 443 #endif 444 445 #ifdef STDFILE 446 #ifdef FDOPEN 447 if(!SFdriver && !FDopen) 448 #else 449 if(!SFdriver) 450 #endif 451 #else 452 #ifdef FDOPEN 453 if(!FDopen) 454 #endif 455 #endif 456 PtoCstr(nameptr); 457 return(NULL); -------------------------------- 222 err_exit: 223 errno = err; 224 225 exit_noset: 226 227 DisposPtr(p); 228 PtoCstr(nameptr); 229 return(NULL); 498 goto err2_exit; 499 pb.ioRefNum = refnum; -------------------------------- 270 goto err2_exit; 271 272 pb.ioRefNum = refnum; 507 508 #ifndef USEASM 509 if (err = who->last_error = PBWrite(&pb,false)) 510 errno = err; 511 #else 512 asm 513 { lea pb,a0 514 _PBWrite 515 move.w d0,err 516 move.w d0,OFFSET(FILE,last_error)(who) 517 beq.s @3 518 move.w d0,errno 519 @3 520 } 521 #endif 522 } 523 524 who->InUse = false; 525 #ifndef USEASM 526 if (err = (PBClose(&pb,false))) /* close file */ 527 goto err2_exit; 528 #else 529 asm 530 { lea pb,a0 531 _PBClose 532 move.w d0,err 533 bne @err2_exit 534 } 535 #endif 536 -------------------------------- 280 281 if (err = who->last_error = PBWrite(&pb,false)) 282 errno = err; 283 } 284 285 who->InUse = false; 286 if (err = (PBClose(&pb,false))) /* close file */ 287 goto err2_exit; 288 540 pb.ioNamePtr = 0L; 541 #ifndef USEASM 542 if (err = (PBFlshVol(&pb,false))) /* flush vol */ 543 goto err2_exit; 544 #else 545 asm 546 { lea pb,a0 547 _PBFlshVol 548 move.w d0,err 549 bne @err2_exit 550 } 551 #endif 552 } -------------------------------- 292 pb.ioNamePtr = 0L; 293 if (err = (PBFlshVol(&pb,false))) /* flush vol */ 294 goto err2_exit; 295 } 569 if (!who->user_buf) 570 #ifndef USEASM 571 DisposPtr(who->filebuf); /* dispose mem*/ 572 #else 573 asm 574 { movea.l OFFSET(FILE,filebuf)(who),a0 575 _DisposPtr 576 } 577 #endif 578 return(0); -------------------------------- 312 if (!who->user_buf) 313 DisposPtr(who->filebuf); /* dispose mem*/ 314 315 return(0); 597 { 598 #ifdef FDOPEN 599 return(xfopen(0,nameptr,type,NULL)); 600 #else 601 return(xfopen(nameptr,type,NULL)); 602 #endif 603 -------------------------------- 334 { 335 return(xfopen(nameptr,type,NULL)); 336 616 if(fclose(who)) return(NULL); 617 #ifdef FDOPEN 618 return(xfopen(0,nameptr,type,who)); 619 #else 620 return(xfopen(nameptr,type,who)); 621 #endif 622 } 623 624 #ifdef FDOPEN 625 #line 0 fdopen 626 FILE *fdopen(volref,nameptr,type) 627 int volref; 628 char *nameptr,*type; 629 { 630 return(xfopen(volref,nameptr,type,NULL)); 631 632 } 633 634 #line 0 fdreopen 635 FILE *fdreopen(volref,nameptr,type,who) 636 int volref; 637 char *nameptr,*type; 638 FILE *who; 639 640 { 641 if(fclose(who)) return(NULL); 642 return(xfopen(volref,nameptr,type,who)); 643 } 644 #endif 645 -------------------------------- 349 if(fclose(who)) return(NULL); 350 return(xfopen(nameptr,type,who)); 351 } 352 353 18 mismatches. ******************************** Filename: stdio.h, new file. -------------------------------- Filename: stdio.h, original file. 7 * (C) Copyright 1985, 1986. THINK Technologies Inc. All rights reserved. 8 * 9 * Added in fdopen() & fdreopen(), Nigel Perry, 1989 10 */ -------------------------------- 7 * (C) Copyright 1985, 1986. THINK Technologies Inc. All rights reserved. 8 */ 72 FILE *freopen(); /* open a file using the given stream */ 73 FILE *fdopen(); /* open a file using volref/name pair */ 74 FILE *fdreopen(); /* open a file using volref/name pair on the given stream */ 75 extern FILE _file[_NFILE]; /* file descriptor array (internal) */ 76 extern FILE _console_; /* device name for the console */ 77 long ftell(); /* get position within file */ 78 -------------------------------- 70 FILE *freopen(); /* open a file using the given stream */ 71 extern FILE _file[_NFILE]; /* file descriptor array (internal) */ 72 extern FILE _console_; /* device name for the console */ 73 long ftell(); /* get position withen file */ 74 2 mismatches. -- --- Nigel Perry Department of Computing Imperial College Janet: np@uk.ac.ic.doc London DARPA: np%uk.ac.ic.doc@ucl-cs SW7 Uucp: np@icdoc.UUCP, ukc!icdoc!np England