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 >
Wrap
Text File
|
1989-11-16
|
5KB
|
89 lines
Beschreibung zum Programm 'MAKERSC':
Die Idee zum Programm:
Angeblich soll ja ein Programm Resource-Create existieren, das aus einer
Resource-C-Source wieder eine richtige Resource-Datei macht. Der Sourcecode
wird dabei per Include-Datei beim Compilieren geladen (ATARI ST GEM-Buch,
S.79). Da ich aber dieses Programm noch nirgends gesehen habe, dachte ich mir
ich schreib es einfach selber. Der Nutzen des Programms liegt darin, daß
nachdem man mit dem RCS eine RSC-C-Source-Datei erzeugt hat, mit einem
Editor Änderungen vornehmen kann, die man mit dem RCS nicht machen kann.
Z.B. kann man nicht benutzte Bits bei ob_flags oder ob_state für eigene
Anwendungen benutzen. Danach kann man mit dem Programm den Sourcecode wieder
in eine RSC-Datei umwandeln, da diese später, wenn man sie mit rsrc_load
geladen hat, besser handhaben kann, als eine mit include geladen Source-
Datei.
Das Programm hat eigentlich nur die Aufgabe, die relativen Adressen der
einzelnen Strukturen zu berechnen und diese im Resource-Header bzw. in den
einzelnen Strukturen abzulegen. Der Resource-Header ist nach verschiedenen
Dokumentationen wie folgt aufgebaut:
typedef struct rshdr
{
int rsh_vrsn; /* Versionsnummer immer 1 */
int rsh_object; /* rel. Adresse der Objekt-Strukturen */
int rsh_tedinfo; /* rel. Adresse der Tedinfo-Strukturen */
int rsh_iconblk; /* rel. Adresse der Iconblk-Strukturen */
int rsh_bitblk; /* rel. Adresse der Bitblk-Strukturen */
int rsh_frstr; /* rel. Adresse der freien Strings */
int rsh_string; /* rel. Adresse der aller Strings */
int rsh_imdata; /* rel. Adresse der aller Image-Daten */
int rsh_frimg; /* rel. Adresse der freien Image-Daten */
int rsh_trindex; /* rel. Adresse der Tabelle der Objekt-Bäume */
int rsh_nobs; /* Anzahl der Objekte /*
int rsh_ntree; /* Anzahl der Objekt-Bäume /*
int rsh_nted; /* Anzahl der Tedinfos /*
int rsh_nib; /* Anzahl der Iconblks /*
int rsh_nbb; /* Anzahl der Bitblks /*
int rsh_nstring; /* Anzahl der Strings <- Fehler in Dokumentationen /*
int rsh_nimages; /* Anzahl der Images <- Fehler in Dokumentationen /*
int rsh_rssize; /* Größe der RSC-Datei */
} RSHDR;
Die Versionsnummer wird nicht gebraucht und einfach auf 1 gesetzt.
Die relativen Adressen der Strukturen sind natürlich alle relativ bezüglich
der Adresse des Dateianfangs, die später von rsrc_load gesetzt wird und
die einzelnen relativen Adressen anschließend reloziert. Bei der Anzahl der
Strings und der Anzahl der Images ist in sämtlichen von mir verwendeten
Dokumentationen (auch im Atari ST Profibuch 2.Auflage!) ein Fehler:
Es wird nicht die Anzahl aller Strings und aller Images verlangt, sondern
die Anzahl der freien Strings und freien Images.
Ein zweites Problem war, daß ich (meiner Meinung nach logisch) dachte, wenn
man einmal die relative Adresse z.B. der Tedinfos errechnet hat, so muß man
bei 'ob_spec' die Adresse relativ zu der Tedinfoadresse angeben, die ja
wiederum relativ zum Dateianfang ist. Dem ist aber nicht so! Es müssen
sämtliche Adressen, auch in den Strukturen, immer relativ zum Dateianfang
angegeben werden.
Nun zu den einzelnen Routinen:
Zu jeder Struktur gibt es eine eine make_... Routine(make_frstr,
make_bitblk,make_frimg,make_tedinfo,make_iconblk,make_obj,make_tree). Sie
ersetzt die absoluten Adressen die in einer Struktur vorkommen, durch die
neu berechneten relativen Adressen. Zur Berechnung der relativen Adressen
werden einfach die Längen der vorhergehenden Strukturen in Bytes addiert.
Dazu kommen dann noch die Längen der Elemente der aktuellen Struktur, die
vor dem Element stehen, dessen absolute Adresse durch die relative Adresse
ersetzt werden soll. Um die relativen Adressen von Strings oder Images zu
berechnen, werden noch die Routinen rel_stradr und rel_imgadr benötigt.
Sie werden von den entsprechenden make_... Routinen aufgerufen.
Bei make_obj wird die Berechnung der relativen ob_spec Adressen von
ob_type abhängig gemacht. Bei G_TEXT,G_BOXTEXT,G_FTEXT und G_GFBOXTEXT
sind dies relative Adressen von Tedinfos, bei G_BUTTON,G_STRING und
G_TITLE relative Adressen von Strings usw. Die Längen der Strukturen werden
am Anfang von main() berechnet. Nur für die Strings und für die Images
werden dazu zwei Unterroutinen, str_size und image_size, benötigt. Bei
den Images ist die Berechnung der Länge besonders kompliziert, da auf die
Images-Felder nicht direkt zugegriffen werden kann. Deshalb werden sie mit
Hilfe der Breite und Höhe berechnet.
Die Routine str_copy kopiert alle Strings in einen zusammenhängenden Block.
Dies ist notwendig, da sonst die '\0' Zeichen nicht richtig gesetzt werden.
Die Routine make_rsc speichert schließlich alle Strukturen in einer Datei
ab.
Die relativen Adressen der Strukturen werden in main in den Resource-Header
eingetragen.
zum Programmieren verwendete Literatur:
Data Becker, Atari ST GEM
Sybex, Atari ST Profibuch