;/* showprefs.c - Execute me to compile me with SAS C 5.10
LC -b0 -d0 -cfis -v -j73 showprefs.c
Blink FROM showprefs.o TO showprefs LIBRARY LIB:Amiga.lib
quit
**
** The following example shows a way to read a Preferences file.
**
** showprefs.c - parse and show some info from an IFF Preferences file
** NOTE: This example requires upcoming 2.1 prefs/ include files.
**
** IMPORTANT!! This example is not linked with startup code (eg. c.o).
** It uses strictly direct AmigaDOS stdio, and also demonstrates
** direct ReadArgs argument parsing. Therefore it is a CLI-only
** example. If launched from Workbench, packet errors would occur
** since the WbStartup message is still sitting in the process's
** pr_MsgPort, and the code would never be unloaded from memory.
*/
#include <exec/types.h>
#include <dos/dos.h>
#include <libraries/dos.h>
#include <libraries/iffparse.h>
#include <prefs/prefhdr.h>
#include <prefs/font.h>
#include <prefs/icontrol.h>
#include <prefs/input.h>
#include <prefs/overscan.h>
#include <prefs/printergfx.h>
#include <prefs/printertxt.h>
#include <prefs/screenmode.h>
#include <prefs/serial.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/iffparse_protos.h>
struct ExecBase *SysBase;
struct Library *DOSBase;
struct Library *IFFParseBase;
static UBYTE *IFFErrTxt[] = {
"EOF", /* (end of file, not an error) */
"EOC", /* (end of context, not an error) */
"no lexical scope",
"insufficient memory",
"stream read error",
"stream write error",
"stream seek error",
"file corrupt",
"IFF syntax error",
"not an IFF file",
"required call-back hook missing",
NULL, /* (return to client, never shown) */
};
LONG main(void)
{
struct RDArgs *readargs = NULL;
LONG rargs[2];
struct IFFHandle *iffhandle;
struct ContextNode *cnode;
struct StoredProperty *hdrsp;
struct StoredProperty *sp;
UBYTE *filename = NULL;
LONG ifferror, error = 0, rc = RETURN_OK;
/* We must set up SysBase (we are not linked with startup code) */
SysBase = (*((struct Library **) 4));
/* This no-startup-code example may not be used from Workbench */
if ((((struct Process *)FindTask(NULL))->pr_CLI)==NULL)
return(RETURN_FAIL);
if (DOSBase = OpenLibrary("dos.library", 37)) {
if (IFFParseBase = OpenLibrary ("iffparse.library", 37)) {
readargs = ReadArgs("FILE/A", rargs, NULL);
if( (readargs) && (rargs[0]) ) {
filename = (UBYTE *)rargs[0];
/* allocate an IFF handle */
if (iffhandle = AllocIFF()) {
/* Open the file for reading */
if (iffhandle->iff_Stream = (LONG)Open(filename, MODE_OLDFILE)) {
/* initialize the iff handle */
InitIFFasDOS (iffhandle);
if ((ifferror = OpenIFF (iffhandle, IFFF_READ)) == 0) {
PropChunk(iffhandle, ID_PREF, ID_PRHD);
PropChunk(iffhandle, ID_PREF, ID_FONT);
PropChunk(iffhandle, ID_PREF, ID_ICTL);
PropChunk(iffhandle, ID_PREF, ID_INPT);
PropChunk(iffhandle, ID_PREF, ID_OSCN);
PropChunk(iffhandle, ID_PREF, ID_PGFX);
PropChunk(iffhandle, ID_PREF, ID_PTXT);
PropChunk(iffhandle, ID_PREF, ID_SCRM);
PropChunk(iffhandle, ID_PREF, ID_SERL);
for (;;) {
ifferror = ParseIFF(iffhandle, IFFPARSE_STEP);
if (ifferror == IFFERR_EOC)
continue;
else if (ifferror)
break;
/* Do nothing is this is a PrefHeader chunk,
* we'll pop it later when there is a pref
* chunk.
*/
if (cnode = CurrentChunk(iffhandle))
if (cnode->cn_ID == ID_PRHD || cnode->cn_ID == ID_FORM)
continue;
/* Get the preferences header, stored previously */
hdrsp = FindProp(iffhandle, ID_PREF, ID_PRHD);
if (sp = FindProp(iffhandle, ID_PREF, ID_FONT)) {
Printf("FrontPen: %ld\n",
((struct FontPrefs *)sp->sp_Data)->fp_FrontPen);
Printf("BackPen: %ld\n",
((struct FontPrefs *)sp->sp_Data)->fp_BackPen);
Printf("DrawMode: %ld\n",
((struct FontPrefs *)sp->sp_Data)->fp_DrawMode);
Printf("Font: %s\n",
(LONG)((struct FontPrefs *)sp->sp_Data)->fp_Name);
Printf("ta_YSize: %ld\n",
((struct FontPrefs *)sp->sp_Data)->fp_TextAttr.ta_YSize);
Printf("ta_Style: %ld\n",
((struct FontPrefs *)sp->sp_Data)->fp_TextAttr.ta_Style);
Printf("ta_Flags: %ld\n",
((struct FontPrefs *)sp->sp_Data)->fp_TextAttr.ta_Flags);
} else if (sp = FindProp(iffhandle, ID_PREF, ID_ICTL)) {
Printf("TimeOut: %ld\n",
((struct IControlPrefs *)sp->sp_Data)->ic_TimeOut);
Printf("MetaDrag: %ld\n",
((struct IControlPrefs *)sp->sp_Data)->ic_MetaDrag);
Printf("WBtoFront: %ld\n",
((struct IControlPrefs *)sp->sp_Data)->ic_WBtoFront);
Printf("FrontToBack: %ld\n",
((struct IControlPrefs *)sp->sp_Data)->ic_FrontToBack);
Printf("ReqTrue: %ld\n",
((struct IControlPrefs *)sp->sp_Data)->ic_ReqTrue);
Printf("ReqFalse: %ld\n",
((struct IControlPrefs *)sp->sp_Data)->ic_ReqFalse);
/* etc */
} else if (sp = FindProp(iffhandle, ID_PREF, ID_INPT)) {
Printf("PointerTicks: %ld\n",
((struct InputPrefs *)sp->sp_Data)->ip_PointerTicks);
Printf("DoubleClick/Secs: %ld\n",
((struct InputPrefs *)sp->sp_Data)->ip_DoubleClick.tv_secs);
Printf("DoubleClick/Micro: %ld\n",
((struct InputPrefs *)sp->sp_Data)->ip_DoubleClick.tv_micro);
/* etc */
} else if (sp = FindProp(iffhandle, ID_PREF, ID_OSCN)) {
Printf("DisplayID: 0x%lx\n",
((struct OverscanPrefs *)sp->sp_Data)->os_DisplayID);
/* etc */
} else if (sp = FindProp(iffhandle, ID_PREF, ID_PGFX)) {
Printf("Aspect: %ld\n",
((struct PrinterGfxPrefs *)sp->sp_Data)->pg_Aspect);
/* etc */
} else if (sp = FindProp(iffhandle, ID_PREF, ID_PTXT)) {
Printf("Driver: %s\n",
(LONG)((struct PrinterTxtPrefs *)sp->sp_Data)->pt_Driver);
/* etc */
} else if (sp = FindProp(iffhandle, ID_PREF, ID_SCRM)) {
Printf("DisplayID: 0x%lx\n",
((struct ScreenModePrefs *)sp->sp_Data)->sm_DisplayID);
/* etc */
} else if (sp = FindProp(iffhandle, ID_PREF, ID_SERL)) {
Printf("BaudRate: %ld\n",
((struct SerialPrefs *)sp->sp_Data)->sp_BaudRate);
/* etc */
}
}
CloseIFF(iffhandle);
}
if (ifferror != IFFERR_EOF) {
rargs[1] = (LONG)IFFErrTxt[-ifferror - 1];
VFPrintf(Output(), "%s: %s\n", rargs);
rc = RETURN_FAIL;
}
Close(iffhandle->iff_Stream);
} else
error = IoErr();
FreeIFF(iffhandle);
} else {
VFPrintf(Output(), "Can't allocate IFF handle\n", NULL);
rc = RETURN_FAIL;
}
} else
error = IoErr();
CloseLibrary(IFFParseBase);
SetIoErr(error);
if (error) {
rc = RETURN_FAIL;
PrintFault(error, filename ? filename : "");
}
}
if(readargs) FreeArgs(readargs);
CloseLibrary(DOSBase);
} else {
rc = RETURN_FAIL;
Write(Output(), "Kickstart 2.0 required\n", 23);
}
return(rc);
}
[Back to Amiga Developer Docs]