Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}