home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0611.ZIP / CCE_0611.PD / MAKE_RSC / MAKERSC.C next >
C/C++ Source or Header  |  1989-11-16  |  9KB  |  246 lines

  1.                          /***************************
  2.                           * Makersc V 1.0           *
  3.                           * (C) by Gerd Scheck      *
  4.                           * Karlsruhe, den 18.04.89 *
  5.                           ***************************/
  6.  
  7.   /* Das Programm wandelt eine Resource '.C' Datei wieder in eine '.RSC'
  8.      Datei um                                                            */ 
  9.  
  10. #include <gemdefs.h>
  11. #include <obdefs.h>
  12. #include <osbind.h>
  13. #include <stdio.h>
  14. #define BYTE char
  15. #define WORD int
  16. #define LONG long
  17.  
  18. #include "test.c"    /* hier Namen der umzuwandelden '.C' Datei eintragen */
  19. #define RSC_DATNAME "new.rsc" /* hier Namen der zu erzeugenden '.RSC' Datei
  20.                                  eintragen                                */
  21.                      
  22. RSHDR rscheader={1,0,0,0,0,0,0,0,0,0,NUM_OBS,NUM_TREE,NUM_TI,NUM_IB,
  23.                  NUM_BB,NUM_FRSTR,NUM_FRIMG,0};
  24.                                         
  25. char *strptr; /* Zeiger auf den neuen Stringblock */
  26.  
  27. str_size()        /* Größe des Stringblocks ermitteln */
  28. { int i,size=0;
  29.   for(i=0;i<=NUM_STRINGS-1;i++)
  30.     size +=strlen(rs_strings[i])+1;
  31.   return(size);
  32. }
  33.  
  34. image_size()     /* Größe der Imageblocks ermitteln */
  35. { int i,j,size=0;
  36.   for(i=0;i<=NUM_BB-1;i++)
  37.     { j=(int)rs_bitblk[i].bi_pdata;
  38.       if(rs_imdope[j].dummy==0)
  39.         { rs_imdope[j].dummy=rs_bitblk[i].bi_wb*rs_bitblk[i].bi_hl;
  40.           size +=rs_imdope[j].dummy;
  41.         }
  42.     }
  43.   for(i=0;i<=NUM_IB-1;i++)
  44.     { j=(int)rs_iconblk[i].ib_pmask;
  45.       if(rs_imdope[j].dummy==0)
  46.         { rs_imdope[j].dummy=(rs_iconblk[i].ib_wicon/8)*
  47.                              rs_iconblk[i].ib_hicon;
  48.           size +=rs_imdope[j].dummy;
  49.         }
  50.       j=(int)rs_iconblk[i].ib_pdata;
  51.       if(rs_imdope[j].dummy==0)
  52.         { rs_imdope[j].dummy=(rs_iconblk[i].ib_wicon/8)*
  53.                              rs_iconblk[i].ib_hicon;
  54.           size +=rs_imdope[j].dummy;
  55.         }
  56.     }
  57.   return(size);
  58. }
  59.  
  60. str_copy(strsize) /* Strings in einen Block kopieren */
  61. int *strsize;
  62. { int i;
  63.   char *p;
  64.   (*strsize)++;
  65.   strptr=malloc((unsigned)*strsize);
  66.   strptr=(char *)((long)strptr+((long)strptr%2));
  67.   p=strptr;
  68.   for(i=0;i<=NUM_STRINGS-1;i++)
  69.     { strcpy(p,rs_strings[i]);
  70.       p +=strlen(rs_strings[i])+1;
  71.     }
  72. }
  73.  
  74. make_frstr() /* rel. Adressen der freien Strings errechnen */
  75. { int i;
  76.   char *rel_stradr();
  77.   for(i=0;i<=NUM_FRSTR-1;i++)
  78.     rs_frstr[i]=(long)rel_stradr((int)rs_frstr[i]);
  79. }
  80.  
  81. /* rel. Adressen der Images in den Bitblocks errechnen */
  82. make_bitblk(strsize)
  83. int strsize;
  84. { int i,*rel_imgadr();
  85.   for(i=0;i<=NUM_BB-1;i++)
  86.     rs_bitblk[i].bi_pdata=rel_imgadr((int)rs_bitblk[i].bi_pdata,strsize);  
  87. }
  88.  
  89. /* berechnet rel. Adresse der einzelnen Imageblöcke */
  90. int *rel_imgadr(imgindex,strsize) 
  91. int imgindex,strsize;
  92. { int reladr=sizeof(RSHDR)+strsize,i;
  93.   for(i=0;i<imgindex;i++)
  94.     reladr +=rs_imdope[i].dummy;
  95.   return((int *)reladr);
  96. }
  97.  
  98. /* rel. Adressen der freien Images errechnen */
  99. make_frimg(strsize,imgsize,frstrsize)
  100. int strsize,imgsize,frstrsize;
  101. { int i;
  102.   for(i=0;i<=NUM_FRIMG-1;i++)
  103.     rs_frimg[i]=(long)(sizeof(RSHDR)+strsize+imgsize+frstrsize+
  104.                        (int)rs_frimg[i]*sizeof(BITBLK));
  105. }
  106.  
  107. make_tedinfo()  /* rel. Adrressen der Strings in Tedinfo errechnen */
  108. { int i;
  109.   char *rel_stradr();
  110.   for(i=0;i<=NUM_TI-1;i++)
  111.     { rs_tedinfo[i].te_ptext=rel_stradr((int)rs_tedinfo[i].te_ptext);
  112.       rs_tedinfo[i].te_ptmplt=rel_stradr((int)rs_tedinfo[i].te_ptmplt);
  113.       rs_tedinfo[i].te_pvalid=rel_stradr((int)rs_tedinfo[i].te_pvalid);
  114.     }
  115. }
  116.  
  117. char *rel_stradr(strindex) /* berechnet rel. Adresse eines Strings */
  118. int strindex;              
  119. { int reladr=sizeof(RSHDR),i;
  120.   for(i=0;i<strindex;i++)
  121.     reladr +=strlen(rs_strings[i])+1;
  122.   return((char *)reladr);
  123. }
  124.  
  125. /* rel. Aressen der Icon-Masken und -Daten, und der Strings in 
  126.    den Iconblocks errechnen                                    */
  127. make_iconblk(strsize)
  128. int strsize;
  129. { int i,*rel_imgadr();
  130.   char *rel_stradr();
  131.   for(i=0;i<=NUM_IB-1;i++)
  132.     { rs_iconblk[i].ib_pmask=rel_imgadr((int)rs_iconblk[i].ib_pmask,strsize);
  133.       rs_iconblk[i].ib_pdata=rel_imgadr((int)rs_iconblk[i].ib_pdata,strsize); 
  134.       rs_iconblk[i].ib_ptext=rel_stradr((int)rs_iconblk[i].ib_ptext);
  135.     }
  136. }
  137.  
  138. /* rel. Adressen von ob_spec der Objekte errechnen */
  139. make_obj(strsize,imgsize,frstrsize,bitsize,frimgsize,tedsize) 
  140. int strsize,imgsize,frstrsize,bitsize,frimgsize,tedsize;
  141. { int i;
  142.   char *rel_stradr();
  143.   for(i=0;i<=NUM_OBS-1;i++)
  144.     { switch(rs_object[i].ob_type)
  145.         { case G_TEXT:    /* ob_spec zeigt auf Tedinfos */
  146.           case G_BOXTEXT:
  147.           case G_FTEXT:
  148.           case G_FBOXTEXT:rs_object[i].ob_spec=(char *)(sizeof(RSHDR)+
  149.                           strsize+imgsize+frstrsize+bitsize+frimgsize+
  150.                           (int)rs_object[i].ob_spec*sizeof(TEDINFO));
  151.                           break;
  152.           case G_BUTTON:  /* ob_spec zeigt auf Strings */
  153.           case G_STRING:
  154.           case G_TITLE: rs_object[i].ob_spec=
  155.                         rel_stradr((int)rs_object[i].ob_spec);
  156.                         break;
  157.                           /* ob_spec zeigt auf Bitblocks */
  158.           case G_IMAGE: rs_object[i].ob_spec=(char *)(sizeof(RSHDR)+
  159.                         strsize+imgsize+frstrsize+
  160.                         (int)rs_object[i].ob_spec*sizeof(BITBLK));
  161.                         break;
  162.                           /* ob_spec zeigt auf Iconblocks */
  163.           case G_ICON:rs_object[i].ob_spec=(char *)(sizeof(RSHDR)+
  164.                       strsize+imgsize+frstrsize+bitsize+frimgsize+tedsize+
  165.                       (int)rs_object[i].ob_spec*sizeof(ICONBLK));
  166.                       break;
  167.         }  
  168.     }
  169. }
  170.  
  171. /* rel. Adressen der Bäume errechnen */
  172. make_tree(strsize,imgsize,frstrsize,bitsize,frimgsize,tedsize,iconsize)
  173. int strsize,imgsize,frstrsize,bitsize,frimgsize,tedsize,iconsize;
  174. { int i;
  175.   for(i=0;i<=NUM_TREE-1;i++)
  176.     rs_trindex[i]=(long)(sizeof(RSHDR)+strsize+imgsize+frstrsize+bitsize+
  177.                          frimgsize+tedsize+iconsize+
  178.                          (int)rs_trindex[i]*sizeof(OBJECT));
  179. }
  180.  
  181. /* speichern der einzelnen Blöcke */  
  182. make_rsc(strsize,frstrsize,bitsize,frimgsize,tedsize,iconsize,objsize,
  183.          treesize)
  184. int strsize,frstrsize,bitsize,frimgsize,tedsize,iconsize,objsize,treesize;
  185. { int handle,i;
  186.   handle=Fcreate(RSC_DATNAME,0);
  187.   Fwrite(handle,(long)sizeof(RSHDR),&rscheader);
  188.   Fwrite(handle,(long)strsize,strptr);
  189.   for(i=0;i<=NUM_IMAGES-1;i++)
  190.     Fwrite(handle,(long)rs_imdope[i].dummy,(char *)rs_imdope[i].image);
  191.   Fwrite(handle,(long)frstrsize,(char *)rs_frstr);
  192.   Fwrite(handle,(long)bitsize,(char *)rs_bitblk);
  193.   Fwrite(handle,(long)frimgsize,(char *)rs_frimg);
  194.   Fwrite(handle,(long)tedsize,(char *)rs_tedinfo);
  195.   Fwrite(handle,(long)iconsize,(char *)rs_iconblk);
  196.   Fwrite(handle,(long)objsize,(char *)rs_object);
  197.   Fwrite(handle,(long)treesize,(char *)rs_trindex);
  198.   Fclose(handle);
  199. }
  200.  
  201. main()
  202. { int radr=0,strsize,imgsize,frstrsize,bitsize,frimgsize,tedsize,iconsize,
  203.       objsize,treesize;
  204.   strsize=str_size();  /* Größe des Stringblocks ermitteln */
  205.   imgsize=image_size(); /* Größe der Imageblocks ermitteln */
  206.   frstrsize=NUM_FRSTR*sizeof(long);
  207.   bitsize=NUM_BB*sizeof(BITBLK);
  208.   frimgsize=NUM_FRIMG*sizeof(long);
  209.   tedsize=NUM_TI*sizeof(TEDINFO);
  210.   iconsize=NUM_IB*sizeof(ICONBLK);
  211.   objsize=NUM_OBS*sizeof(OBJECT);
  212.   treesize=NUM_TREE*sizeof(long);
  213.   str_copy(&strsize);  /* Strings in einen Block kopieren  */
  214.   if(NUM_FRSTR!=0) make_frstr();
  215.   if(NUM_BB!=0) make_bitblk(strsize);
  216.   if(NUM_FRIMG!=0) make_frimg(strsize,imgsize,frstrsize);
  217.   if(NUM_TI!=0) make_tedinfo();
  218.   if(NUM_IB!=0) make_iconblk(strsize);
  219.   if(NUM_OBS!=0) make_obj(strsize,imgsize,frstrsize,bitsize,frimgsize,
  220.                           tedsize);
  221.   make_tree(strsize,imgsize,frstrsize,bitsize,frimgsize,tedsize,iconsize);
  222.     /* die rel. Adressen der Blöcke werden berechnet und in 
  223.        den RSC-HEADER eingetragen                           */
  224.   radr +=sizeof(RSHDR);rscheader.rsh_string=radr;
  225.   radr +=strsize;rscheader.rsh_imdata=radr;
  226.   radr +=imgsize;rscheader.rsh_frstr=radr;
  227.   radr +=frstrsize;rscheader.rsh_bitblk=radr;
  228.   radr +=bitsize;rscheader.rsh_frimg=radr;
  229.   radr +=frimgsize;rscheader.rsh_tedinfo=radr;
  230.   radr +=tedsize;rscheader.rsh_iconblk=radr;
  231.   radr +=iconsize;rscheader.rsh_object=radr;
  232.   radr +=objsize;rscheader.rsh_trindex=radr;
  233.     /* größe der RSC-Datei berechnen und in den RSC-HEADER eintragen */
  234.   radr +=treesize;rscheader.rsh_rssize=radr;
  235.     /* RSC-Datei wird generiert */
  236.   make_rsc(strsize,frstrsize,bitsize,frimgsize,tedsize,iconsize,
  237.            objsize,treesize);
  238.   free(strptr);
  239. }
  240.  
  241.       
  242.                             
  243.            
  244.          
  245.  
  246.