main() { float ship[XY]; long org[XY]; long size[XY]; Device dev; short val; Device mdev[XY]; short mval[XY]; long nhits; short buffer[BUFSIZE]; Boolean run; prefsize(400, 400); winopen("select1"); getorigin(&org[X], &org[Y]); getsize(&size[X], &size[Y]); mmode(MVIEWING); ortho2(-0.5, size[X] - 0.5, -0.5, size[Y] - 0.5); qdevice(LEFTMOUSE); qdevice(ESCKEY); color(BLACK); clear(); mdev[X] = MOUSEX; mdev[Y] = MOUSEY; drawplanet(); run = TRUE; while (run) { dev = qread(&val); if (val == 0) { /* on upstroke */ switch (dev) { case LEFTMOUSE: getdev(XY, mdev, mval); ship[X] = mval[X] - org[X]; ship[Y] = mval[Y] - org[Y]; color(BLUE); sbox(ship[X], ship[Y], ship[X] + SHIPWIDTH, ship[Y] + SHIPHEIGHT); /* * specify the selecting region to be a box surrounding the * rocket ship */ ortho2(ship[X], ship[X] + SHIPWIDTH, ship[Y], ship[Y] + SHIPHEIGHT); initnames(); gselect(buffer, BUFSIZE); loadname(PLANET); /* no actual drawing takes place */ drawplanet(); nhits = endselect(buffer); /* * restore the Projection matrix; NB. can't use push/popmatrix * since they only work for the ModelView matrix stack * when in MVIEWING mode */ ortho2(-0.5, size[X] - 0.5, -0.5, size[Y] - 0.5); /* * check to see if PLANET was selected; NB. nhits is NOT the * number of buffer elements written */ if (nhits < 0) { fprintf(stderr, "gselect buffer overflow\n"); run = FALSE; } else if (nhits >= 1 && buffer[0] == 1 && buffer[1] == PLANET) ringbell(); break; case ESCKEY: run = FALSE; break; } } } gexit(); return 0; }
int main(int argc, char **argv) { FILE *fin, *fout; char line[4096], *p, *tok, **args; char tmp[128]; struct binding *b; int i, j, off, argoff; int maxkey; prg = argv[0]; rc_inrc = 1; maxkey = max_fnkey + 256; if (argc == 2 && strcmp(argv[1], ".") != 0) srcdir = argv[1]; else srcdir = NULL; initnames(); for (i=0; i<maxkey; i++) { binding[i].next = NULL; binding[i].state = bs_none; binding[i].fn = -1; binding[i].args = NULL; } off = 0; /* processing ``bindings.desc'' */ if ((fin=vpath_open(FNAME ".desc")) == NULL) exit(1); rc_lineno = 0; while (fgets(line, 4096, fin) != NULL) { rc_lineno++; p = line; if ((tok=rc_token(&p)) == NULL || tok[0] == '#') continue; if (strcasecmp(tok, "bind") != 0) { rc_error("non-bind command ignored: %s", tok); continue; } args = rc_list(p); fn_bind(args); } if (ferror(fin)) { fprintf(stderr, "%s: read error in `%s': %s.\n", prg, rc_filename, strerror(errno)); fclose(fin); exit(1); } fclose(fin); free(rc_filename); rc_filename = NULL; /* writing ``bindings.c'' in temp file */ sprintf(tmp, FNAME ".c.%d", getpid()); if ((fout=fopen(tmp, "w")) == NULL) { fprintf(stderr, "%s: can't open output file `%s': %s.\n", prg, tmp, strerror(errno)); exit(1); } fprintf(fout, "%s", header); /* output: bindings */ off = argoff = 0; fprintf(fout, "struct binding " NAME "[] = {\n"); for (i=0; i<maxkey; i++) { fprintf(fout, " { "); if (binding[i].next) { fprintf(fout, "binding_pool+%3d, ", off); for (b=binding[i].next; b; b=b->next) off++; } else fprintf(fout, "NULL , "); if (binding[i].state+1 < nstates) fprintf(fout, "%s, ", states[binding[i].state+1]); else fprintf(fout, "%d, ", binding[i].state); fprintf(fout, "%3d, ", binding[i].fn); if (binding[i].args) { fprintf(fout, "binding_argpool+%d },\n", argoff); for (j=0; binding[i].args[j]; j++) ; argoff += j+1; } else fprintf(fout, "NULL },\n"); } fprintf(fout, "};\n\n"); if (ferror(fout)) { fprintf(stderr, "%s: write error on `%s': %s.\n", prg, FNAME ".c", strerror(errno)); exit(1); fclose(fout); } /* output: bindings_pool */ off = 1; fprintf(fout, "struct binding " NAME "_" POOL "[] = {\n"); for (i=0; i<maxkey; i++) if (binding[i].next) { for (b=binding[i].next; b; b=b->next) { fprintf(fout, " { "); if (b->next) fprintf(fout, "binding_pool+%3d, ", off); else fprintf(fout, "NULL , "); if (b->state+1 < nstates) fprintf(fout, "%s, ", states[b->state+1]); else fprintf(fout, "%d, ", b->state); fprintf(fout, "%3d, ", b->fn); if (b->args) { fprintf(fout, "binding_argpool+%d },\n", argoff); for (j=0; b->args[j]; j++) ; argoff += j+1; } else fprintf(fout, "NULL },\n"); off++; } } fprintf(fout, "};\n\n"); fprintf(fout, "int " NAME "_n" POOL " = sizeof(" NAME "_" POOL ")" " / sizeof(" NAME "_" POOL "[0]);\n\n"); if (ferror(fout)) { fprintf(stderr, "%s: write error on `%s': %s.\n", prg, FNAME ".c", strerror(errno)); exit(1); fclose(fout); } /* output: binding_argpool */ fprintf(fout, "char *" NAME "_" ARGS "[] = {\n "); for (i=0; i<maxkey; i++) if (binding[i].args) print_args(fout, binding[i].args); for (i=0; i<maxkey; i++) if (binding[i].next) for (b=binding[i].next; b; b=b->next) if (b->args) print_args(fout, b->args); fprintf(fout, "\n};\n\n"); fprintf(fout, "int " NAME "_n" ARGS " = sizeof(" NAME "_" ARGS ")" " / sizeof(" NAME "_" ARGS "[0]);\n"); if (ferror(fout)) { fprintf(stderr, "%s: write error on `%s': %s.\n", prg, FNAME ".c", strerror(errno)); fclose(fout); exit(1); } fclose(fout); /* rename tmp file to ``bindings.c'' */ if (rename(tmp, FNAME ".c") < 0) { fprintf(stderr, "%s: cannot rename `%s' to `%s': %s\n", prg, tmp, FNAME ".c", strerror(errno)); exit(1); } exit(0); }