DIRECTORY ParserTypeDefs, IntDefs, IntStorageDefs, IntUtilityDefs, ParserErrorDefs, Rope; IntUtilities: CEDAR PROGRAM IMPORTS ParserErrorDefs, ParserTypeDefs EXPORTS IntDefs, IntUtilityDefs = BEGIN OPEN IntStorageDefs, IntUtilityDefs; aScale, bScale: LONG CARDINAL; -- scale factors for DS tooBigLong: LONG CARDINAL; -- largest number that can be scaled without overflow tooBigInt: INT; noScale: BOOLEAN; -- identity flag for scale TableSize: CARDINAL = 199; -- symbol table size sTable: ARRAY [0..TableSize) OF IntStorageDefs.STEntryList; MaxMMStack: CARDINAL = 50; -- max depth minmax stack left,right,bottom,top: ARRAY [1..MaxMMStack] OF INT; mmPtr: CARDINAL; -- minmax stack pointer InitUtilities: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN FOR i: CARDINAL IN [0..TableSize) DO sTable[i] _ NIL ENDLOOP; mmPtr _ 0; noScale _ TRUE; warned _ FALSE; errorCount _ 0; RETURN[TRUE]; END; FinishUtilities: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN FOR i: CARDINAL IN [0..TableSize) DO FOR cur: STEntryList _ sTable[i], cur.rest WHILE cur#NIL DO cur.first.calledBy _ NIL; -- breaks reference loops ENDLOOP; -- the rest is a tree, so should be collectable sTable[i] _ NIL; ENDLOOP; RETURN[TRUE]; END; SemanticError: PUBLIC ERROR = CODE; warned: BOOL; errorCount: CARDINAL; LogError: PUBLIC PROCEDURE [s: Rope.ROPE] = BEGIN errorCount _ errorCount + 1; ParserErrorDefs.Report[s, FatalSemantic]; ERROR SemanticError[]; END; OKToContinue: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN IF errorCount > 0 AND NOT warned THEN BEGIN warned _ TRUE; ParserErrorDefs.Report["Fatal Semantic Errors Exist, Strange Results May Occur If You Proceed", Advisory]; RETURN [FALSE]; END ELSE RETURN[TRUE]; END; InitMM: PUBLIC PROCEDURE [x,y: INT] = BEGIN IF (mmPtr _ mmPtr+1) > MaxMMStack THEN BEGIN ParserErrorDefs.Report["InitMM: no stack space", FatalInternal]; RETURN; END ELSE BEGIN left[mmPtr] _ x; right[mmPtr] _ x; bottom[mmPtr] _ y; top[mmPtr] _ y; RETURN; END; END; MinMax: PUBLIC PROCEDURE [x,y: INT] = BEGIN IF x > right[mmPtr] THEN right[mmPtr] _ x ELSE BEGIN IF x < left[mmPtr] THEN left[mmPtr] _ x; END; IF y > top[mmPtr] THEN top[mmPtr] _ y ELSE BEGIN IF y < bottom[mmPtr] THEN bottom[mmPtr] _ y; END; END; DoneMM: PUBLIC PROCEDURE = BEGIN IF mmPtr = 0 THEN ParserErrorDefs.Report["DoneMM: empty stack", FatalInternal] ELSE mmPtr _ mmPtr-1; END; Extent: PUBLIC PROCEDURE RETURNS [l,r,b,t: INT] = BEGIN RETURN [left[mmPtr],right[mmPtr],bottom[mmPtr],top[mmPtr]]; END; LookUp: PUBLIC PROCEDURE [symNumber: LONG CARDINAL] RETURNS [ent: STEntry] = BEGIN hAddr: CARDINAL = Hash[symNumber]; prev: STEntryList _ NIL; FOR cur: STEntryList _ sTable[hAddr], cur.rest WHILE cur#NIL DO IF cur.first.symNumber=symNumber AND NOT cur.first.deleted THEN BEGIN IF prev=NIL THEN RETURN[cur.first] ELSE BEGIN prev.rest _ cur.rest; cur.rest _ sTable[hAddr]; sTable[hAddr] _ cur; RETURN[cur.first]; END; END; prev _ cur; ENDLOOP; sTable[hAddr] _ CONS[ NEW[STEntryRec _ [ bb: BBoxRecord[left:0,right:0,bottom:0,top:0], bbValid: FALSE, guts: NIL, symNumber: symNumber, deleted: FALSE, expanded: FALSE, bound: FALSE, defined: FALSE, calledBy: NIL]], sTable[hAddr]]; RETURN[sTable[hAddr].first]; END; MapSymbols: PUBLIC PROCEDURE [proc: PROC[IntStorageDefs.STEntry]] = BEGIN FOR hAddr: NAT IN [0..TableSize) DO FOR cur: STEntryList _ sTable[hAddr], cur.rest WHILE cur#NIL DO proc[cur.first]; ENDLOOP; ENDLOOP; END; SetScale: PUBLIC PROCEDURE [a,b: LONG CARDINAL] = BEGIN IF a = 0 OR b = 0 THEN LogError["Illegal Scale Factor"]; IF a = b THEN noScale _ TRUE -- no need to do any computation ELSE BEGIN aScale _ a; bScale _ b; tooBigLong _ LAST[LONG CARDINAL]/aScale; tooBigInt _ LAST[INT]/aScale; noScale _ FALSE; END; END; ScaleLong: PUBLIC PROCEDURE [n: LONG CARDINAL] RETURNS [LONG CARDINAL] = BEGIN IF noScale THEN RETURN[n] ELSE BEGIN IF n > tooBigLong THEN BEGIN LogError["Number Too Large to Scale"]; RETURN[LAST[LONG CARDINAL]]; END; RETURN[(aScale*n)/bScale]; END; END; ScalePath: PUBLIC PROCEDURE [s,d: ParserTypeDefs.Path] = BEGIN pt: ParserTypeDefs.Point; IF noScale THEN BEGIN ParserTypeDefs.CopyPath[s,d]; RETURN; END ELSE THROUGH [1..ParserTypeDefs.PathLength[s]] DO [,pt] _ ParserTypeDefs.RemovePoint[s]; ParserTypeDefs.AppendPoint[d,ScalePoint[pt]]; ENDLOOP; END; ScalePoint: PUBLIC PROCEDURE [p: ParserTypeDefs.Point] RETURNS [ParserTypeDefs.Point] = BEGIN temp: ParserTypeDefs.Point; temp.x _ ScaleLongInt[p.x]; temp.y _ ScaleLongInt[p.y]; RETURN[temp]; END; ScaleLongInt: PUBLIC PROCEDURE [n: INT] RETURNS [INT] = BEGIN IF noScale THEN RETURN[n] ELSE BEGIN IF ABS[n] > tooBigInt THEN BEGIN LogError["Integer Magnitude Too Large to Scale"]; RETURN[IF n < 0 THEN FIRST[INT] ELSE LAST[INT]]; END; RETURN[(aScale*n)/bScale]; END; END; Hash: PROCEDURE [n: LONG CARDINAL] RETURNS [[0..TableSize)] = BEGIN RETURN[n MOD TableSize]; END; END. ÈFile IntUtilities.mesa March 12, 1981 3:46 PM Last Edited by: Pier, January 29, 1985 10:51:12 pm PST Converting to Cedar5.2 Last Edited by: McCreight, January 31, 1985 1:19:49 pm PST reentrant minimum/maximum stuff for finding bounding boxes call proc on all symbols thus far defined or called set up scale factors for DS IF ((aScale/bScale)*bScale) # aScale THEN ParserErrorDefs.Report["Scale Factor not an Integer, precision may be lost", Advisory]; scale a long cardinal by factors set up by a call to SetScale scale all the points in a path scale all points in path scale a point by factors set up by a call to SetScale scale a long integer by factors set up by a call to SetScale private procedures Ê ˜Jšœ™Jšœ™JšœN™NJ™:J˜šÏk ˜ JšœO˜O—J˜Jšœ ˜Jšœ ˜'Jšœ˜!˜Jšœœ ˜*J˜JšœœœÏc˜7Jšœ œœž5˜QJšœ œ˜Jšœ œž˜-J˜Jšœ œ ž˜0Jšœœœ˜;J˜Jšœ œž˜5Jšœœœœ˜4Jšœœž˜-J˜š Ïn œœ œœœ˜3Jš˜Jš œœœœ œœ˜=J˜ Jšœ œ˜Jšœ œ˜J˜Jšœœ˜ Jšœ˜—J˜š Ÿœœ œœœ˜5Jš˜šœœœ˜$šœ(œœ˜;Jšœœž˜3Jšœž/˜8—Jšœ œ˜Jšœ˜—Jšœœ˜ Jšœ˜J˜—Jšœœœœ˜#J˜Jšœœ˜ Jšœ œ˜J˜šŸœœ œ œ˜+Jš˜J˜J˜)Jšœ˜Jšœ˜J˜—š Ÿ œœ œœœ˜2Jš˜šœœœ˜%Jš˜Jšœ œ˜J˜jJšœœ˜Jš˜—Jšœœœ˜Jšœ˜J˜—Jšœ:™:šŸœœ œœ˜%Jš˜šœ ˜&Jš˜J˜@Jšœ˜Jš˜—š˜Jš˜J˜"J˜"Jšœ˜Jšœ˜—Jšœ˜J˜—šŸœœ œœ˜%Jš˜Jšœœ˜)Jš œœœœœ˜8Jšœœ˜%Jš œœœœœ˜Jšœ œ˜—Jšœ˜—Jšœ˜Jšœ˜—J˜J™3šŸ œœœ˜CJš˜šœœœ˜#šœ,œœ˜?Jšœ˜Jšœ˜—Jšœ˜—Jšœ˜——˜Jšœ™š Ÿœœ œœœ˜1Jš˜Jšœœœ"˜8Jšœœ œž ˜>š˜Jš˜J˜Jšœ œœœ ˜(Jšœ œœ ˜Jšœ œ˜——Jšœ)™)šœW™WJšœ˜Jšœ˜J˜—Jšœ=™=šŸ œœ œœœœœœ˜HJš˜Jšœ œœ˜š˜Jš˜šœ˜Jš˜J˜&Jšœœœœ˜Jšœ˜—Jšœ˜Jšœ˜—Jšœ˜J˜—Jšœ™šŸ œœ œ˜8š˜Jšœ˜Jšœ™šœ ˜Jš˜Jšœ˜Jšœ˜Jš˜—š˜šœ#˜,J˜&J˜-Jšœ˜———Jšœ˜J˜—Jšœ5™5šŸ œœ œœ˜WJš˜J˜J˜J˜Jšœ˜ Jšœ˜J˜—Jšœ<™<š Ÿ œœ œœœœ˜7Jš˜Jšœ œœ˜š˜Jš˜šœœ˜Jš˜J˜1Jšœœœœœœœœ˜0Jšœ˜—Jšœ˜Jšœ˜—Jšœ˜J˜—Jšœ™š Ÿœ œœœœ˜>Jš˜Jšœœ ˜Jšœ˜J˜—Jšœ˜J˜J˜——…—úÑ