/* 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 #include #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; iFrontPen = 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); }