home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d1xx
/
d164
/
c-functions
/
makeautoreq.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-22
|
7KB
|
213 lines
/* Program for generating simple requesters dynamicaly */
/* (C)Copyright 1988 by Lars Thuring */
/* May be freely distributed and used for any purpose as long as
the Copyright notice is left unchanged. */
/* Fri 13 nov 1987 V1.0 Make #2 */
/* 24 nov 1987 V1.1 Library version */
/* 18 jan 1988 V1.2 Adjusted for standard return values */
/* 19 feb 1988 V1.3 *Data[] must be concluded by NULL pointer */
/* 24 apr 1988 V1.4 j*=10+p[++i]-'0'; does not compile correct,
Renamed from MakeSimpleReq.c */
/* 17 may 1988 V1.5 01:22 "Bug" found in mb.c also here -
adjust with i-- after ++i failed ... */
/* 11 sep 1988 V1.6 Rendering of yes/no text. Thanks AutoDocs. */
#include <exec/types.h>
#include <intuition/intuition.h>
#define THETEXT 0x01
#define YESTXT 0x02
#define NOTXT 0x04
#define STRUCTSIZE sizeof(struct IntuiText)
int MakeAutoRequest(); /* Purpose of this ... */
/* No Globals */
int MakeAutoRequest(w,Data) /* Make a requester in window w */
struct Window *w; /* Return -1 if couldn't make it */
UBYTE *Data[]; /* Else return TRUE or FALSE */
{
USHORT IntuiTextLength(); /* Return length of txt in pixels */
BOOL Adigit(); /* Return TRUE if ASCII digit */
UBYTE *MyMem,*AllocMem(); /* Our buffer somwhere */
USHORT MyMemorySize; /* Size of memory area */
USHORT OpCode,link,i,j; /* OpCode, mode and trash */
USHORT ix=0; /* Loop index for Data[] */
USHORT strings=0; /* Number of string passed as argument */
UBYTE *p, *p2; /* Data pointers */
USHORT OptStart,OptEnd; /* Area of options */
USHORT ReqW=10, ReqH=10; /* Physical parameters */
USHORT WidestText=0; /* To determine min width of requester */
UBYTE FrontPen=AUTOFRONTPEN,BackPen=AUTOBACKPEN; /* Default defaults */
SHORT LeftEdge=AUTOLEFTEDGE,TopEdge=AUTOTOPEDGE;
SHORT Xtxt=LeftEdge, Ytxt=TopEdge; /* Init offsets */
USHORT Yc = 8; /* Linespacing */
USHORT DrawMode=AUTODRAWMODE;
struct TextAttr *MyTextFont=NULL; /* Not likely to be changed */
struct IntuiText *them; /* "Casted" into place later */
struct IntuiText *Body=NULL,*Plus=NULL,*Minus=NULL;
struct IntuiText *Previous=NULL;
USHORT PFlags=NULL,MFlags=NULL; /* For terminating requester */
/* Function: count strings, set values and write them into structs */
FOREVER /* Count strings passed */
if (NOT Data[strings++] ) break;
MyMemorySize = STRUCTSIZE * strings; /* The necessary area */
MyMem = AllocMem( MyMemorySize, 0 ); /* Get it from anywhere */
if (MyMem)
them = (struct IntuiText *) MyMem; /* */
else
return (-1); /* If couldn't get memory return error */
while (--strings)
{
p=p2=Data[ix]; /* Pointers to the text data */
OptStart=strinstr( p, '[' )-1; /* Start of options... */
OptEnd=strinstr( p, ']' )-1; /* ...and end */
p[OptEnd]='\0'; /* Split string into 2 strings */
while (*p2++); /* Point at text to be shown */
p[OptEnd]=']';
/* Set the defaults */
link = TRUE; /* Untill Positive- / Negative- text */
OpCode = THETEXT;
/* Now determine parameters and fill in current structs */
for (i=OptStart; i<OptEnd; i++) /* Find user needs */
{
switch ( p[i] )
{
case 'B': /* Select new BackPen */
j=0;
while (Adigit(p[++i])) /* if followed by ASCII digit */
j=j*10+p[i]-'0'; /* Add digit */
BackPen=j; /* Future: check against rp */
i--; /* Adjust for Adigit() */
break;
case 'F': /* Select new FrontPen */
j=0;
while (Adigit(p[++i])) /* if followed by ASCII digit */
j=j*10+p[i]-'0'; /* Add digit */
FrontPen=j; /* Future: check against rp */
i--; /* Adjust for Adigit() */
break;
case 'J': /* Select new drawing mode */
if (p[++i] == '2')
DrawMode = JAM2;
else
DrawMode = JAM1;
break;
case 'L': /* Set new Linespacing */
j=0;
while (Adigit(p[++i])) /* if followed by ASCII digit */
j=j*10+p[i]-'0'; /* Add digit */
Yc=j; /* No check on validity */
i--; /* Adjust for Adigit() */
break;
case 'N': /* Negative text */
link = NULL;
OpCode = NOTXT;
Minus = them;
break;
case 'P': /* Positive text */
link = NULL;
OpCode = YESTXT;
Plus = them;
break;
case 'T': /* Information text */
if (Body)
break;
OpCode = THETEXT;
Body = them;
break;
default:
break;
}
}
them->FrontPen = FrontPen; /* Text pen */
them->BackPen = BackPen; /* Paper pen */
them->DrawMode = DrawMode; /* JAM1 or JAM2 */
them->LeftEdge = Xtxt; /* X for this string */
them->TopEdge = Ytxt; /* Y for this string */
them->ITextFont = MyTextFont; /* NULL */
them->IText = p2; /* Characters */
them->NextText = NULL; /* May change later */
if (link && ix) /* Never link 1st text */
Previous->NextText = them;
if (OpCode == THETEXT)
{
Ytxt += Yc;
j = IntuiTextLength(them)+4*LeftEdge; /* Get length and compare */
if (j > WidestText)
WidestText=j;
}
Previous = them;
them++;
ix++; /* Process next string */
}
j = WidestText+LeftEdge+LeftEdge;
if (j > ReqW)
ReqW=j;
j = Ytxt+3*(Yc+TopEdge)+TopEdge;
if(j > ReqH)
ReqH=j;
if (Plus)
{
Plus->LeftEdge = LeftEdge;
Plus->TopEdge = 3;
}
if (Minus)
{
Minus->LeftEdge = LeftEdge;
Minus->TopEdge = 3;
}
i = AutoRequest(w,Body,Plus,Minus,PFlags,MFlags,ReqW,ReqH);
FreeMem( MyMem, MyMemorySize );
return (int)(i);
} /* End of MakeSimpleRequest() */
BOOL Adigit( c ) /* Return true if c is ASCII digit */
UBYTE c;
{
return (BOOL) ( c>='0' && c<='9' ? TRUE : FALSE);
}