int jolietcmp(const void *va, const void *vb) { int i; Rune s1[256], s2[256], *b1, *b2, *e1, *e2; /*BUG*/ const Direc *a, *b; a = va; b = vb; b1 = strtorune(s1, a->confname); b2 = strtorune(s2, b->confname); if((e1 = runechr(b1, (Rune)'.')) != nil) *e1++ = '\0'; else e1 = emptystring; if((e2 = runechr(b2, (Rune)'.')) != nil) *e2++ = '\0'; else e2 = emptystring; if((i = runecmp(b1, b2)) != 0) return i; return runecmp(e1, e2); }
int isbadjoliet(char *s) { Rune r[256], *p; if(utflen(s) > 64) return 1; for(p=strtorune(r, s); *p; p++) if(isjolietfrog(*p)) return 1; return 0; }
int input(int n) /* get input line and split into fields */ { int c, i, len; char *line; Rune *bp; Rune **pp; bp = buf[n]; pp = ppi[n]; line = Brdline(f[n], '\n'); if (line == nil) return(0); len = Blinelen(f[n]) - 1; c = line[len]; line[len] = '\0'; strtorune(bp, line); line[len] = c; /* restore delimiter */ if (c != '\n') discard++; i = 0; do { i++; if (sep1 == ' ') /* strip multiples */ while ((c = *bp) == sep1 || c == sep2) bp++; /* skip blanks */ *pp++ = bp; /* record beginning */ while ((c = *bp) != sep1 && c != sep2 && c != '\0') bp++; *bp++ = '\0'; /* mark end by overwriting blank */ } while (c != '\0' && i < NFLD-1); *pp = 0; return(i); }
void main(int argc, char **argv) { int i; int64_t off1, off2; bin = &binbuf; bout = &boutbuf; Binit(bin, 0, OREAD); Binit(bout, 1, OWRITE); argv0 = argv[0]; while (argc > 1 && argv[1][0] == '-') { if (argv[1][1] == '\0') break; switch (argv[1][1]) { case '-': argc--; argv++; goto proceed; case 'a': switch(*getoptarg(&argc, &argv)) { case '1': a1++; break; case '2': a2++; break; default: sysfatal("incomplete option -a"); } break; case 'e': strtorune(null, getoptarg(&argc, &argv)); break; case 't': sepstr=getoptarg(&argc, &argv); chartorune(&sep1, sepstr); sep2 = sep1; break; case 'o': if(argv[1][2]!=0 || (argc>2 && strchr(argv[2],',')!=0)) oparse(getoptarg(&argc, &argv)); else for (no = 0; no<2*NFLD && argc>2; no++){ if (argv[2][0] == '1' && argv[2][1] == '.') { olistf[no] = F1; olist[no] = atoi(&argv[2][2]); } else if (argv[2][0] == '2' && argv[2][1] == '.') { olist[no] = atoi(&argv[2][2]); olistf[no] = F2; } else if (argv[2][0] == '0') olistf[no] = F0; else break; argc--; argv++; } break; case 'j': if(argc <= 2) break; if (argv[1][2] == '1') j1 = atoi(argv[2]); else if (argv[1][2] == '2') j2 = atoi(argv[2]); else j1 = j2 = atoi(argv[2]); argc--; argv++; break; case '1': j1 = atoi(getoptarg(&argc, &argv)); break; case '2': j2 = atoi(getoptarg(&argc, &argv)); break; } argc--; argv++; } proceed: for (i = 0; i < no; i++) if (olist[i]-- > NFLD) /* 0 origin */ sysfatal("field number too big in -o"); if (argc != 3) { fprint(2, "usage: join [-1 x -2 y] [-o list] file1 file2\n"); exits("usage"); } if (j1 < 1 || j2 < 1) sysfatal("invalid field indices"); j1--; j2--; /* everyone else believes in 0 origin */ if (strcmp(argv[1], "-") == 0) f[F1] = bin; else if ((f[F1] = Bopen(argv[1], OREAD)) == 0) sysfatal("can't open %s: %r", argv[1]); if(strcmp(argv[2], "-") == 0) f[F2] = bin; else if ((f[F2] = Bopen(argv[2], OREAD)) == 0) sysfatal("can't open %s: %r", argv[2]); off1 = Boffset(f[F1]); off2 = Boffset(f[F2]); if(Bseek(f[F2], 0, 2) >= 0){ Bseek(f[F2], off2, 0); join(F2); }else if(Bseek(f[F1], 0, 2) >= 0){ Bseek(f[F1], off1, 0); Bseek(f[F2], off2, 0); join(F1); }else sysfatal("neither file is randomly accessible"); if (discard) sysfatal("some input line was truncated"); exits(""); }