home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / AP / JED / JED097-1.TAR / jed / src / fsplit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  3.4 KB  |  187 lines

  1. /* Splits a large file into smaller ones  --- 
  2.    This file also creates a descriptor file describing what happened. */
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <limits.h>
  7. #ifndef sequent
  8. #include <stdlib.h>
  9. #endif
  10.  
  11. #ifdef VMS
  12. #include <file.h>
  13. #endif
  14.  
  15. #ifdef unix
  16. #include <sys/types.h>
  17. #include <sys/stat.h>
  18. #include <sys/file.h>
  19. #ifdef SYSV
  20. #include <sys/fcntl.h>
  21. #endif
  22. #endif
  23.  
  24. #ifdef msdos
  25. #include <fcntl.h>
  26. #include <io.h>
  27. #include <sys/stat.h>
  28. #endif
  29.  
  30. #include "vfile.h"
  31. void usage(char *prog)
  32. {
  33.    char *str = "[-l max_lines] -f infile -o out_file_fmt -d dsc_name";
  34.    fprintf(stderr, "%s: Usage: %s\n", prog, str);
  35.    exit(1);
  36. }
  37.  
  38. void error(char *fmt, char *str)
  39. {
  40.    fprintf(stderr, fmt, str);
  41.    putc('\n', stderr);
  42.    exit(1);
  43. }
  44.  
  45. #ifndef msdos
  46. #define MAX_LEN 65536
  47. int Max_Lines = 2000;
  48. #else
  49. #define MAX_LEN 4096
  50. int Max_Lines = 1000;
  51. #endif
  52.  
  53. int Quiet = 0;
  54. char *Dsc_File;
  55. char *Split_Fmt;
  56.  
  57. FILE *open_descriptor_file()
  58. {
  59.    FILE *fp; 
  60.    
  61. #ifdef msdos
  62.    _fmode = O_TEXT;
  63. #endif
  64.    if (NULL == (fp = fopen(Dsc_File, "w")))
  65.      {
  66.     error("Unable to create descriptor file %s", Dsc_File);
  67.      }
  68. #ifdef msdos
  69.    _fmode = O_BINARY;
  70. #endif
  71.    return (fp);
  72. }
  73.  
  74. void split(char *file)
  75. {
  76.    VFILE *vp;
  77.    unsigned int total, len;
  78.    register int n = Max_Lines + 1;
  79.    int fp_split = -1, ext = -1;
  80.    char *buf;
  81.    char fsplit[256];
  82.    FILE *fd;
  83.    register int max_low = Max_Lines - 50;
  84.    register int max_hi = Max_Lines + 50;
  85.    register int flag;
  86.    
  87.    if (max_low < 0) max_low = Max_Lines;
  88. #ifdef msdos
  89.    _fmode = O_BINARY;
  90. #endif
  91.    if (NULL == (vp = vopen(file, MAX_LEN)))
  92.      {
  93.     error("Error opening %s\n", file);
  94.      }
  95.    
  96.    fd = open_descriptor_file();
  97.    fprintf(fd, "%s\n%s\n", file, Split_Fmt);
  98.    while (NULL != (buf = vgets(vp, &len)))
  99.      {    
  100.     if ((n >= max_hi) || flag)
  101.       {  
  102.          if (fp_split != -1)
  103.            {
  104.           close(fp_split);
  105.           fprintf(fd, "%s : %d lines\n", fsplit, n);
  106.            }
  107.          sprintf(fsplit, Split_Fmt, ++ext);
  108. #ifdef VMS
  109.          fp_split = open(fsplit, O_WRONLY | O_CREAT | O_TRUNC, 0, "rat=cr", "rfm=var");
  110. #else
  111. #ifdef unix
  112.          fp_split = open(fsplit, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  113. #else
  114.          fp_split = open(fsplit, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  115. #endif
  116. #endif
  117.          if (fp_split < 0)
  118.            {
  119.           error("Error creating %s", fsplit);
  120.            }
  121.          else if (!Quiet)
  122.            {
  123.           fprintf(stderr, "Writing %s\n", fsplit);
  124.            }
  125.          
  126.          n = 0;
  127.       }
  128.     write(fp_split, buf, len);
  129.     flag = 0;
  130.     if ((n > max_low) && (*buf == '}')) flag = 1;
  131.     n++;
  132.      }
  133.    
  134.    if (fp_split != -1)
  135.      {
  136.     close(fp_split);
  137.     fprintf(fd, "%s : %d lines\n", fsplit, n);
  138.      }
  139.    fclose(fd);
  140.    vclose(vp);
  141. }
  142.  
  143.  
  144.  
  145. int main(int argc, char **argv)
  146. {
  147.    char *file = NULL;
  148.    int i;
  149.    
  150.    /* if (argc < 2) usage(argv[0]); */
  151.    
  152.    for (i = 1; i < argc; i++)
  153.      {
  154.     if (!strcmp(argv[i], "-quiet")) Quiet = 1;
  155.     else if (!strcmp(argv[i], "-l"))
  156.       {
  157.          i++;
  158.          if ((i >= argc) || (1 != sscanf(argv[i], "%d", &Max_Lines))) usage(argv[0]);
  159.       }
  160.     else if (!strcmp(argv[i], "-f"))
  161.       {
  162.          i++;
  163.          if (i >= argc) usage(argv[0]);
  164.          file = argv[i];
  165.       }
  166.     else if (!strcmp(argv[i], "-o"))
  167.       {
  168.          i++;
  169.          if (i >= argc) usage(argv[0]);
  170.          Split_Fmt = argv[i];
  171.       }
  172.     else if (!strcmp(argv[i], "-d"))
  173.       {
  174.          i++;
  175.          if (i >= argc) usage(argv[0]);
  176.          Dsc_File = argv[i];
  177.       }
  178.     else usage(argv[0]);
  179.      }
  180.    
  181.    if ((file == NULL) || (Split_Fmt == NULL) || (Dsc_File == NULL)) usage(argv[0]);
  182.    split(file);
  183.    return(0);
  184. }
  185.  
  186.     
  187.