/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */ /* All Rights Reserved */ /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */ /* UNIX System Laboratories, Inc. */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */ /* Portions Copyright (c) 1988, Sun Microsystems, Inc. */ /* All Rights Reserved. */ /* #ident "@(#)split:split.c 1.6.1.2" */ #ident "$Header: /proj/irix6.5.7m/isms/eoe/cmd/split/RCS/split.c,v 1.7 1998/08/03 15:42:23 morimoto Exp $" #include #include #include #include #include #include #include unsigned count = 1000; /* default # of lines in each output file */ int suffix_length = 2; /* default suffix length */ int nbytes; /* bytes in each output file if -b is specified*/ int setlines = 0; int setbytes = 0; /* default split a file according to line # */ int fnumber; /* actual # of output file */ char fname[100]; /* name of output file */ char head[1024]; /* output file directory */ char *ifil; /* input filename */ char *ofil; /* output full filename */ char *tail; /* output file basename */ char *last; FILE *is; /* input file stream */ FILE *os; /* output file stream */ int *base; main(argc, argv) char *argv[]; { register i, j, c, f; int iflg = 0; struct statvfs64 stbuf; int maxfile; int delimit = 0; (void)setlocale(LC_ALL, ""); (void)setcat("uxdfm"); (void)setlabel("UX:split"); for (argc--, argv++; argc > 0; argc--, argv++) if(**argv == '-' && delimit == 0){ if(argv[0][1] == '-') delimit = 1; else if(isdigit(argv[0][1])) count = atoi(argv[0]+1); else switch(argv[0][1]){ case '\0': iflg = 1; break; case 'a': if(argv[0][2] == '\0'){ argc--; argv++; suffix_length = atoi(*argv); } else suffix_length = atoi(argv[0]+2); if(suffix_length <= 0){ pfmt(stderr, MM_ERROR, ":2:Incorrect usage\n"); pfmt(stderr, MM_ERROR, ":65:suffix_length should be positive.\n"); exit(1); } break; case 'l': if(setbytes == 1){ pfmt(stderr, MM_ERROR, ":2:Incorrect usage\n"); pfmt(stderr, MM_ERROR, ":67:-b and -l shouldn't be used together.\n"); exit(1); } setlines = 1; if(argv[0][2] == '\0'){ argc--; argv++; count = atoi(*argv); } else count = atoi(argv[0]+2); break; case 'b': if(setlines == 1){ pfmt(stderr, MM_ERROR, ":2:Incorrect usage\n"); pfmt(stderr, MM_ERROR, ":67:-b and -l shouldn't be used together.\n"); exit(1); } setbytes = 1; if(argv[0][2] == '\0'){ argc--; argv++; nbytes = atoi(*argv); } else nbytes = atoi(argv[0]+2); if(nbytes <= 0){ pfmt(stderr, MM_ERROR, ":2:Incorrect usage\n"); pfmt(stderr, MM_ERROR, ":68:Number of bytes should be positive.\n"); exit(1); } if(argv[0][strlen(argv[0])-1] == 'k') nbytes *= 1024; else if (argv[0][strlen(argv[0])-1] == 'm') nbytes *= 1048576; else if (!isdigit(argv[0][strlen(argv[0])-1])) usage(); break; default: usage(); } if(count <= 0){ pfmt(stderr, MM_ERROR, ":2:Incorrect usage\n"); pfmt(stderr, MM_ERROR, ":66:line_count should be positive.\n"); exit(1); } } else if(iflg) /* process input and output filename */ ofil = *argv; else { ifil = *argv; iflg = 2; } /* finish command line processing */ if(iflg != 2) is = stdin; else if((is=fopen(ifil,"r")) == NULL) { pfmt(stderr, MM_ERROR, ":3:Cannot open %s: %s\n", ifil, strerror(errno)); exit(1); } if(ofil == 0) ofil = "x"; else { if ((tail = strrchr(ofil, '/')) == NULL) { tail = ofil; getcwd(head, sizeof(head)); } else { tail++; strcpy(head, ofil); last = strrchr(head, '/'); *++last = '\0'; } if (statvfs64(head, &stbuf) < 0) { pfmt(stderr, MM_ERROR, ":56:%s: %s\n", head, strerror(errno)); exit(1); } if (strlen(tail) > (stbuf.f_namemax-suffix_length) ) { pfmt(stderr, MM_ERROR, ":57:More than %d characters in output file name\n", stbuf.f_namemax-suffix_length); exit(1); } } if((base = (int *)malloc(suffix_length * sizeof(int))) == NULL){ pfmt(stderr, MM_ERROR, ":69:Cannot allocate enough memory.\n"); exit(1); } base[0] = 1; for (i=1; i=0; j--){ fname[f++] = temp/base[j] + 'a'; temp %= base[j]; } fname[f] = '\0'; if(++fnumber > maxfile) { pfmt(stderr, MM_ERROR, ":58:More output files needed, aborting split\n"); exit(1); } if((os=fopen(fname,"w")) == NULL) { pfmt(stderr, MM_ERROR, ":12:Cannot create %s: %s\n", fname, strerror(errno)); exit(1); } f = 0; } putc(c, os); } while(c != '\n'); else /* set bytes limit */ for(i=0; i=0; j--){ fname[f++] = temp/base[j] + 'a'; temp %= base[j]; } fname[f] = '\0'; if(++fnumber > maxfile) { pfmt(stderr, MM_ERROR, ":58:More output files needed, aborting split\n"); exit(1); } if((os=fopen(fname,"w")) == NULL) { pfmt(stderr, MM_ERROR, ":12:Cannot create %s: %s\n", fname, strerror(errno)); exit(1); } f = 0; } putc(c, os); } fclose(os); } } usage() { pfmt(stderr, MM_ERROR, ":2:Incorrect usage\n"); pfmt(stderr, MM_ACTION, ":55:Usage: split [-l line_count][-a suffix_length][file[name]]\nor\nsplit -b n[k|m][-a suffix_length][file[name]]\n"); exit(1); }