int tkwbReadFileToString(char **strP, int *hitEOF, FILE *file, char *stop) { char **all, line[AIR_STRLEN_HUGE]; airArray *allArr; unsigned int allLen; unsigned int lineLen, lineIdx, totalLen; _tkwbU uu; uu.pc = &all; allArr = airArrayNew(uu.v, &allLen, sizeof(char*), tkwbArrayIncr); airArrayPointerCB(allArr, airNull, airFree); lineLen = airOneLine(file, line, AIR_STRLEN_HUGE); totalLen = 0; while (lineLen && (!( airStrlen(stop) && !strcmp(line, stop) )) ) { lineIdx = airArrayLenIncr(allArr, 1); /* HEY error checking */ all[lineIdx] = (char *)calloc(strlen(line) + strlen("\n") + 1, sizeof(char)); sprintf(all[lineIdx], "%s\n", line); totalLen += strlen(line) + 1; lineLen = airOneLine(file, line, AIR_STRLEN_HUGE); } if (hitEOF) { *hitEOF = !lineLen; } *strP = (char*)calloc(totalLen+1, sizeof(char)); strcpy(*strP, ""); for (lineIdx=0; lineIdx<allLen; lineIdx++) { strcat(*strP, all[lineIdx]); } airArrayNuke(allArr); return 0; }
int tkwbReadSlides(tkwbSlide ***slideP, char *filename, airArray *pmop) { char me[]="tkwbReadSlides", err[BIFF_STRLEN]; FILE *file; airArray *mop, *slideArr; tkwbSlide **slide = NULL; char *title, *image, *text, stop[AIR_STRLEN_HUGE], line[AIR_STRLEN_HUGE]; int slideIdx=0, hitEOF, notReally; unsigned int len; _tkwbU uu; mop = airMopNew(); if (!( file = airFopen(filename, stdin, "rb") )) { sprintf(err, "%s: couldn't open %s: %s", me, filename, strerror(errno)); biffAdd(TKWB, err); airMopError(mop); return 1; } airMopAdd(mop, file, (airMopper)airFclose, airMopAlways); len = airOneLine(file, stop, AIR_STRLEN_HUGE); if (!( len > 1 )) { sprintf(err, "%s: didn't get a stop delimiter from %s", me, filename); biffAdd(TKWB, err); airMopError(mop); return 1; } uu.ps = &slide; slideArr = airArrayNew(uu.v, NULL, sizeof(tkwbSlide*), tkwbArrayIncr); airMopAdd(mop, slideArr, (airMopper)airArrayNix, airMopAlways); hitEOF = notReally = AIR_FALSE; while (!hitEOF) { slideIdx = airArrayLenIncr(slideArr, 1); /* HEY error checking */ len = airOneLine(file, line, AIR_STRLEN_HUGE); if (!len) { /* got EOF after a division marker, that's okay */ notReally = AIR_TRUE; break; } title = airStrdup(line); len = airOneLine(file, line, AIR_STRLEN_HUGE); if (!len) { break; } image = airStrdup(line); if (tkwbReadFileToString(&text, &hitEOF, file, stop)) { sprintf(err, "%s: couldn't read in slide %d", me, slideIdx); biffAdd(TKWB, err); airMopError(mop); return 1; } slide[slideIdx] = tkwbSlideNew(title, image, text); airMopAdd(pmop, slide[slideIdx], (airMopper)tkwbSlideNix, airMopAlways); } if (!hitEOF && !notReally) { sprintf(err, "%s: got incomplete slide info for slide %d\n", me, slideIdx); biffAdd(TKWB, err); airMopError(mop); return 1; } if (!notReally) { slideIdx = airArrayLenIncr(slideArr, 1); /* HEY error checking */ } slide[slideIdx] = NULL; *slideP = slide; airMopOkay(mop); return 0; }
int _limnReadCamanim(int imgSize[2], limnCamera **keycamP, double **timeP, unsigned int *numKeysP, FILE *fin) { char me[]="_limnReadCamanim", err[AIR_STRLEN_MED]; char line[AIR_STRLEN_HUGE]; unsigned int ki; double *tmp, *dwell, di, dn, df, fr[3], at[3], up[3], va; airArray *mop, *camA, *dwellA; if (!( 0 < airOneLine(fin, line, AIR_STRLEN_HUGE) && !strcmp(_LIMNMAGIC, line) )) { sprintf(err, "%s: couldn't read first line or it wasn't \"%s\"", me, _LIMNMAGIC); biffAdd(LIMN, err); return 1; } if (!( 0 < airOneLine(fin, line, AIR_STRLEN_HUGE) && 2 == (airStrtrans(airStrtrans(line, '{', ' '), '}', ' '), sscanf(line, "imgSize %d %d", imgSize+0, imgSize+1)) )) { sprintf(err, "%s: couldn't read second line or it wasn't " "\"imgSize <sizeX> <sizeY>\"", me); biffAdd(LIMN, err); return 1; } mop = airMopNew(); camA = airArrayNew((void **)keycamP, numKeysP, sizeof(limnCamera), 1); dwellA = airArrayNew((void **)&dwell, NULL, sizeof(double), 1); airMopAdd(mop, camA, (airMopper)airArrayNix, airMopAlways); airMopAdd(mop, dwellA, (airMopper)airArrayNuke, airMopAlways); while ( 0 < airOneLine(fin, line, AIR_STRLEN_HUGE) ) { airStrtrans(airStrtrans(line, '{', ' '), '}', ' '); ki = airArrayLenIncr(camA, 1); airArrayLenIncr(dwellA, 1); if (14 != sscanf(line, "cam.di %lg cam.at %lg %lg %lg " "cam.up %lg %lg %lg cam.dn %lg cam.df %lg cam.va %lg " "relDwell %lg cam.fr %lg %lg %lg", &di, at+0, at+1, at+2, up+0, up+1, up+2, &dn, &df, &va, dwell+ki, fr+0, fr+1, fr+2)) { sprintf(err, "%s: trouble parsing line %d: \"%s\"", me, ki, line); biffAdd(LIMN, err); airMopError(mop); return 1; } (*keycamP)[ki].neer = dn; (*keycamP)[ki].faar = df; (*keycamP)[ki].dist = di; ELL_3V_COPY((*keycamP)[ki].from, fr); ELL_3V_COPY((*keycamP)[ki].at, at); ELL_3V_COPY((*keycamP)[ki].up, up); (*keycamP)[ki].fov = va; (*keycamP)[ki].aspect = (double)imgSize[0]/imgSize[1]; (*keycamP)[ki].atRelative = AIR_FALSE; (*keycamP)[ki].orthographic = AIR_FALSE; (*keycamP)[ki].rightHanded = AIR_TRUE; } tmp = (double*)calloc(*numKeysP, sizeof(double)); airMopAdd(mop, tmp, airFree, airMopAlways); *timeP = (double*)calloc(*numKeysP, sizeof(double)); for (ki=0; ki<*numKeysP; ki++) { dwell[ki] = AIR_CLAMP(0, dwell[ki], 2); tmp[ki] = tan(AIR_AFFINE(-0.01, dwell[ki], 2.01, 0.0, AIR_PI/2)); } (*timeP)[0] = 0; for (ki=1; ki<*numKeysP; ki++) { (*timeP)[ki] = (*timeP)[ki-1] + (tmp[ki-1] + tmp[ki])/2; } for (ki=0; ki<*numKeysP; ki++) { (*timeP)[ki] /= (*timeP)[*numKeysP-1]; } airMopOkay(mop); return 0; }