/* $Header$ */ #include #include #include struct user { int users_id; char first[33]; char last[33]; int status; }; extern int errno; int debug; char *program; main(argc, argv) int argc; char **argv; { char buf[1024], first[33], last[33]; int i; char *inputfile; FILE *in; struct user *u; struct user users[32]; struct user *get_user(); program = argv[0]; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-d")) debug++; else if (!strcmp(argv[i], "-D")) setenv("ING_SET", "set printqry"); else if (argv[i][0] == '-') usage(argv); else if (inputfile != NULL) usage(argv); else inputfile = argv[i]; } if (inputfile) { in = fopen(inputfile, "r"); if (in == NULL) { com_err(program, errno, "opening file \"%s\" for input", inputfile); exit(1); } } else in = stdin; ## ingres sms i = 0; while (!feof(in)) { fgets(buf, sizeof(buf), in); u = get_user(buf); if (!u) continue; if (strcmp(u->last, users[0].last) || strcmp(u->first, users[0].first)) { /* We've got a matching group! */ process_users(users, i); bcopy(u, &(users[0]), sizeof(*u)); i = 1; } else { bcopy(u, &(users[i]), sizeof(*u)); i++; } } } usage(argv) char **argv; { fprintf(stderr, "Usage: %s [-w] [-D]\n", argv[0]); exit(1); } struct user *get_user(buf) char *buf; { static struct user u; if (sscanf(buf, "| %d|%s |%s | %d|", &u.users_id, u.first, u.last, &u.status) != 4) { com_err(program, 0, " parsing input line %s", buf); return(NULL); } return(&u); } process_users(users, count) struct user users[]; int count; ##{ char buf[256]; int i; ## char login[9], id[17], class[9], modtime[26], modwith[9], xmodtime[26]; ## char login2[9], id2[17], class2[9], modtime2[26],modwith2[9],xmodtime2[26]; ## char login3[9], id3[17], class3[9], modtime3[26],modwith3[9],xmodtime3[26]; ## int users_id, users_id2, users_id3, status, status2, status3, rowcount; printf("\nGot %d users named %s %s\n", count, users[0].first, users[0].last); if (count < 2) return; users_id = users[0].users_id; ## range of u is users ## retrieve (login = u.#login, id = u.mit_id, class = u.mit_year, ## modtime = u.#modtime, modwith = u.#modwith, ## xmodtime = u.#xmodtime, status = u.#status) ## where u.#users_id = users_id users_id2 = users[1].users_id; ## retrieve (login2 = u.#login, id2 = u.mit_id, class2 = u.mit_year, ## modtime2 = u.#modtime, modwith2 = u.#modwith, ## xmodtime2 = u.#xmodtime, status2 = u.#status) ## where u.#users_id = users_id2 modtime[20] = modtime2[20] = xmodtime[20] = xmodtime2[20] = 0; printf("A: %s %5d %d\t\t\tB: %s %5d %d\n", login, users_id, status, login2, users_id2, status2); printf(" %s %s\t\t %s %s\n", class, id, class2, id2); printf(" %s %s\t %s %s\n", modtime, modwith, modtime2, modwith2); printf(" %s\t\t\t %s\n", xmodtime, xmodtime2); if (count > 2) { for (i = 2; i < count; i++) { users_id3 = users[i].users_id; ## retrieve (login3 = u.#login, id3 = u.mit_id, class3 = u.mit_year, ## modtime3 = u.#modtime, modwith3 = u.#modwith, ## xmodtime3 = u.#xmodtime, status3 = u.#status) ## where u.#users_id = users_id3 modtime3[20] = xmodtime3[20] = 0; printf("\n%c: %s %5d %d\n", 'A' + i, login3, users_id3, status3); printf(" %s %s\n", class3, id3); printf(" %s %s\n", modtime3, modwith3); printf(" %s\n", xmodtime3); } } if (count == 2) { if (status == 3 || status2 == 3) return; if ((status == 0 || status == 4) && !isdigit(id[0]) && !isdigit(xmodtime[0])) { printf("DELETING %s\n", login); ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %s marked for deletion.\n", login); return; } if ((status2 == 0 || status2 == 4) && !isdigit(id2[0]) && !isdigit(xmodtime2[0])) { printf("DELETING %s\n", login2); ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id2 ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %s marked for deletion.\n", login2); return; } } printf("\n0,sp: Do nothing\n1: Delete B\n2: Delete A\n"); printf("3: A<-B's ID; Delete B\n4: B<-A's ID; Delete A\n"); if (count > 2) printf("5: Delete C\n"); if (count > 3) printf("6: Delete D\n"); printf("?");fflush(stdout); gets(buf); switch (buf[0]) { case '1': ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id2 ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %s marked for deletion.\n", login2); break; case '2': ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %s marked for deletion.\n", login); break; case '3': ## replace u (#mit_id = id2, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id2 ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %s updated, %s marked for deletion.\n", login, login2); break; case '4': ## replace u (#mit_id = id, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id2 ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %s updated, %s marked for deletion.\n", login2, login); break; case '5': users_id = users[2].users_id; ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %d marked for deletion.\n", users[2].users_id); break; case '6': users_id = users[3].users_id; ## replace u (#status = 3, #modtime=date("now"), #modwith="nodups", ## modby=8873) where u.#users_id = users_id ## inquire_equel(rowcount = "rowcount") if (rowcount != 1) printf("Failed!\007\007\007\n"); else printf("User %d marked for deletion.\n", users[3].users_id); break; case 'q': exit(0); default: printf("Leaving unchanged\n"); } ##}