home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume8 / mdcopy / part01 / mdopen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-11-02  |  3.1 KB  |  173 lines

  1. /*
  2.  * Created 1989 by greg yachuk.  Placed in the public domain.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <malloc.h>
  7. #include <fcntl.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10.  
  11. #include "mdiskio.h"
  12.  
  13. #ifndef    THE_TTY
  14. #ifdef    MSDOS
  15. #define    THE_TTY    "CON"            /* device name of user's keyboard */
  16. #else
  17. #define    THE_TTY    "/dev/tty"        /* device name of user's keyboard */
  18. #endif
  19. #endif
  20.  
  21. /*
  22.  * mdopen -    allocate an mdiskbuf and initialise some values in it.
  23.  *        open the named file, in the requested mode.
  24.  *
  25.  * mode:    "r"    read only
  26.  *        "w"    write/truncate (create)
  27.  *        "a"    write/append (create)
  28.  *        "r+"    read/write (create)
  29.  *        "w+"    read/write/truncate (create)
  30.  *        "a+"    read/write/append (create)
  31.  *
  32.  *    additionally, a "b" or "t" may be appended to specify BINARY
  33.  *    or TEXT mode.  Note:  "ab+" <==> "a+b"
  34.  */
  35. MDFILE *
  36. mdopen(name, mode, fnfilenm, seq)
  37. char   *name;
  38. char   *mode;
  39. char   *(*fnfilenm)();
  40. int    seq;
  41. {
  42.     MDFILE *mdp;
  43.     char   *_mdfilenm();
  44.     int    _mdprompt();
  45.  
  46.     /* allocate the diskbuffer */
  47.  
  48.     if ((mdp = (MDFILE *) calloc(1, sizeof (MDFILE))) == NULL)
  49.         return (NULL);
  50.  
  51.     /* default buffer size of 512 */
  52.  
  53.     mdp->buffer = NULL;
  54.     mdp->bufptr = mdp->buffer + BUFSIZ;
  55.     mdp->basename = name;
  56.  
  57.     /* default filename-generation and prompt routines */
  58.  
  59.     mdp->filenm = (fnfilenm != NULL) ? fnfilenm : _mdfilenm;
  60.     mdp->ateof = mdateof;
  61.     mdp->prompt = _mdprompt;
  62.     mdp->seq = seq;
  63.  
  64.     /* translate mode to bits that `open' expects */
  65.  
  66.     mdp->flags = _MDEMPTY;
  67.     mdp->oflag = 0;
  68.     while (*mode)
  69.     {
  70.         switch (*mode++)
  71.         {
  72.         case 'r':        /* read only, so far */
  73.             mdp->oflag |= O_RDONLY;
  74.             mdp->flags |= _MDREAD;
  75.             break;
  76.         case 'w':        /* write only, so far */
  77.             mdp->oflag |= O_CREAT|O_TRUNC|O_WRONLY;
  78.             mdp->flags |= _MDWRITE;
  79.             break;
  80.         case 'a':        /* append only, so far */
  81.             mdp->oflag |= O_APPEND|O_CREAT|O_WRONLY;
  82.             mdp->flags |= _MDWRITE;
  83.             break;
  84.         case '+':        /* read-write */
  85.             mdp->oflag |= O_RDWR;
  86.             mdp->oflag &= ~(O_WRONLY|O_RDONLY);
  87.             mdp->flags |= _MDRDWR;
  88.             mdp->flags &= ~(_MDWRITE|_MDREAD);
  89.             break;
  90.         case 't':        /* text mode */
  91.             mdp->oflag |= O_TEXT;
  92.             break;
  93.         case 'b':        /* binary mode */
  94.             mdp->oflag |= O_BINARY;
  95.             break;
  96.         }
  97.     }
  98.  
  99.     /* and open up the file */
  100.  
  101.     if (_mdopen(mdp) == -1)
  102.     {
  103.         free(mdp);
  104.         return (NULL);
  105.     }
  106.  
  107.     return (mdp);
  108. }
  109.  
  110. /*
  111.  * _mdfilenm -    stupid default filename generator.
  112.  *        just save the basename and return it.
  113.  */
  114. char   *
  115. _mdfilenm(mdp)
  116. MDFILE *mdp;
  117. {
  118.     mdp->filename = mdp->basename;
  119.     return (mdp->basename);
  120. }
  121.  
  122. /*
  123.  * _mdprompt -    stupid default prompter.  just ask for next diskette.
  124.  */
  125. _mdprompt(mdp)
  126. MDFILE *mdp;
  127. {
  128.     FILE   *tty;
  129.  
  130.     fputs("Insert next diskette and press RETURN...", stderr);
  131.  
  132.     if ((tty = fopen(THE_TTY, "r")) == NULL)
  133.     {
  134.         perror(THE_TTY);
  135.         return (0);
  136.     }
  137.  
  138.     while (getc(tty) != '\n');
  139.     fclose(tty);
  140.     return (1);
  141. }
  142.  
  143. /*
  144.  * md_ateof -    stupid default `at eof' function.  input files
  145.  *        are always at EOF, and output file are never.
  146.  */
  147. mdateof(mdp, mode)
  148. MDFILE *mdp;
  149. int    mode;
  150. {
  151.     return (mode == _MDREAD);
  152. }
  153.  
  154. /*
  155.  * mdalleof -    always at EOF.
  156.  */
  157. mdalleof(mdp, mode)
  158. MDFILE *mdp;
  159. int    mode;
  160. {
  161.     return (1);
  162. }
  163.  
  164. /*
  165.  * mdnoteof -    never at EOF.
  166.  */
  167. mdnoteof(mdp, mode)
  168. MDFILE *mdp;
  169. int    mode;
  170. {
  171.     return (0);
  172. }
  173.