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.DOC < prev    next >
Text File  |  1989-11-16  |  5KB  |  89 lines

  1. Beschreibung zum Programm 'MAKERSC':
  2.  
  3. Die Idee zum Programm:
  4. Angeblich soll ja ein Programm Resource-Create existieren, das aus einer
  5. Resource-C-Source wieder eine richtige Resource-Datei macht. Der Sourcecode
  6. wird dabei per Include-Datei beim Compilieren geladen (ATARI ST GEM-Buch, 
  7. S.79). Da ich aber dieses Programm noch nirgends gesehen habe, dachte ich mir
  8. ich schreib es einfach selber. Der Nutzen des Programms liegt darin, daß 
  9. nachdem man mit dem RCS eine RSC-C-Source-Datei erzeugt hat, mit einem
  10. Editor Änderungen vornehmen kann, die man mit dem RCS nicht machen kann.
  11. Z.B. kann man nicht benutzte Bits bei ob_flags oder ob_state für eigene
  12. Anwendungen benutzen. Danach kann man mit dem Programm den Sourcecode wieder 
  13. in eine RSC-Datei umwandeln, da diese später, wenn man sie mit rsrc_load
  14. geladen hat, besser handhaben kann, als eine mit include geladen Source-
  15. Datei.
  16.  
  17. Das Programm hat eigentlich nur die Aufgabe, die relativen Adressen der 
  18. einzelnen Strukturen zu berechnen und diese im Resource-Header bzw. in den
  19. einzelnen Strukturen abzulegen. Der Resource-Header ist nach verschiedenen
  20. Dokumentationen wie folgt aufgebaut:
  21.  
  22. typedef struct rshdr
  23. {
  24.   int   rsh_vrsn;     /* Versionsnummer immer 1 */
  25.   int   rsh_object;   /* rel. Adresse der Objekt-Strukturen */
  26.   int   rsh_tedinfo;  /* rel. Adresse der Tedinfo-Strukturen */
  27.   int   rsh_iconblk;  /* rel. Adresse der Iconblk-Strukturen */
  28.   int   rsh_bitblk;   /* rel. Adresse der Bitblk-Strukturen */
  29.   int   rsh_frstr;    /* rel. Adresse der freien Strings */
  30.   int   rsh_string;   /* rel. Adresse der aller Strings */
  31.   int   rsh_imdata;   /* rel. Adresse der aller Image-Daten */
  32.   int   rsh_frimg;    /* rel. Adresse der freien Image-Daten */
  33.   int   rsh_trindex;  /* rel. Adresse der Tabelle der Objekt-Bäume */
  34.   int   rsh_nobs;     /* Anzahl der Objekte /*
  35.   int   rsh_ntree;    /* Anzahl der Objekt-Bäume /*
  36.   int   rsh_nted;     /* Anzahl der Tedinfos /*
  37.   int   rsh_nib;      /* Anzahl der Iconblks /*
  38.   int   rsh_nbb;      /* Anzahl der Bitblks /*
  39.   int   rsh_nstring;  /* Anzahl der Strings <- Fehler in Dokumentationen /*
  40.   int   rsh_nimages;  /* Anzahl der Images  <- Fehler in Dokumentationen /*
  41.   int   rsh_rssize;   /* Größe der RSC-Datei */
  42. } RSHDR;
  43.  
  44. Die Versionsnummer wird nicht gebraucht und einfach auf 1 gesetzt.
  45. Die relativen Adressen der Strukturen sind natürlich alle relativ bezüglich
  46. der Adresse des Dateianfangs, die später von rsrc_load gesetzt wird und
  47. die einzelnen relativen Adressen anschließend reloziert. Bei der Anzahl der
  48. Strings und der Anzahl der Images ist in sämtlichen von mir verwendeten
  49. Dokumentationen (auch im Atari ST Profibuch 2.Auflage!) ein Fehler: 
  50. Es wird nicht die Anzahl aller Strings und aller Images verlangt, sondern 
  51. die Anzahl der freien Strings und freien Images.
  52. Ein zweites Problem war, daß ich (meiner Meinung nach logisch) dachte, wenn
  53. man einmal die relative Adresse z.B. der Tedinfos errechnet hat, so muß man
  54. bei 'ob_spec' die Adresse relativ zu der Tedinfoadresse angeben, die ja 
  55. wiederum relativ zum Dateianfang ist. Dem ist aber nicht so! Es müssen 
  56. sämtliche Adressen, auch in den Strukturen, immer relativ zum Dateianfang
  57. angegeben werden.
  58.  
  59. Nun zu den einzelnen Routinen:
  60. Zu jeder Struktur gibt es eine eine make_... Routine(make_frstr,
  61. make_bitblk,make_frimg,make_tedinfo,make_iconblk,make_obj,make_tree). Sie
  62. ersetzt die absoluten Adressen die in einer Struktur vorkommen, durch die
  63. neu berechneten relativen Adressen. Zur Berechnung der relativen Adressen
  64. werden einfach die Längen der vorhergehenden Strukturen in Bytes addiert. 
  65. Dazu kommen dann noch die Längen der Elemente der aktuellen Struktur, die 
  66. vor dem Element stehen, dessen absolute Adresse durch die relative Adresse
  67. ersetzt werden soll. Um die relativen Adressen von Strings oder Images zu
  68. berechnen, werden noch die Routinen rel_stradr und rel_imgadr benötigt.
  69. Sie werden von den entsprechenden make_... Routinen aufgerufen.
  70. Bei make_obj wird die Berechnung der relativen ob_spec Adressen von
  71. ob_type abhängig gemacht. Bei G_TEXT,G_BOXTEXT,G_FTEXT und G_GFBOXTEXT
  72. sind dies relative Adressen von Tedinfos, bei G_BUTTON,G_STRING und 
  73. G_TITLE relative Adressen von Strings usw. Die Längen der Strukturen werden
  74. am Anfang von main() berechnet. Nur für die Strings und für die Images
  75. werden dazu zwei Unterroutinen, str_size und image_size, benötigt. Bei
  76. den Images ist die Berechnung der Länge besonders kompliziert, da auf die
  77. Images-Felder nicht direkt zugegriffen werden kann. Deshalb werden sie mit
  78. Hilfe der Breite und Höhe berechnet.
  79. Die Routine str_copy kopiert alle Strings in einen zusammenhängenden Block.
  80. Dies ist notwendig, da sonst die '\0' Zeichen nicht richtig gesetzt werden.
  81. Die Routine make_rsc speichert schließlich alle Strukturen in einer Datei
  82. ab.
  83. Die relativen Adressen der Strukturen werden in main in den Resource-Header
  84. eingetragen.
  85.  
  86. zum Programmieren verwendete Literatur: 
  87. Data Becker, Atari ST GEM
  88. Sybex, Atari ST Profibuch
  89.