home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 31 / CDASC_31_1996_juillet_aout.iso / vrac / souper15.zip / SOURCE / AREAS.C next >
C/C++ Source or Header  |  1996-05-18  |  2KB  |  119 lines

  1. /* $Id: areas.c 1.4 1996/05/18 21:06:26 cthuang Exp $
  2.  *
  3.  * SOUP AREAS file management
  4.  */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <signal.h>
  9. #include "souper.h"
  10.  
  11. static FILE *areasF, *aFile;
  12. static char msgFile[FILENAME_MAX];
  13. static int aNumber;
  14. static const char *aName, *aFormat;
  15.  
  16. /* state of AREAS file
  17.  * 0    AREAS file closed
  18.  * 1    AREAS file open
  19.  * 2    .MSG/.IDX file open
  20.  */
  21. static sig_atomic_t state = 0;
  22.  
  23. /* Create AREAS file. */
  24.  
  25. void
  26. openAreas (void)
  27. {
  28.     static char areasFile[] = "AREAS";
  29.  
  30.     if ((areasF = fopen(areasFile, "wb")) == NULL) {
  31.     perror(areasFile);
  32.     exit(EXIT_FAILURE);
  33.     }
  34.     ++state;
  35. }
  36.  
  37. /* Create message file for the group. */
  38.  
  39. FILE *
  40. openMsgFile (int number, const char *name, const char *format)
  41. {
  42.     aNumber = number;
  43.     aName = name;
  44.     aFormat = format;
  45.  
  46.     sprintf(msgFile, "%07d.MSG", number);
  47.     aFile = fopen(msgFile, (number == 0) ? "ab" : "wb");
  48.     ++state;
  49.  
  50.     return aFile;
  51. }
  52.  
  53. /* Close msg file.  If empty, remove it, otherwise add entry to AREAS file. */
  54.  
  55. void
  56. closeMsgFile (void)
  57. {
  58.     long offset;
  59.  
  60.     offset = ftell(aFile);
  61.     fclose(aFile);
  62.     --state;
  63.     if (offset == 0) {
  64.     remove(msgFile);
  65.     } else {
  66.     fprintf(areasF, "%07d\t%s\t%s\n", aNumber, aName, aFormat);
  67.     }
  68. }
  69.  
  70. /* Create index file for the group. */
  71.  
  72. FILE *
  73. openIdxFile (int number, const char *name, const char *format)
  74. {
  75.     aNumber = number;
  76.     aName = name;
  77.     aFormat = format;
  78.  
  79.     sprintf(msgFile, "%07d.IDX", number);
  80.     aFile = fopen(msgFile, "wb");
  81.     ++state;
  82.  
  83.     return aFile;
  84. }
  85.  
  86. /* Close index file.  If empty, remove it, otherwise add entry to AREAS file. */
  87.  
  88. void
  89. closeIdxFile (void)
  90. {
  91.     closeMsgFile();
  92. }
  93.  
  94. /* Close AREAS file. */
  95.  
  96. void
  97. closeAreas (void)
  98. {
  99.     fclose(areasF);
  100.     --state;
  101. }
  102.  
  103. /* Close areas file on signal. */
  104.  
  105. void
  106. closeAreasOnSignal (int sig)
  107. {
  108.     switch (state) {
  109.     case 2:
  110.     closeMsgFile();
  111.     /* FALLTHRU */
  112.     case 1:
  113.     closeAreas();
  114.     writeNewsrc();
  115.     break;
  116.     }
  117.     exit(EXIT_FAILURE);
  118. }
  119.