iodisk.c
上传用户:tsjrly
上传日期:2021-02-19
资源大小:107k
文件大小:3k
源码类别:

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               iodisk
  5. *
  6. * FUNCTION
  7. *               16-bit disk i/o
  8. * SYNOPSIS
  9. *               function iodisk(mode, lun, fname, nrec, iar, size)
  10. *
  11. *   formal 
  12. *
  13. *                       data    I/O
  14. *       name            type    type    function
  15. *       -------------------------------------------------------------------
  16. * mode int i defines operation
  17. * -1 = close file
  18. *  1 = read
  19. *  2 = write
  20. *  3 = open for read
  21. *  4 = open for write
  22. * lun int i logical unit number
  23. * fname char i file name       
  24. * nrec int i/o direct access record pointer
  25. * (auto increment)
  26. * iar short i/o i/o data record
  27. * size int i record size
  28. * iodisk int fun status
  29. *  -1 => illegal input
  30. *   0 => open/close OK
  31. * size=> read/write OK
  32. ***************************************************************************
  33. *
  34. * DESCRIPTION
  35. *
  36. * Uses the UNIX System's Low Level I/O routines (open, 
  37. * close, read and write).
  38. *
  39. ***************************************************************************
  40. *
  41. * CALLED BY
  42. *
  43. * celp
  44. *
  45. * CALLS
  46. *
  47. **************************************************************************/
  48. #include <stdio.h>
  49. #include <sys/file.h>
  50. iodisk(mode, lun, fname, nrec, iar, size)
  51. int mode, *lun, *nrec, size;
  52. short *iar;
  53. char fname[];
  54. {
  55.   int i;
  56.   if ((mode == 1 || mode == 2) && *nrec < 0)
  57.   {
  58.     printf("iodisk: Bad direct access record number %dn", *nrec);
  59.     return(-1);
  60.   }
  61.   switch (mode)
  62.   {
  63.     case 1:  /* *read file */
  64.       (*nrec)++; /* *Warning, read errors*/
  65.       if ((i = read(*lun, iar, size*2)) == EOF) /* *aren't reported */
  66.         return(i); /* *except no. of items */
  67.       return(i/2); /* *read is returned */
  68.       
  69.     case 2: /* *write file */
  70.       (*nrec)++;
  71.       if ((i = write(*lun, iar, size*2)) == EOF)
  72.       {
  73.         printf("iodisk: Error writing output file %sn", fname);
  74.         return(i);
  75.       }
  76.       return(i/2);
  77.     case 3: /* *open file for read */
  78.       if ((*lun = open(fname, O_RDONLY, 0644)) == NULL)
  79.       {
  80.         printf("iodisk: Error opening input file %sn", fname);
  81.         return(-1);
  82.       }
  83.       return(0);
  84.     case 4: /* *open file for write */
  85.       if ((*lun = open(fname,O_WRONLY|O_CREAT|O_TRUNC, 0644)) == NULL)
  86.       {
  87.         printf("iodisk: Error opening output file %sn", fname);
  88.         return(-1);
  89.       }
  90.       return(0);
  91.     case -1: /* *close file */
  92.       if (close(*lun) == EOF)
  93.       {
  94.         printf("iodisk: Error closing file %sn", fname);
  95.         return(-1);
  96.       }
  97.       return(0);
  98.     default: /* *illegal mode */
  99.       printf("iodisk: Illegal mode %dn", mode);
  100.       return(-1);
  101.   }
  102. }