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 t„nkte att du kanske skulle kunna tala om f”r mig 
>hur jag R„tt skall l„sa in s”kv„gen til mitt eget program s† att resurs filen 
>skall  kunna l„sas in r„tt.
>
>Jag har tappat bort lite gamla brev (blev lite f”r mycket Del tryckande) s† jag 
>har inte det brevet kvar l„ngre.

Ok, s†nt h„nder...  Jag har sj„lv tappat en del gammal post vid disk-krasher,
s† jag vet ju hur sv†rt det kan vara att gardera sig mot allt.

Egentligen s† „r det l”jligt enkelt att nyttja 'shel_read' korrekt, men tyv„rr
har informationen om hur man g”r det, och att det verkligen beh”vs, inte n†tt
ut till alla s† som den borde.  Det „r egentligen f”rv†nande, eftersom det „r
det enda _legala_ s„ttet att ta emot argument till nystartade GEM-program.

Det „r 'rena turen' att Pexec-metoden normalt ocks† fungerar.  Det „r fullt
m”jligt att n†gon framtida AES-version implementerar 'shel_write' utan n†got
utnyttjande av Pexec (ex-vis genom Fopen,Fread,Fclose + n†gon thread_start).
D† skulle Pexec-metoden att l„sa argumentet inte l„ngre 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
returv„rdet av funktionen.  Det utnyttjas h„r bara som en felindikator.  Som
ofta „r fallet i GEM-anrop s†  betyder h„r ett returv„rde av noll att n†got
„r felaktigt (s† detaljerade felangivelser funkar inte).  Detta skall normalt
aldrig intr„ffa f”r den h„r funktionen...

Det verkliga resultatet, dvs den egna s”kv„gen (inkl program-namn) samt de
argument som nyttjades vid anropet, hamnar i de b†da str„ngbuffertar vars
addresser anv„nds 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 s†dana metoder utan genom GUI.

Eftersom det grundl„ggande nyttjandet av shel_read „r s† enkelt, s† t„nker
jag inte visa n†got exempel p† enbart det.  Det „r b„ttre att jag ger dig
ett mer anv„ndbart exempel som ocks† visar hur du korrekt ska finna ditt
'eget namn' s† som det kr„vs att man anv„nder det i AV/VA-funktioner...

Allts† kan man g”ra s† h„r:
----- 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 M¸STE anropas mycket snart efter att
man startat applikationen (dock naturligtvis _efter_ 'appl_init').  Detta f”r
att vissa AES-implementeringar inte allokerar separata str„ngar f”r varje APP
utan nyttjar samma str„ngar om igen...  Du m†ste allts† snabbast m”jligt ta
chansen att 's„kra' informationen i dina egna interna str„ngar !!!

Du skall naturligtvis _aldrig_ anropa den funktionen igen, eftersom senare
anrop kan f”rst”ra den information man fick vid det f”rsta anropet...
D„rf”r „r det l„mpligt att bara anropa den ifr†n en init-funktion som endast
anv„nds vid uppstart av applikationen.

D„refter kan du l„tt nyttja denna s”kv„g f”r alla m”jliga 'egna' filer som du
beh”ver komma †t, s†som 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 s”kmetoder etc,
men detta visar iaf grunderna.  Det „r bara beklagligt att majoriteten av
programmmerarna aldrig bryr sig om att anv„nda denna metod..., eftersom
det „r den enda _legala_ och av Atari rekommenderade metoden f”r ett GEM-
program att finna s†v„l sin s”kv„g som sina anrops-argument.
