equal
deleted
inserted
replaced
22 All Rights Reserved |
22 All Rights Reserved |
23 |
23 |
24 This class provides access to the operating systems underlying file |
24 This class provides access to the operating systems underlying file |
25 system (i.e. its an interface to the stdio library). |
25 system (i.e. its an interface to the stdio library). |
26 |
26 |
27 $Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.11 1994-05-17 10:07:32 claus Exp $ |
27 $Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.12 1994-06-02 11:20:21 claus Exp $ |
28 '! |
28 '! |
29 |
29 |
30 %{ |
30 %{ |
31 #include <stdio.h> |
31 #include <stdio.h> |
32 #include <errno.h> |
32 #include <errno.h> |
291 |
291 |
292 |retVal| |
292 |retVal| |
293 %{ |
293 %{ |
294 FILE *f; |
294 FILE *f; |
295 OBJ path; |
295 OBJ path; |
296 extern OBJ ErrorNumber, Filename; |
296 extern OBJ Filename; |
297 extern errno; |
297 extern errno; |
298 |
298 |
299 if (_INST(filePointer) == nil) { |
299 if (_INST(filePointer) == nil) { |
300 path = _INST(pathName); |
300 path = _INST(pathName); |
301 if (path != nil |
301 if (path != nil |
311 |
311 |
312 f = (FILE *) fopen((char *) _stringVal(path), (char *) _stringVal(openmode)); |
312 f = (FILE *) fopen((char *) _stringVal(path), (char *) _stringVal(openmode)); |
313 #endif |
313 #endif |
314 } while ((f == NULL) && (errno == EINTR)); |
314 } while ((f == NULL) && (errno == EINTR)); |
315 if (f == NULL) { |
315 if (f == NULL) { |
316 ErrorNumber = _MKSMALLINT(errno); |
316 ExternalStream_LastErrorNumber = _MKSMALLINT(errno); |
317 _INST(position) = nil; |
317 _INST(position) = nil; |
318 } else { |
318 } else { |
319 _INST(filePointer) = MKOBJ((int)f); |
319 _INST(filePointer) = MKOBJ((int)f); |
320 _INST(position) = _MKSMALLINT(1); |
320 _INST(position) = _MKSMALLINT(1); |
321 retVal = self; |
321 retVal = self; |
422 #else |
422 #else |
423 FILE *f; |
423 FILE *f; |
424 struct stat buf; |
424 struct stat buf; |
425 int ret; |
425 int ret; |
426 extern errno; |
426 extern errno; |
427 extern OBJ ErrorNumber; |
|
428 int fd; |
427 int fd; |
429 |
428 |
430 if (_INST(filePointer) != nil) { |
429 if (_INST(filePointer) != nil) { |
431 f = (FILE *)MKFD(_INST(filePointer)); |
430 f = (FILE *)MKFD(_INST(filePointer)); |
432 fd = fileno(f); |
431 fd = fileno(f); |
434 ret = fstat(fd, &buf); |
433 ret = fstat(fd, &buf); |
435 } while ((ret < 0) && (errno == EINTR)); |
434 } while ((ret < 0) && (errno == EINTR)); |
436 if (ret >= 0) { |
435 if (ret >= 0) { |
437 RETURN ( _MKSMALLINT(buf.st_size) ); |
436 RETURN ( _MKSMALLINT(buf.st_size) ); |
438 } |
437 } |
439 ErrorNumber = _MKSMALLINT(errno); |
438 ExternalStream_LastErrorNumber = _MKSMALLINT(errno); |
440 } |
439 } |
441 #endif |
440 #endif |
442 %} |
441 %} |
443 . |
442 . |
444 "could add a fall-back here: |
443 "could add a fall-back here: |
460 %{ /* NOCONTEXT */ |
459 %{ /* NOCONTEXT */ |
461 |
460 |
462 FILE *f; |
461 FILE *f; |
463 long currentPosition; |
462 long currentPosition; |
464 extern errno; |
463 extern errno; |
465 extern OBJ ErrorNumber; |
|
466 |
464 |
467 if (_INST(filePointer) != nil) { |
465 if (_INST(filePointer) != nil) { |
468 f = (FILE *)MKFD(_INST(filePointer)); |
466 f = (FILE *)MKFD(_INST(filePointer)); |
469 do { |
467 do { |
470 if (_INST(buffered) == true) { |
468 if (_INST(buffered) == true) { |
477 /* |
475 /* |
478 * notice: Smalltalk index starts at 1 |
476 * notice: Smalltalk index starts at 1 |
479 */ |
477 */ |
480 RETURN ( _MKSMALLINT(currentPosition + 1) ); |
478 RETURN ( _MKSMALLINT(currentPosition + 1) ); |
481 } |
479 } |
482 ErrorNumber = _MKSMALLINT(errno); |
480 ExternalStream_LastErrorNumber = _MKSMALLINT(errno); |
483 } |
481 } |
484 %} |
482 %} |
485 . |
483 . |
486 filePointer isNil ifTrue:[^ self errorNotOpen]. |
484 filePointer isNil ifTrue:[^ self errorNotOpen]. |
487 ^ self primitiveFailed |
485 ^ self primitiveFailed |
492 |
490 |
493 %{ /* NOCONTEXT */ |
491 %{ /* NOCONTEXT */ |
494 |
492 |
495 FILE *f; |
493 FILE *f; |
496 int ret; |
494 int ret; |
497 extern OBJ ErrorNumber; |
|
498 extern errno; |
495 extern errno; |
499 |
496 |
500 if (_INST(filePointer) != nil) { |
497 if (_INST(filePointer) != nil) { |
501 if (_isSmallInteger(newPos)) { |
498 if (_isSmallInteger(newPos)) { |
502 f = (FILE *)MKFD(_INST(filePointer)); |
499 f = (FILE *)MKFD(_INST(filePointer)); |
516 * just to make certain ... |
513 * just to make certain ... |
517 */ |
514 */ |
518 _INST(hitEOF) = false; |
515 _INST(hitEOF) = false; |
519 RETURN ( self ); |
516 RETURN ( self ); |
520 } |
517 } |
521 ErrorNumber = _MKSMALLINT(errno); |
518 ExternalStream_LastErrorNumber = _MKSMALLINT(errno); |
522 } |
519 } |
523 } |
520 } |
524 %} |
521 %} |
525 . |
522 . |
526 filePointer isNil ifTrue:[^ self errorNotOpen]. |
523 filePointer isNil ifTrue:[^ self errorNotOpen]. |
531 "set the read/write position in the file to be at the end of the file" |
528 "set the read/write position in the file to be at the end of the file" |
532 |
529 |
533 %{ |
530 %{ |
534 FILE *f; |
531 FILE *f; |
535 int ret; |
532 int ret; |
536 extern OBJ ErrorNumber; |
|
537 extern errno; |
533 extern errno; |
538 |
534 |
539 if (_INST(filePointer) != nil) { |
535 if (_INST(filePointer) != nil) { |
540 f = (FILE *)MKFD(_INST(filePointer)); |
536 f = (FILE *)MKFD(_INST(filePointer)); |
541 _INST(position) = nil; |
537 _INST(position) = nil; |
547 } |
543 } |
548 } while ((ret < 0) && (errno == EINTR)); |
544 } while ((ret < 0) && (errno == EINTR)); |
549 if (ret >= 0) { |
545 if (ret >= 0) { |
550 RETURN ( self ); |
546 RETURN ( self ); |
551 } |
547 } |
552 ErrorNumber = _MKSMALLINT(errno); |
548 ExternalStream_LastErrorNumber = _MKSMALLINT(errno); |
553 } |
549 } |
554 %} |
550 %} |
555 . |
551 . |
556 filePointer isNil ifTrue:[^ self errorNotOpen]. |
552 filePointer isNil ifTrue:[^ self errorNotOpen]. |
557 DemoMode ifTrue:[^ self warn:'no save in Demo mode']. |
553 DemoMode ifTrue:[^ self warn:'no save in Demo mode']. |