home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / VRAC / CUJJUN93.ZIP / 1106113A < prev    next >
Text File  |  1993-03-30  |  2KB  |  83 lines

  1. enum File_state { UNOPENED, BUFFER_ALLOCATED, FILE_OPEN, 
  2. RECORD_READ};
  3. char * File_state_strings[] = {"Unopened", "Buffer allocation", 
  4. "File open", "File reading"};
  5.  
  6. typedef struct 
  7.     {
  8.     enum File_state state;  // Current state of file
  9.     int file_id;    // Id from open
  10.     char *buffer;   // Buffer for read
  11.     } File;
  12.  
  13. int File_initialize(File * file, char *filename, char *purpose);
  14. void File_terminate(File * file);
  15.  
  16. #define SUCCESS 1
  17. #define FAILURE 0
  18.  
  19. main()
  20.     {
  21.     File file;
  22.     int return_code;
  23.     if (File_initialize(&file, "filename", "purpose") == SUCCESS)
  24.         {
  25.         return_code = 0;
  26.         /* Do whatever required */
  27.         }
  28.     else
  29.         return_code = 1;
  30.     File_terminate(&file);
  31.     exit(return_code);
  32.     }
  33.  
  34. int File_initialize(File * file, char *filename, char *purpose)
  35.     {
  36.     int read_count;
  37.     int return_code = FAILURE;
  38.     file->state = UNOPENED;
  39.     if (Buffer_initialize(&file->buffer, BUFSIZ, "file buffer")
  40.         == SUCCESS)
  41.         file->state = BUFFER_ALLOCATED;
  42.     if (file->state == BUFFER_ALLOCATED)
  43.         {
  44.         file->file_id = open(filename, O_RDONLY);
  45.         if (file->file_id >= 0)
  46.  
  47.             file->state = FILE_OPEN;
  48.         }
  49.     if (file->state == FILE_OPEN)
  50.         {
  51.         read_count = read(file->file_id, file->buffer, BUFSIZ);
  52.         if (read_count > 0)
  53.             {
  54.             file->state = RECORD_READ;
  55.             return_code = SUCCESS;
  56.             }
  57.         }
  58.     if (return_code != SUCCESS)
  59.         fprintf(stderr, "Filename %s purpose %s error at %s",
  60.             filename, purpose, File_state_strings[file->state]);
  61.     return return_code;
  62.     }
  63.  
  64. void File_terminate(File * file)
  65.     {
  66.     /*** Maintenance note - fall through required ***/
  67.     switch(file->state)
  68.         {
  69.     case RECORD_READ:
  70.     case FILE_OPEN:
  71.         close(file->file_id);
  72.     case BUFFER_ALLOCATED:
  73.         Buffer_terminate(&file->buffer);
  74.     case UNOPENED:
  75.         break;
  76.     default:
  77.         fprintf("Error in File_terminate -- illegal state");
  78.         }
  79.     return;
  80.     }
  81.  
  82.  
  83.