home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-04-20 | 8.0 KB | 376 lines | [TEXT/PJMM] |
- unit MyUtils;
-
- { This program was written by Peter N Lewis, Mar 1992 in THINK Pascal 4.0.1 }
-
- interface
-
- type
- versionRecord = packed record
- version: integer;
- devcode: byte;
- revision: byte;
- country: integer;
- short: str15;
- long: str255;
- end;
-
- function TrapAvailable (tNumber: INTEGER): BOOLEAN;
- function MyNumToString (n: longInt): str255;
- function NumToStr (n: longInt): str255;
- function StrToNum (s: str255): longInt;
- function GetIndexedString (strh, i: integer): str255;
- procedure DotDotDot (var s: str255; var width: integer);
- procedure SetItemEnable (mh: menuHandle; item: integer; enable: boolean);
- procedure SetIDItemEnable (menu, item: integer; enable: boolean);
- function GetIDItemEnable (menu, item: integer): boolean;
- function GetItemEnable (mh: menuHandle; item: integer): boolean;
- procedure DotItem (mh: menuHandle; item: integer; dotted: boolean);
- function MyFrontWindow: boolean;
- function DAFrontWindow: boolean;
- function GetIndStrSize (size, id, index: integer): str255;
- procedure GetVersion (var vers: versionRecord);
- procedure SetVersionParamText (c2, c3: str255);
- function GetDirID (wdrn: integer; var vrn: integer; var dirID: longInt): OSErr;
- function GetVolInfo (var name: str63; var vrn: integer; index: integer; var CrDate: longInt): OSErr;
- procedure PlotSICN (id: integer; index, v, h: integer);
- procedure SegmentInit;
- procedure SegmentUtil;
- procedure SegmentUtil2;
- procedure SegmentTerm;
- function HLockState (h: univ handle): signedByte;
- { procedure SPrintS5V (var dst: str255;var src,s1, s2, s3, s4, s5: str255);}
- procedure SPrintS5 (var dst: str255; src, s1, s2, s3, s4, s5: str255);
- procedure SPrintS3 (var dst: str255; src, s1, s2, s3: str255);
- function UpCase (ch: char): char;
-
- implementation
-
- uses
- MyTypes, Traps;
-
- {$S Init}
- procedure SegmentInit;
- begin
- end;
-
- {$S Util}
- procedure SegmentUtil;
- begin
- end;
-
- {$S Util2}
- procedure SegmentUtil2;
- begin
- end;
-
- {$S Term}
- procedure SegmentTerm;
- begin
- end;
-
- {$S Util}
- function TrapAvailable (tNumber: INTEGER): BOOLEAN;
- {Check to see if a given trap is implemented. Babble as taken from IM6 }
- const
- TrapMask = $0800;
- var
- tType: TrapType;
- ignoreError: OSErr;
- begin
- if BAND(tNumber, TrapMask) > 0 then
- tType := ToolTrap
- else
- tType := OSTrap;
- if tType = ToolTrap then begin
- tNumber := BAND(tNumber, $7FF);
- if tNumber >= $400 then
- tNumber := _Unimplemented
- else if tNumber >= $200 then
- if NGetTrapAddress($A86E, ToolTrap) <> NGetTrapAddress($AA6E, ToolTrap) then
- tNumber := _Unimplemented;
- end;
- TrapAvailable := NGetTrapAddress(tNumber, tType) <> GetTrapAddress(_Unimplemented);
- end; {TrapAvailable}
-
- {$S Util}
- function MyNumToString (n: longInt): str255;
- var
- s: str255;
- begin
- if abs(n) < 4096 then
- NumToString(n, s)
- else if abs(n) < 4194304 then begin
- NumToString(n div 1024, s);
- s := Concat(s, 'k');
- end
- else begin
- NumToString(n div 1048576, s);
- s := Concat(s, 'M');
- end;
- MyNumToString := s;
- end;
-
- {$S Util}
- function NumToStr (n: longInt): str255;
- var
- s: str255;
- begin
- NumToString(n, s);
- NumToStr := s;
- end;
-
- {$S Util}
- function StrToNum (s: str255): longInt;
- var
- n: longInt;
- begin
- StringToNum(s, n);
- StrToNum := n;
- end;
-
- {$S Util}
- function GetIndexedString (strh, i: integer): str255;
- var
- s: str255;
- begin
- GetIndString(s, strh, i);
- GetIndexedString := s;
- end;
-
- {$S Util2}
- procedure DotDotDot (var s: str255; var width: integer);
- var
- maxwidth, len: integer;
- begin
- maxwidth := width;
- width := StringWidth(s);
- if width > maxwidth then begin
- width := width + CharWidth('…');
- {$PUSH}
- {$R-}
- len := ord(s[0]);
- while (len > 0) and (width > maxwidth) do begin
- width := width - CharWidth(s[len]);
- len := len - 1;
- end;
- len := len + 1;
- s[0] := chr(len);
- s[len] := '…';
- {$POP}
- end;
- end;
-
- {$S}
- procedure SetItemEnable (mh: menuHandle; item: integer; enable: boolean);
- begin
- if enable then
- EnableItem(mh, item)
- else
- DisableItem(mh, item);
- end;
-
- {$S}
- procedure SetIDItemEnable (menu, item: integer; enable: boolean);
- begin
- SetItemEnable(GetMHandle(menu), item, enable);
- end;
-
- {$S}
- function GetItemEnable (mh: menuHandle; item: integer): boolean;
- begin
- if item > 31 then
- GetItemEnable := true
- else
- GetItemEnable := BTST(mh^^.enableFlags, item);
- end;
-
- {$S}
- function GetIDItemEnable (menu, item: integer): boolean;
- begin
- GetIDItemEnable := GetItemEnable(GetMHandle(menu), item);
- end;
-
- {$S Util2}
- procedure DotItem (mh: menuHandle; item: integer; dotted: boolean);
- begin
- if dotted then
- SetItemMark(mh, item, '•')
- else
- SetItemMark(mh, item, chr(0));
- end;
-
- {$S Util2}
- function MyFrontWindow: boolean;
- var
- wp: windowPtr;
- begin
- wp := FrontWindow;
- if wp = nil then
- MyFrontWindow := false
- else
- MyFrontWindow := windowPeek(wp)^.windowKind >= userKind;
- end;
-
- {$S Util2}
- function DAFrontWindow: boolean;
- var
- wp: windowPtr;
- begin
- wp := FrontWindow;
- if wp = nil then
- DAFrontWindow := false
- else
- DAFrontWindow := windowPeek(wp)^.windowKind < 0;
- end;
-
- {$S Util2}
- function GetIndStrSize (size, id, index: integer): str255;
- var
- s255: str255;
- begin
- GetIndString(s255, id, index);
- GetIndStrSize := copy(s255, 1, size - 1);
- end;
-
- {$S Util}
- procedure GetVersion (var vers: versionRecord);
- var
- vh: handle;
- begin
- with vers do begin
- vh := GetResource('vers', 1);
- if vh = nil then begin
- version := $0000;
- devcode := $20;
- revision := $00;
- country := 0;
- short := '0.0.0';
- long := 'Unknown v0.0.0';
- end
- else begin
- BlockMove(vh^, @vers, sizeof(vers));
- {$PUSH}
- {$R-}
- BlockMove(Ptr(longint(vh^) + (longint(@short) - longint(@vers)) + ord(short[0]) + 1), @long, sizeof(long));
- if ord(short[0]) >= sizeof(short) then
- short[0] := chr(sizeof(short) - 1);
- {$POP}
- ReleaseResource(vh);
- end;
- end;
- end;
-
- {$S Util}
- procedure SetVersionParamText (c2, c3: str255);
- var
- vers: versionRecord;
- begin
- GetVersion(vers);
- ParamText(vers.short, vers.long, c2, c3);
- end;
-
- {$S Util}
- function GetDirID (wdrn: integer; var vrn: integer; var dirID: longInt): OSErr;
- var
- procID: longInt;
- oe: OSErr;
- begin
- oe := GetWDInfo(wdrn, vrn, dirID, procID);
- if oe <> noErr then begin
- vrn := wdrn;
- dirID := 0;
- end;
- GetDirID := oe;
- end;
-
- {$S Util2}
- function GetVolInfo (var name: str63; var vrn: integer; index: integer; var CrDate: longInt): OSErr;
- var
- pb: paramBlockRec;
- oe: OSErr;
- begin
- with pb do begin
- if (name <> '') & (name[length(name)] <> ':') then
- name := concat(name, ':');
- pb.ioNamePtr := @name;
- ioVRefNum := vrn;
- ioVolIndex := index;
- oe := PBGetVInfo(@pb, false);
- if oe = noErr then begin
- vrn := ioVRefNum;
- CrDate := ioVCrDate;
- end;
- end;
- GetVolInfo := oe;
- end;
-
- {$S Util}
- procedure PlotSICN (id: integer; index, v, h: integer);
- var
- sh: Handle;
- bm: BitMap;
- r: Rect;
- gp: grafptr;
- begin
- sh := GetResource('SICN', id);
- HLock(sh);
- bm.baseAddr := Ptr(longInt(sh^) + (index - 1) * 32);
- bm.rowBytes := 2;
- SetRect(r, h, v, h + 16, v + 16);
- bm.bounds := r;
- GetPort(gp);
- CopyBits(bm, gp^.portBits, r, r, srcCopy, nil);
- HUnlock(sh);
- end;
-
- function HLockState (h: univ handle): signedByte;
- begin
- HLockState := HGetState(h);
- HLock(h);
- end;
-
- procedure DoSub (var dst: str255; n: integer; var s: str255);
- var
- p: integer;
- begin
- p := Pos(concat('^', chr(n + 48)), dst);
- if p > 0 then begin
- Delete(dst, p, 2);
- Insert(s, dst, p);
- end;
- end;
-
- {$Z+}
- procedure SPrintS5V (var dst: str255; var src, s1, s2, s3, s4, s5: str255);
- begin
- dst := src;
- DoSub(dst, 5, s5);
- DoSub(dst, 4, s4);
- DoSub(dst, 3, s3);
- DoSub(dst, 2, s2);
- DoSub(dst, 1, s1);
- end;
- {$Z-}
-
- procedure SPrintS5 (var dst: str255; src, s1, s2, s3, s4, s5: str255);
- begin
- SPrintS5V(dst, src, s1, s2, s3, s4, s5);
- end;
-
- procedure SPrintS3 (var dst: str255; src, s1, s2, s3: str255);
- begin
- dst := src;
- DoSub(dst, 3, s3);
- DoSub(dst, 2, s2);
- DoSub(dst, 1, s1);
- end;
-
- function UpCase (ch: char): char;
- begin
- if ch in ['a'..'z'] then
- UpCase := chr(ord(ch) - $20)
- else
- UpCase := ch;
- end;
-
- end.