C 14
Book.c Guest on 5th October 2020 09:05:42 PM
  1. /*
  2.  *      $Source$
  3.  *      $Author$
  4.  *      $Header$
  5.  */
  6.  
  7. #ifndef lint
  8. static char *rcsid_book_c = "$Header$";
  9. #endif lint
  10.  
  11. #include <stdio.h>
  12. #include <strings.h>
  13. #include <string.h>
  14. #include <sys/types.h>
  15. #include "bible.h"
  16.  
  17. #define MAX_BOOKS_OPEN 10
  18.  
  19. BOOK    booktab[NUMBOOKS];
  20. BOOK    *current_book;
  21.  
  22. BOOK    *open_books[MAX_BOOKS_OPEN];
  23. long    open_book_time;
  24.  
  25. int     bible_debug = 0;        /* It has to be definied somewhere! */
  26.  
  27. /*
  28.  * Initialize the book table, and set things up to begin.
  29.  */
  30. init_booktab()
  31. {
  32.         int     i;
  33.         FILE    *f;
  34.         char    *cp;
  35.         char    *line;
  36.  
  37.         current_book = NULL;
  38.         open_book_time = 0;
  39.         strcpy(tmp, LIBDIR);
  40.         f = fopen(strcat(tmp, BOOKFILE), "r");
  41.         if (!f) {
  42.                 perror(tmp);
  43.                 fprintf(stderr, "Can't open book table.... aborting...\n");
  44.                 exit(1);
  45.         }
  46.         for (i=0; i < NUMBOOKS; i++) {
  47.                 booktab[i].current_pos = -1;    /* Undefined */
  48.                 booktab[i].last_used = -1;      /* Not used */
  49.                 booktab[i].open_idx = -1;
  50.                 cp = fgets(tmp, sizeof(tmp), f);
  51.                 tmp[sizeof(tmp)-1] = '\0';
  52.                 line = strdup(tmp);
  53.                 booktab[i].f = NULL;
  54.                 if (!(cp = strtok(tmp, ":\n")))
  55.                         goto error;
  56.                 booktab[i].num = atoi(cp);
  57.                 if (!(cp = strtok(NULL, ":\n")))
  58.                         goto error;
  59.                 booktab[i].key = strdup(cp);
  60.                 if (!(cp = strtok(NULL, ":\n")))
  61.                         goto error;
  62.                 booktab[i].filename = strdup(cp);
  63.                 if (!(cp = strtok(NULL, ":\n")))
  64.                         goto error;
  65.                 booktab[i].numchap = atoi(cp);
  66.                 if (!(cp = strtok(NULL, ":\n")))
  67.                         goto error;
  68.                 booktab[i].abbrev = strdup(cp);
  69.                 if (!(cp = strtok(NULL, ":\n")))
  70.                         goto error;
  71.                 booktab[i].name = strdup(cp);
  72.                 if (cp = strtok(NULL, "")) {
  73.                         fprintf(stderr, "Extra fields, ignored: \n'%s'\n",
  74.                                 cp);
  75.                 }
  76.                 free(line);
  77.                 continue;
  78.         error:
  79.                 fprintf(stderr, "Parse error in the bible data file:\n");
  80.                 fprintf(stderr, "%s\n", line);
  81.                 free(line);
  82.         }
  83.         fclose(f);
  84.         for (i = 0; i < MAX_BOOKS_OPEN; i++)
  85.                 open_books[i] = NULL;
  86. }
  87.  
  88. close_book(b)
  89.         BOOK    *b;
  90. {
  91.         if (!b || b->open_idx < 0)
  92.                 return;         /* Nothing to close out */
  93.         if (b != open_books[b->open_idx])
  94.                 errout("Assertion failure in close_book");
  95.         if (bible_debug)
  96.                 printf("Closing: %s\n", b->name);
  97.         open_books[b->open_idx] = NULL;
  98.         fclose(b->f);
  99.         b->current_pos = -1;
  100.         b->open_idx = -1;
  101.         b->f = NULL;
  102. }
  103.  
  104. open_book(b)
  105.         BOOK    *b;
  106. {
  107.         int     i;
  108.         int     new_slot;       /* Slot to free up */
  109.         long    last_time;      /* Time last used by above */
  110.        
  111.         if (b->open_idx >= 0) {
  112.                 /*
  113.                  * The book is already open, just update the counters
  114.                  */
  115.                 b->last_used = open_book_time++;
  116.                 b = current_book;
  117.                 return(SUCCESS);
  118.         }
  119.         /*
  120.          * The book isn't open, yet.  Let's open the file descriptors
  121.          * and set things up.
  122.          */
  123.         strcpy(tmp, LIBDIR);
  124.         if (!(b->f = fopen(strcat(tmp, b->filename), "r"))) {
  125.                 perror(tmp);
  126.                 errout("Cannot open book text file!");
  127.         }
  128.         b->current_pos = 0;
  129.         b->last_used = open_book_time++;
  130.         current_book = b;
  131.        
  132.         /*
  133.          * OK, try to find a new slot for this book
  134.          */
  135.         new_slot = 0;
  136.         last_time = open_book_time;
  137.         for (i=0; i < MAX_BOOKS_OPEN; i++) {
  138.                 if (!open_books[i]) {
  139.                         /*
  140.                          * Here's an unused slot; use this one!
  141.                          */
  142.                         open_books[i] = b;
  143.                         b->open_idx = i;
  144.                         return(SUCCESS);
  145.                 } else if (open_books[i]->last_used  < last_time) {
  146.                         new_slot = i;
  147.                         last_time = open_books[i]->last_used;
  148.                 }
  149.         }
  150.         /*
  151.          * OK, new_slot now contains the slot we should use
  152.          * for the newly open book.
  153.          */
  154.         close_book(open_books[new_slot]);
  155.         open_books[new_slot] = b;
  156.         b->open_idx = new_slot;
  157.         return(SUCCESS);
  158. }

Paste is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.