home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / FORTH / FRASRC11.ZIP / CONFIG.C < prev    next >
Text File  |  1989-11-15  |  9KB  |  310 lines

  1. /*
  2.     config.c - FRACTINT code relative to video configuration
  3. */
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #ifdef __TURBOC__
  9. #include <dir.h>
  10. #endif
  11.  
  12. #include "fractint.h"
  13. #include "targa_lc.h"
  14. int file_type = -1;     /* 0=GIF, 1=Tim's pot (may become Targa) TW 7/20/89 */
  15.  
  16. /* looks for fractal_info within MAX_LOOK bytes of end of file */
  17. #define MAX_LOOK 612            /* equals max bytes garbage at end of file */
  18.  
  19. int filetype;
  20. find_fractal_info(gif_file,info)
  21. char *gif_file;
  22. struct fractal_info *info;
  23. {
  24.    long where;
  25.    int ct;
  26.    FILE *fp;
  27.    unsigned char gifstart[18]; 
  28.    int rows, cols, colors;
  29.    char temp1[81];
  30.  
  31.    ct = 0;
  32.  
  33.    strcpy(temp1,gif_file);
  34.    if (strchr(temp1,'.') == NULL) {
  35.       strcat(temp1,DEFAULTFRACTALTYPE);
  36.       if ((fp = fopen(temp1,"rb")) != NULL) {
  37.          fclose(fp);
  38.          }
  39.       else {
  40.          strcpy(temp1,gif_file);
  41.          strcat(temp1,ALTERNATEFRACTALTYPE);
  42.          }
  43.       }
  44.   
  45.    if((fp = fopen(temp1,"rb"))==NULL)
  46.    {
  47.       *gif_file = NULL; /* failed ... zap filename */
  48.       return(-1);
  49.    }
  50.    fread(gifstart,18,1,fp);
  51.    if (strncmp(gifstart,"GIF",3)==0)
  52.       filetype = 0; /* GIF */
  53.    else  if (strncmp(gifstart,"TIW16BIT",8)==0)
  54.       filetype = 1; /* TIW file type - change to Targa */
  55.    else if(fread(info,sizeof(struct fractal_info),1,fp)==1 && 
  56.                  strncmp(info->info_id,"Fractal",8)==0)
  57.       filetype = 2; /* Targa 16 */
  58.    else
  59.    {
  60.       *gif_file = NULL; /* failed ... zap filename */
  61.       fclose(fp);
  62.       return(-1);
  63.    }
  64.    switch(filetype)
  65.    {
  66.    case 0: /* GIF */
  67.       rows = gifstart[7]*256+gifstart[6];
  68.       cols = gifstart[9]*256+gifstart[8];
  69.       colors = 2 << (gifstart[10] & 7);
  70.       break;
  71.    case 1: /* TIW */
  72.       cols   = *((int *)(gifstart+ 8));
  73.       rows   = *((int *)(gifstart+10));
  74.       colors = *((int *)(gifstart+12));
  75.       break;
  76.    case 2: /* TARGA */
  77.       rows = *(int *)&gifstart[O_VSIZE];
  78.       cols = *(int *)&gifstart[O_HSIZE];
  79.       colors = info->colors;
  80.       if(rows != info->ydots || cols != info->xdots)
  81.       {
  82.          *gif_file = NULL; /* failed ... zap filename */
  83.          fclose(fp);
  84.          return(-1);
  85.       }else
  86.       {
  87.          fclose(fp);
  88.          return(0);
  89.       }
  90.       break;
  91.    default:
  92.       *gif_file = NULL; /* failed ... zap filename */
  93.       fclose(fp);
  94.       return(-1);
  95.       break;
  96.    }
  97.  
  98.  
  99.  
  100.    fseek(fp,-1L*(long)sizeof(FRACTAL_INFO),SEEK_END);
  101.    do  /* keep trying to find word INFO_ID */
  102.    {
  103.        /* should work on the first try, but you never know */
  104.        fread(info,1,sizeof(FRACTAL_INFO),fp);
  105.  
  106.        /* creep up from the bottom  - the '-101' is for old .FRA files */
  107.        fseek(fp,-1L*(long)(sizeof(FRACTAL_INFO)-101+ct),SEEK_END);
  108.    }
  109.    while(ct++ < MAX_LOOK && strcmp(INFO_ID,info->info_id));
  110.  
  111.    if(ct < MAX_LOOK)
  112.    {
  113.       /* zero means we won */
  114.       fclose(fp);
  115.       return(0);
  116.    }
  117.  
  118.    strcpy(info->info_id, "GIFFILE");
  119.    info->iterations = 150;
  120.    info->fractal_type = PLASMA;
  121.    info->xmin = -1;
  122.    info->xmax = 1;
  123.    info->ymin = -1;
  124.    info->ymax = 1;
  125.    info->creal = 0;
  126.    info->cimag = 0;
  127.    info->videomodeax=255;
  128.    info->videomodebx=255;
  129.    info->videomodecx=255;
  130.    info->videomodedx=255;
  131.    info->dotmode = 0;
  132.    info->xdots = rows;
  133.    info->ydots = cols;
  134.    info->colors = colors;
  135.  
  136.    /* zero means we won */
  137.    fclose(fp);
  138.    return(0);
  139. }
  140.  
  141. readconfig()        /* search for, read, decode fractint.cfg file */
  142. {
  143. char tempstring[101];
  144. FILE *cfgfile;
  145. int count, i, j, ax, bx, cx, dx, dotmode, xdots, ydots, colors, commas[10];
  146. #ifdef __TURBOC__
  147. strcpy(tempstring,searchpath("fractint.cfg"));
  148. #else
  149. _searchenv("fractint.cfg","PATH",tempstring);
  150. #endif
  151. if (tempstring[0] == 0)
  152.     return(-1);                /* can't find the file    */
  153. if (strcmp(&tempstring[2],"\\\\fractint.cfg") == 0)    /* stupid answer! */
  154.     strcpy(&tempstring[2],"\\fractint.cfg");
  155. if ((cfgfile = fopen(tempstring,"r")) == NULL)
  156.     return(-1);                /* ?? can't open file    */
  157.  
  158. count = 0;                    /* build a new videomode file */
  159. while (feof(cfgfile) == 0 && count < MAXVIDEOMODES) {    /* scan through strings */
  160.     if (!fgets(tempstring, 100, cfgfile)) break;
  161.     tempstring[strlen(tempstring)-1] = 0;
  162.     if (tempstring[0] <= 32) continue;    /* comment line        */
  163.     j = 9;
  164.     for (i = 0; i <= j; i++) commas[i] = 0;
  165.     for (i = strlen(tempstring); i >= 0 && j >= 0; i--)  /* check for commas */
  166.         if (tempstring[i] == ',') {
  167.             tempstring[i] = 0;
  168.             commas[--j] = i+1;
  169.             }
  170.     sscanf(&tempstring[commas[0]],"%x",&ax);
  171.     sscanf(&tempstring[commas[1]],"%x",&bx);
  172.     sscanf(&tempstring[commas[2]],"%x",&cx);
  173.     sscanf(&tempstring[commas[3]],"%x",&dx);
  174.     dotmode     = atoi(&tempstring[commas[4]]);
  175.     xdots       = atoi(&tempstring[commas[5]]);
  176.     ydots       = atoi(&tempstring[commas[6]]);
  177.     colors      = atoi(&tempstring[commas[7]]);
  178.     if (    i >= 0 || j != 0 ||
  179.         dotmode < 0 || dotmode > 30 ||
  180.         xdots < 160 || xdots > 2048 ||
  181.         ydots < 160 || ydots > 2048 ||
  182.         (colors != 2 && colors != 4 && colors != 16 && colors != 256)
  183.         ) {
  184.         buzzer(2);
  185.         printf("\n\n There is a bad entry in fractint.cfg\n\n");
  186.         printf(" ==> %s \n", tempstring);
  187.         exit(-1);
  188.         }
  189.     tempstring[commas[8]+25] = 0;
  190.     if (commas[0] >= 25) tempstring[25] = 0;
  191.     strcpy(videoentry.name,    tempstring);
  192.     strcpy(videoentry.comment, &tempstring[commas[8]]);
  193.     if (tempstring[commas[8]] == ' ')
  194.         strcpy(videoentry.comment, &tempstring[commas[8]+1]);
  195.     videoentry.videomodeax =   ax;
  196.     videoentry.videomodebx =   bx;
  197.     videoentry.videomodecx =   cx;
  198.     videoentry.videomodedx =   dx;
  199.     videoentry.dotmode     =   dotmode;
  200.     videoentry.xdots       =   xdots;
  201.     videoentry.ydots       =   ydots;
  202.     videoentry.colors      =   colors;
  203.     tovideotable(count);
  204.     count++;
  205.     }
  206.  
  207. if (count > 0) strcpy(videoentry.name, "END");
  208. videoentry.colors = 0;
  209. tovideotable(count);
  210. fclose(cfgfile);
  211. if (count <= 0) return(-1);
  212. return(0);                    /* successful return    */
  213. }
  214.  
  215.  
  216. makeconfig()        /* routine to build a FRACTINT.CFG file */
  217. {
  218. char tempstring[101];
  219. FILE *cfgfile;
  220. int count;
  221.  
  222. #ifdef __TURBOC__
  223. strcpy(tempstring,searchpath("fractint.cfg"));
  224. #else
  225. _searchenv("fractint.cfg","PATH",tempstring);
  226. #endif
  227.  
  228. if (tempstring[0] != 0) {
  229.     buzzer(2);
  230.     printf("\n There is a FRACTINT.CFG file already located in the PATH.\n\n");
  231.     printf(" I won't make another one until after you manually remove\n");
  232.     printf(" the old one.  Safety first!\n\n");
  233.     exit(-1);
  234.     }
  235.  
  236. if ((cfgfile = fopen("fractint.cfg","w")) == NULL)
  237.     exit(-1);                /* ?? can't open file    */
  238. fprintf(cfgfile,"   Full FRACTINT.CFG File, built by a 'fractint batch=config' command\n\n");
  239. fprintf(cfgfile," name of adapter/mode    | AX | BX | CX | DX |mode|  x |  y |clrs| comments\n");
  240. fprintf(cfgfile," =============================================================================\n\n");
  241. for (count = 0; count < maxvideomode; count++) {    /* write the entries */
  242.     fromvideotable(count);
  243. #ifdef __TURBOC__
  244.     fprintf(cfgfile,"%-25.25s,%4x,%4x,%4x,%4x,%4d,%4d,%4d,%4d, %-25.25s\n",
  245. #else
  246.     fprintf(cfgfile,"%-25s,%4x,%4x,%4x,%4x,%4d,%4d,%4d,%4d, %-25s\n",
  247. #endif
  248.         videoentry.name,
  249.         videoentry.videomodeax,
  250.         videoentry.videomodebx,
  251.         videoentry.videomodecx,
  252.         videoentry.videomodedx,
  253.         videoentry.dotmode,
  254.         videoentry.xdots,
  255.         videoentry.ydots,
  256.         videoentry.colors,
  257.         videoentry.comment);
  258.     }
  259. fclose(cfgfile);
  260. exit(0);
  261. }
  262.  
  263. /* A TRULY persistent routine doing it's DARNDEST to find a good mode */
  264.  
  265. getGIFmode(v1)
  266. struct fractal_info *v1;
  267. {
  268.    int i;
  269.  
  270.    /* try EXACT match with a configured mode */
  271.     for(i=0;i<maxvideomode;i++) {
  272.        fromvideotable(i);
  273.            if(v1->videomodeax == videoentry.videomodeax &&
  274.              v1->videomodebx == videoentry.videomodebx &&
  275.            v1->videomodecx == videoentry.videomodecx &&
  276.            v1->videomodedx == videoentry.videomodedx &&
  277.            v1->dotmode     == videoentry.dotmode     &&
  278.            v1->xdots       == videoentry.xdots       &&
  279.            v1->ydots       == videoentry.ydots       &&
  280.            v1->colors      == videoentry.colors      ) 
  281.               break;
  282.     }
  283.     if(i<maxvideomode) /* gotit! */
  284.        return(i);
  285.  
  286.    /* try to match xdots, ydots, and colors to a configured mode */
  287.     for(i=0;i<maxvideomode;i++) {
  288.        fromvideotable(i);
  289.            if(v1->xdots       == videoentry.xdots       &&
  290.            v1->ydots       == videoentry.ydots       &&
  291.            v1->colors      == videoentry.colors      )
  292.               break;
  293.     }
  294.     if(i<maxvideomode) /* gotit! */
  295.        return(i);
  296.  
  297.     /* ABSOLUTELY the LAST gasp! ANY mode with right xdot and ydot??? */
  298.     for(i=0;i<maxvideomode;i++) {
  299.        fromvideotable(i);
  300.            if(v1->xdots       == videoentry.xdots       &&
  301.            v1->ydots       == videoentry.ydots       )
  302.               break;
  303.     }
  304.     if(i<maxvideomode) /* gotit! */
  305.        return(i);
  306.     
  307.     /* give up! */
  308.        return(maxvideomode);   
  309. }
  310.