--- sbase-adding-tar-2.diff 2013-07-12 19:50:18.000000000 +0200 +++ sbase-adding-tar-3.diff 2013-07-12 20:36:39.000000000 +0200 @@ -113,13 +113,15 @@ +main(int argc, char *argv[]) +{ + char *file, *dir, *ap; -+ int flg['y'] = {0}; ++ char mode = '\0'; + + ARGBEGIN { + case 'x': + case 'c': + case 't': -+ flg[(unsigned)ARGC()] = 1; ++ if(mode) ++ usage(); ++ mode = ARGC(); + break; + case 'C': + dir = EARGF(usage()); @@ -131,61 +133,56 @@ + usage(); + } ARGEND; + -+ if(flg['x'] + flg['c'] + flg['t'] > 1) -+ usage(); -+ if(flg['x'] + flg['c'] + flg['t']) -+ goto Action; -+ -+ if(argc < 1) -+ usage(); ++ if(!mode) { ++ if(argc < 1) ++ usage(); + -+ for(ap = argv[0]; *ap; ap++) { -+ switch(*ap){ -+ case 'x': -+ case 'c': -+ case 't': -+ flg[(unsigned)*ap] = 1; -+ break; -+ case 'f': -+ if(argc < 2) -+ usage(); -+ argc--, argv++; -+ file = argv[0]; -+ break; -+ case 'C': -+ if(argc < 2) ++ for(ap = argv[0]; *ap; ap++) { ++ switch(*ap) { ++ case 'x': ++ case 'c': ++ case 't': ++ if(mode) ++ usage(); ++ mode = *ap; ++ break; ++ case 'f': ++ if(argc < 2) ++ usage(); ++ argc--, argv++; ++ file = argv[0]; ++ break; ++ case 'C': ++ if(argc < 2) ++ usage(); ++ argc--, argv++; ++ dir = argv[0]; ++ break; ++ default: + usage(); -+ argc--, argv++; -+ dir = argv[0]; -+ break; -+ default: -+ usage(); ++ } + } ++ argc--, argv++; + } -+ argc--, argv++; -+ if(flg['x']+ flg['c']+ flg['t'] != 1) ++ ++ if(!mode || (argc != (mode == 'c'))) + usage(); + -+Action: + if(file) { -+ tarfile = fopen(file, flg['c'] ? "wb" : "rb"); ++ tarfile = fopen(file, (mode == 'c') ? "wb" : "rb"); + if(!tarfile) + eprintf("tar: open '%s':", file); + } else { -+ tarfile = flg['c'] ? stdout : stdin; ++ tarfile = (mode == 'c') ? stdout : stdin; + } + + if(dir) + chdir(dir); + -+ if(flg['c']){ -+ if(argc != 1) -+ usage(); ++ if(mode == 'c') { + c(argv[0]); -+ } else if (flg['x'] || flg['t']){ -+ if(argc != 0) -+ usage(); -+ xt(flg['x'] ? unarchive : print); ++ } else { ++ xt(mode == 'x' ? unarchive : print); + } + + return 0;