To: faltrion@alfaskop.net (Christian Andersson)
From: dlanor@oden.se (Ronald Andersson)
Organization: 
Subject: Re: Aj!
X-Mailer: NEWSie Version 0.88 (Atari)

>Hmm sl mig inte nu, men jag tnkte att du kanske skulle kunna tala om fr mig 
>hur jag Rtt skall lsa in skvgen til mitt eget program s att resurs filen 
>skall  kunna lsas in rtt.
>
>Jag har tappat bort lite gamla brev (blev lite fr mycket Del tryckande) s jag 
>har inte det brevet kvar lngre.

Ok, snt hnder...  Jag har sjlv tappat en del gammal post vid disk-krasher,
s jag vet ju hur svrt det kan vara att gardera sig mot allt.

Egentligen s r det ljligt enkelt att nyttja 'shel_read' korrekt, men tyvrr
har informationen om hur man gr det, och att det verkligen behvs, inte ntt
ut till alla s som den borde.  Det r egentligen frvnande, eftersom det r
det enda _legala_ sttet att ta emot argument till nystartade GEM-program.

Det r 'rena turen' att Pexec-metoden normalt ocks fungerar.  Det r fullt
mjligt att ngon framtida AES-version implementerar 'shel_write' utan ngot
utnyttjande av Pexec (ex-vis genom Fopen,Fread,Fclose + ngon thread_start).
D skulle Pexec-metoden att lsa argumentet inte lngre fungera, utan endast
shel_read-metoden.


Definitionen av shel_read:

WORD shel_read ( BYTE *sh_rpcmd, BYTE *sh_rptail );

Detta betyder allts att det egentliga resultatet av anropet inte kommer som
returvrdet av funktionen.  Det utnyttjas hr bara som en felindikator.  Som
ofta r fallet i GEM-anrop s  betyder hr ett returvrde av noll att ngot
r felaktigt (s detaljerade felangivelser funkar inte).  Detta skall normalt
aldrig intrffa fr den hr funktionen...

Det verkliga resultatet, dvs den egna skvgen (inkl program-namn) samt de
argument som nyttjades vid anropet, hamnar i de bda strngbuffertar vars
addresser anvnds som 'sh_rpcmd' och 'sh_rptail' (enligt ovanst. def.) i det
anrop som startade programmet.  Obs. att detta ger 'CLI-liknande' info ven
i de fall programmet inte startats med sdana metoder utan genom GUI.

Eftersom det grundlggande nyttjandet av shel_read r s enkelt, s tnker
jag inte visa ngot exempel p enbart det.  Det r bttre att jag ger dig
ett mer anvndbart exempel som ocks visar hur du korrekt ska finna ditt
'eget namn' s som det krvs att man anvnder det i AV/VA-funktioner...

Allts kan man gra s hr:
----- Start av exempel 1 -----

/* vi ska definiera 3 stycken 'globala' text-matriser */

char    own_APP_path[128];	/* ska bli renodlad egen 'path' */
char    own_APP_args[128];	/* ska bli egna programmets argument-text */
char    own_APP_name[9];        /* ska bli eget namn till AV/VA-funktioner */

/* sedan kommer en funktion som vid anrop fyller i dessa 3 texter med data */

int    init_own_APP_info(void)
{   int     flag;
    char    *temp_s;

    flag = shel_read(own_APP_path, own_APP_args);
    if  (flag == 0)
        return (-1);    /* ooops: general-fel (ska aldrig ske) */
    temp_s = strrchr(own_APP_path, '\\'); /* obs: inte 'strchr' utan 'strrchr */
    if  (temp_s == NULL)
        return (-2);    /* ooops: idiot-fel (ska aldrig ske) */
    *temp_s++ = 0;  /* terminera renodlad 'path' utan program-namn */
    strncpy(own_APP_name, temp_s, 8);   /* kopiera max 8 tecken som APP-namn */
    strcat(own_APP_path, "\\");         /* avsluta own_APP_path med '\' */
    own_APP_name[8] = 0;        /* tvinga in namn-terminering som tecken 9 */
    temp_s = strchr(temp_s, '.');       /* hitta ev 'tidig' namn-extension */
    *temp_s = 0;                /* kapa namn-extension */
    while (strlen(own_APP_name) < 8)    /* APP-namn ska ha exakt 8 tecken */
        strcat(own_APP_name, " ");      /* fyll ut APP-namnet med 'space' */
    return (1);         /* returnera positiv kod som OK-flagga */
};

----- Exempel 1 slut -----

Notera att funktionen init_own_APP_info MSTE anropas mycket snart efter att
man startat applikationen (dock naturligtvis _efter_ 'appl_init').  Detta fr
att vissa AES-implementeringar inte allokerar separata strngar fr varje APP
utan nyttjar samma strngar om igen...  Du mste allts snabbast mjligt ta
chansen att 'skra' informationen i dina egna interna strngar !!!

Du skall naturligtvis _aldrig_ anropa den funktionen igen, eftersom senare
anrop kan frstra den information man fick vid det frsta anropet...
Drfr r det lmpligt att bara anropa den ifrn en init-funktion som endast
anvnds vid uppstart av applikationen.

Drefter kan du ltt nyttja denna skvg fr alla mjliga 'egna' filer som du
behver komma t, ssom i exemplet nedan.

----- Start av exempel 2 -----

int load_own_RSC(char *filename) /* filename ska vara 'rent', utan 'path' */
{   char    temp_path[128];
    int     flaghandle;

    strcpy(temp_path, own_APP_path);              /* Starta med ren 'path' */
    strcat(temp_path, filename);                 /* avsluta med 'filename' */
    if  (   ( flaghandle = Fopen(temp_path) )  ==  0   )  /* Finns filen ? */
    {   Fclose(flaghandle);                 /* Ja va bra !!! Den fanns !!! */
        return  (rsrc_load(temp_path));    /* Den tar vi bara, helt klart. */
    }
    else                           /* Va i helvete nu ra..., var e filen ? */
    {   strcpy(temp_path, filename);
        if  (shel_find(temp_path) != 0)      /* Prova om AES hittar den... */
            return  (rsrc_load(temp_path));  /* Ah... det ordnade sig iaf. */
        else                     /* NIX FIL ?!? */
            return (-1);         /* J*vla, f*rbannade skiiit etc... etc... */
    }
}

----- Exempel 2 slut -----

Naturligtvis kan man variera temat, med flera alternativa skmetoder etc,
men detta visar iaf grunderna.  Det r bara beklagligt att majoriteten av
programmmerarna aldrig bryr sig om att anvnda denna metod..., eftersom
det r den enda _legala_ och av Atari rekommenderade metoden fr ett GEM-
program att finna svl sin skvg som sina anrops-argument.
