struct segment * StepBezier(struct region *R, /* Region under construction or NULL */ fractpel xA, fractpel yA, /* A control point */ fractpel xB, fractpel yB, /* B control point */ fractpel xC, fractpel yC, /* C control point */ fractpel xD, fractpel yD) /* D control point */ { struct bezierinfo Info; Info.region = R; Info.origin.x = xA; Info.origin.y = yA; xB -= xA; xC -= xA; xD -= xA; yB -= yA; yC -= yA; yD -= yA; if ( TOOBIG(xB) || TOOBIG(yB) || TOOBIG(xC) || TOOBIG(yC) || TOOBIG(xD) || TOOBIG(yD) ) Abort("Beziers this big not yet supported"); return(StepBezierRecurse(&Info, (fractpel) 0, (fractpel) 0, xB, yB, xC, yC, xD, yD)); }
/* * Copy unmarked files in packing list to playpen - marked files * have already been copied in an earlier pass through the list. */ void copy_plist(const char *home, Package *plist) { PackingList p = plist->head; const char *where = home; const char *there = NULL, *mythere; char *where_args, *prefix = NULL; const char *last_chdir, *root = "/"; long maxargs; int where_count = 0, add_count; struct stat stb; dev_t curdir; maxargs = sysconf(_SC_ARG_MAX); maxargs -= 64; /* * Some slop for the tar cmd text, * and sh -c */ where_args = malloc(maxargs); if (!where_args) { cleanup(0); errx(2, "%s: can't get argument list space", __func__); } memset(where_args, 0, maxargs); strcpy(where_args, STARTSTRING); where_count = sizeof(STARTSTRING)-1; last_chdir = 0; if (stat(".", &stb) == 0) curdir = stb.st_dev; else curdir = (dev_t) -1; /* * It's ok if this is a valid dev_t; * this is just a hint for an * optimization. */ while (p) { if (p->type == PLIST_CWD) { if (!prefix) prefix = p->name; where = p->name == NULL ? prefix : p->name; } else if (p->type == PLIST_SRC) there = p->name; else if (p->type == PLIST_IGNORE) p = p->next; else if (p->type == PLIST_FILE && !p->marked) { char fn[FILENAME_MAX]; /* First, look for it in the "home" dir */ sprintf(fn, "%s/%s", home, p->name); if (fexists(fn)) { if (lstat(fn, &stb) == 0 && stb.st_dev == curdir && S_ISREG(stb.st_mode)) { /* * If we can link it to the playpen, that avoids a copy * and saves time. */ if (p->name[0] != '/') { /* * Don't link abspn stuff--it doesn't come from * local dir! */ if (trylink(fn, p->name) == 0) { p = p->next; continue; } } } if (TOOBIG(fn)) { PUSHOUT(); } if (p->name[0] == '/') { add_count = snprintf(&where_args[where_count], maxargs - where_count, " %s %s", last_chdir == root ? "" : "-C /", p->name); last_chdir = root; } else { add_count = snprintf(&where_args[where_count], maxargs - where_count, " %s%s %s", last_chdir == home ? "" : "-C ", last_chdir == home ? "" : home, p->name); last_chdir = home; } if (add_count < 0 || add_count >= maxargs - where_count) { cleanup(0); errx(2, "%s: oops, miscounted strings!", __func__); } where_count += add_count; } /* * Otherwise, try along the actual extraction path.. */ else { if (p->name[0] == '/') mythere = root; else mythere = there; if (mythere) snprintf(fn, sizeof(fn), "%s/%s", mythere, p->name); else snprintf(fn, sizeof(fn), "%s%s/%s", BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name); if (lstat(fn, &stb) == 0 && stb.st_dev == curdir && S_ISREG(stb.st_mode)) { /* * If we can link it to the playpen, that avoids a copy * and saves time. */ if (trylink(fn, p->name) == 0) { p = p->next; continue; } } if (TOOBIG(p->name)) { PUSHOUT(); } if (last_chdir == (mythere ? mythere : where)) add_count = snprintf(&where_args[where_count], maxargs - where_count, " %s", p->name); else add_count = snprintf(&where_args[where_count], maxargs - where_count, " -C %s %s", mythere ? mythere : where, p->name); if (add_count < 0 || add_count >= maxargs - where_count) { cleanup(0); errx(2, "%s: oops, miscounted strings!", __func__); } where_count += add_count; last_chdir = (mythere ? mythere : where); } } p = p->next; } PUSHOUT(); free(where_args); }