

     ENVIRO.ACC/PRG   &   AUTOENVR.PRG    (version 2)
    =================================================

       Freeware by Pascal Fellerich




ZWECK:
  Das Setzen und Benutzen der Environment-Strings.

  Der Sinn von Environment-Strings, auch Environment-Variablen
genannt, liegt darin, anderen Programmen irgendwelche Informationen
zugnglich zu machen. Das Desktop oder auch 'COMMAND.PRG' (das
Original von Atari!) benutzen diese Informationen um beispielsweise
ein zu startendes Programm zu finden. Auch das AES benutzt diese
Variablen, um RSC-Files zu finden. Das Problem ist bekannt: Man
klickt mit gedrcktem rechten Mausknopf ein Programm in einem
inaktiven Fenster an; es wird gestartet und... findet natrlich seine
RSC nicht. Das kommt daher, da bei der Suche nach der Resource
zuerst der aktive Pfad durchsucht wird, anschlieend alle Pfade, die
hinter der Environment-Variablen 'PATH=' angegeben sind - aber dort
ist als Standardeinstellung nur A:\ oder C:\ angegeben.

  Durch Setzen dieser Variable auf die meistbenutzen Pfade erreicht
man nun, da die RSC's gefunden werden. Von command.prg aus geht's
sogar MSDOS-like: alle 'externen Befehle', sprich Programme, in einen
Ordner schmeien und die Environment-Variable entsprechend setzen.
Erfolg: unabhngig vom eingestellten Pfad findet COMMAND seine
Programme.

  Neuerdings kommen diese Environment-vars wieder in Mode: GEMINI
benutzt sie ausgiebig, und auch der TURBOASS, mit dem die
vorliegenden Programme assembliert wurden, benutzt sie. (siehe
Beispiele).



BEISPIELE:
  Im DESKTOP.ENV-File steht folgendes:
        PATH=;E:\UTILITY\;E:\;C:\;D:\;F:\;G:\;A:\
        SIGMA=E:\ASM\
        RSC2S=E:\ASM\RSC2S\
        SCRAPDIR=C:\CLIPBRD\
  In diesem Fall gibt's 4 Environment-Variablen:
  1. PATH= : die vom Betriebssystem benutzte Variable. Im Beispiel
wird also zuerst im Ordner UTILITY auf E: gesucht; falls das nix
bringt, geht die Suche weiter auf E:\, C:\ etc. Ganz zum Schlu erst
erfolgt der Zugriff auf A: - weil A: das langsamste Kamel in der
Karawane ist.
  2. SIGMA= : diese Variable beeinflut den TURBOASS - die folgende
Pfadangabe gibt an, wo der Assembler seine .DAT, .INF Dateien suchen
soll.
  3. RSC2S= : fr ein weiteres Programm
  4. SCRAPDIR= : Wo das Clipboard-Verzeichnis liegt! Wenn ENVIRO
diesen String vorfindet, (das '='-Zeichen ist wichtig!) dann setzt
das ACC auch mit 'SCRP_WRITE' den Zugriffspfad fr das Clipboard.



WICHTIG!!!!!!!!!!
  Die erste Variable, PATH=, sollte immer 'PATH=;' lauten, da das
Betriebssystem das Semikolon hinter '=' rcksichtslos berschreibt.


FUNKTIONSWEISE (Intern)

  AUTOENVR.PRG mu im Auto-Ordner liegen. Dieses Programm richtet die
Emvironment Strings ein und versucht auch, das File 'DESKTOP.ENV' zu
laden. Autoenvr mu jetzt nicht mehr als letztes Programm im
Auto-Ordner liegen. Autoenvr trgt einen Cookie in den CookieJar ein;
wenn keiner vorhanden ist, wird selbst einer eingerichtet -
allerdings werden keine 'System'-Cookies wie _CPU, _MCH, _VDO (fr
den Butler James wichtig!) eingerichtet.

  ENVIRO.ACC setzt von der aktuellen Applikation an abwrts alle
P_ENV-Zeiger der Prozedescriptoren. Sogar wenn innerhalb eines
Programms, das von einer Shell aufgerufen wurde, diese Strings
verndert werden, bekommt das Desktop dies mit.

  WICHTIG: Das Accessory arbeitet nur, wenn AUTOENVR installiert ist.
Speicherplatzsparer knnen auch ohne das Accessory leben - das Teil
luft nmlich auch als .PRG !


PROBLEME:
=========
  Die Methode, das Environment eines Programms direkt zu
manipulieren, ist vom Prinzip her nicht gerade die allersauberste.
Trotzdem funktioniert's mit allen TOS-Versionen und die wenigen
Programme, die die Environment-Strings benutzen, stren sich absolut
nicht daran.


RATSCHLGE FR PROGRAMMIERER:
=============================
  Bei jedem Programmaufruf mit PEXEC als Environment-Pointer einen
Nullpointer (0L, kein Zeiger auf ein Nullbyte!!) bergeben. Dann
knnert sich das GEMDOS um das Environment. Um dem gestarteten
Programm einige weitere, eigene Strings zu bergeben, wre die beste
Methode, zuerst das eigene Environment ber den P_ENV-Zeiger in der
Basepage zu ermitteln (Vorsicht: der Zeiger knnte in der
Zwischenzeit gendert worden sein!!), dieses in einen eigenen Puffer
zu kopieren; anschlieend die eigenen Strings hinzukopieren und dann
diesen Puffer zu bergeben.
  Um Environment-variablen zu finden (im Env. des AES!!) sollte man
ja SHEL_ENVR benutzen - diese Funktion liefert nmlich die richtigen
Werte.
  Wenn eine Applikation eigene Files nachldt, dann sollte zur
Ermittlung des kompletten Pfadnamens die Funkion SHEL_FIND (AES 124)
benutzt werden. Denn diese Funktion benutzt die Environment-Variable
'PATH=', um diese Datei zu finden.
  Oder, wie im Falle des TURBOASSEMBLERS, ist es denkbar, da eine
Applikation eine eigene Variable benutzt.

DER COOKIE:
===========
  AutoEnvr.PRG setzt einen Cookie ein:
Kennung:    ENVR
Daten:      Zeiger auf LongWord-Array

Array:      ARR[0] = Pointer auf AES-Environment
            ARR[1] = Lnge des Puffers
            ARR[2] = Pointer auf E_INFO - Funktion
            ARR[3] =    "     "  E_SFIRST     "
            ARR[4] =    "     "  E_SNEXT      "

Funktionen:
-----------
  Die Funktionen werden ganz normal mit den Daten auf dem Stack
aufgerufen. In C: retval=E_xxx(data,...)

  1. E_INFO:
        C-Deklaration:  long e_info()
     AUFRUF:
        C:    version=e_info();
        GFA:  version%=C:e_info%()
     WERTE:
        version: upper word: Versionsnummer, lower word: Unterrev.

  2. E_SFIRST:
        C-Deklaration:  long e_sfirst(pattern)
                                char *pattern;
     AUFRUF:
        C:    found=e_sfirst(pattern);
        GFA:  found%=C:e_sfirst(L:V:pattern$)
     WERTE:
        pattern: Nullterminierter String mit dem Suchmuster.
        found:   entweder -1.L oder Adresse, wo was gefunden wurde.

  3. E_SNEXT:
        C-Deklaration:  long e_snext()
     AUFRUF:
        C:    found=e_sfirst();
        GFA:  found%=C:e_sfirst()
     WERTE:
        found:   entweder -1.L oder Adresse, wo was gefunden wurde.

  Der Patternstring darf maximal 20 Zeichen lang sein, sonst wird
nicht gesucht. Dafr darf der String aber beliebig kompliziert sein.
Als Allquantor gilt '*' (quivalent fr Null bis ... Zeichen) und als
Einzelquantor gilt '?' (ein Zeichen).
Also eine Konstruktion wie ?*MS?D*?*O**S?* ist erlaubt. Wrde
brigens auf 'COMSPEC=D:\TOS\XYZ.PRG
                ^^    ^   ^^          passen.

  Ansonsten arbeiten diese Funktionen wie die Gemdos-Funktionen
FSFIRST und FSNEXT.



ZUM FORMAT der *.ENV-Datei:
  Jede Zeile enthlt eine Variable und mu mit CR/LF oder CR oder LF
abgeschlossen sein. Es wird alles ausgewertet!
Zum Editieren entweder das Accessory oder einen ASCII-Editor
benutzen. Allerdings werden Vernderungen der Datei ohne das ACC erst
beim nchsten Booten aktiv.

BESCHRNKUNGEN:
  TOS-seitig gibt's keine - auer da das AES sich bei 'PATH' auf 50
Zeichen beschrnken soll. Nur das Accessory beschrnkt sich auf
maximal 15 Variablen zu hchstens 60 Zeichen.



PROBLEM-MELDUNGEN UND EVENTUELLE SPENDEN AN:

   Pascal Fellerich
   45, rue des Gents
   L-3482 Dudelange
   (Luxembourg)

