# HG changeset patch # User koda # Date 1328573909 -3600 # Node ID eed176af3cc6827d6cb483354486a50c248ce630 # Parent 4450e746dc34f114200355ca95965a376b3a4116# Parent 863459db5432c9a9d4b9e50e6d5fe772af8cf628 merge diff -r 4450e746dc34 -r eed176af3cc6 hedgewars/pas2cSystem.pas --- a/hedgewars/pas2cSystem.pas Tue Feb 07 01:18:03 2012 +0100 +++ b/hedgewars/pas2cSystem.pas Tue Feb 07 01:18:29 2012 +0100 @@ -1,12 +1,12 @@ system; type + Integer = integer; LongInt = integer; LongWord = integer; Cardinal = integer; PtrInt = integer; Word = integer; - Integer = integer; Byte = integer; SmallInt = integer; ShortInt = integer; diff -r 4450e746dc34 -r eed176af3cc6 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Tue Feb 07 01:18:03 2012 +0100 +++ b/hedgewars/uStore.pas Tue Feb 07 01:18:29 2012 +0100 @@ -303,7 +303,7 @@ ((vobCount > 0) or (ii <> sprFlake)) then begin if AltPath = ptNone then - if ii in [sprHorizont, sprHorizontL, sprHorizontR, sprSky, sprSkyL, sprSkyR, sprChunk, sprFireButton] then // FIXME: hack + if ii in [sprHorizont, sprHorizontL, sprHorizontR, sprSky, sprSkyL, sprSkyR, sprChunk] then // FIXME: hack begin if not reload then begin diff -r 4450e746dc34 -r eed176af3cc6 hedgewars/uTouch.pas --- a/hedgewars/uTouch.pas Tue Feb 07 01:18:03 2012 +0100 +++ b/hedgewars/uTouch.pas Tue Feb 07 01:18:29 2012 +0100 @@ -58,12 +58,12 @@ procedure aim(finger: Touch_Finger); function isOnCrosshair(finger: Touch_Finger): boolean; function isOnCurrentHog(finger: Touch_Finger): boolean; -function isOnFireButton(finger: Touch_Finger): boolean; procedure convertToWorldCoord(var x,y: hwFloat; finger: Touch_Finger); procedure convertToFingerCoord(var x,y: hwFloat; oldX, oldY: hwFloat); function fingerHasMoved(finger: Touch_Finger): boolean; function calculateDelta(finger1, finger2: Touch_Finger): hwFloat; function getSecondFinger(finger: Touch_Finger): PTouch_Finger; +function isOnRect(x,y,w,h: LongInt; finger: Touch_Finger): boolean; procedure printFinger(finger: Touch_Finger); implementation @@ -72,14 +72,6 @@ nilFingerId = High(SDL_FingerId); var - fireButtonLeft, fireButtonRight, fireButtonTop, fireButtonBottom : LongInt; - - - - leftButtonBoundary : LongInt; - rightButtonBoundary : LongInt; - topButtonBoundary : LongInt; - pointerCount : Longword; fingers: array of Touch_Finger; moveCursor : boolean; @@ -92,9 +84,9 @@ pinchSize : hwFloat; baseZoomValue: GLFloat; - //aiming - aiming, movingCrosshair: boolean; + aiming, movingCrosshair: boolean; + aimingUp, aimingDown: boolean; crosshairCommand: ShortString; targetAngle: LongInt; stopFiring: boolean; @@ -124,30 +116,50 @@ exit; end; - if isOnFireButton(finger^) then + if isOnRect(fireButtonX, fireButtonY, fireButtonW, fireButtonH, finger^) then begin stopFiring:= false; ParseCommand('+attack', true); exit; end; -{ if (finger^.x < leftButtonBoundary) and (finger^.y < 390) then + if isOnRect(arrowLeftX, arrowLeftY, arrowLeftW, arrowLeftH, finger^) then begin ParseCommand('+left', true); walkingLeft := true; exit; end; - if finger^.x > rightButtonBoundary then + if isOnRect(arrowRightX, arrowRightY, arrowRightW, arrowRightH, finger^) then begin ParseCommand('+right', true); walkingRight:= true; exit; end; - if finger^.y < topButtonBoundary then + if isOnRect(arrowUpX, arrowUpY, arrowUpW, arrowUpH, finger^) then + begin + ParseCommand('+up', true); + aimingUp:= true; + exit; + end; + if isOnRect(arrowDownX, arrowDownY, arrowUpW, arrowUpH, finger^) then + begin + ParseCommand('+down', true); + aimingDown:= true; + exit; + end; + + if isOnRect(backjumpX, backjumpY, backjumpW, backjumpH, finger^) then begin ParseCommand('hjump', true); exit; end; - } moveCursor:= true; + if isOnRect(forwardjumpX, forwardjumpY, forwardjumpW, forwardjumpH, finger^) then + begin + ParseCommand('ljump', true); + exit; + end; + + + moveCursor:= true; end; 2: begin @@ -221,17 +233,30 @@ walkingLeft := false; end; - if walkingRight then +if walkingRight then begin ParseCommand('-right', true); walkingRight := false; end; + +if aimingUp then + begin + ParseCommand('-up', true); + aimingUp:= false; + end; +if aimingDown then + begin + ParseCommand('-down', true); + aimingDown:= false; + end; + + end; procedure onTouchDoubleClick(finger: Touch_Finger); begin finger := finger;//avoid compiler hint -ParseCommand('ljump', true); +//ParseCommand('ljump', true); end; procedure onTouchClick(finger: Touch_Finger); @@ -252,7 +277,6 @@ CursorPoint.X:= finger.x; CursorPoint.Y:= finger.y; doPut(CursorPoint.X, CursorPoint.Y, false); - WriteToConsole(Format('%d %d', [CursorPoint.X, CursorPoint.Y])); exit end; @@ -262,11 +286,11 @@ exit; end; -if finger.y < topButtonBoundary then +{if finger.y < topButtonBoundary then begin ParseCommand('hjump', true); exit; - end; + end;} end; function addFinger(x,y: Longword; id: SDL_FingerId): PTouch_Finger; @@ -423,9 +447,9 @@ tmp := crosshairCommand; if CurrentHedgehog^.Gear^.Angle - targetAngle < 0 then - crosshairCommand := 'down' + crosshairCommand := 'up' else - crosshairCommand:= 'up'; + crosshairCommand:= 'down'; if movingCrosshair and (tmp <> crosshairCommand) then begin ParseCommand('-' + tmp, true); @@ -459,11 +483,6 @@ convertToCursorDeltaY := round(y/32768*cScreenHeight) end; -function isOnFireButton(finger: Touch_Finger): boolean; -begin - isOnFireButton:= (finger.x <= fireButtonRight) and (finger.x >= fireButtonLeft) and (finger.y <= fireButtonBottom) and (finger.y >= fireButtonTop); -end; - function isOnCrosshair(finger: Touch_Finger): boolean; var x,y : hwFloat; @@ -481,8 +500,6 @@ x := _0; y := _0; convertToFingerCoord(x,y, CurrentHedgehog^.Gear^.X, CurrentHedgehog^.Gear^.Y); - WriteToConsole(Format('%d %s %d %s', [finger.x, cstr(x), finger.y, cstr(y) ])); - isOnCurrentHog := Distance(int2hwFloat(finger.X)-x, int2hwFloat(finger.Y)-y) < _50; end; @@ -521,6 +538,15 @@ getSecondFinger := @fingers[0]; end; +function isOnRect(x,y,w,h: LongInt; finger: Touch_Finger): boolean; +begin +WriteToConsole(Format('(%d,%d) (%d, %d) %d',[finger.x, finger.y, x,y, w])); +isOnRect:= (finger.x > x) and + (finger.x < x+w) and + (cScreenHeight - finger.y > y) and + (cScreenHeight - finger.y < (y+w)); +end; + procedure printFinger(finger: Touch_Finger); begin WriteToConsole(Format('id:%d, (%d,%d), (%d,%d), time: %d', [finger.id, finger.x, finger.y, finger.historicalX, finger.historicalY, finger.timeSinceDown])); @@ -536,20 +562,9 @@ walkingLeft := false; walkingRight := false; - leftButtonBoundary := cScreenWidth div 4; - rightButtonBoundary := cScreenWidth div 4*3; - topButtonBoundary := cScreenHeight div 6; - setLength(fingers, 4); for index := 0 to High(fingers) do fingers[index].id := nilFingerId; - - - //uRenderCoordScaleX := Round(cScreenWidth/0.8 * 2); - fireButtonLeft := Round(cScreenWidth*0.01); - fireButtonRight := Round(fireButtonLeft + (spritesData[sprFireButton].Width*0.4)); - fireButtonBottom := Round(cScreenHeight*0.99); - fireButtonTop := fireButtonBottom - Round(spritesData[sprFireButton].Height*0.4); end; begin diff -r 4450e746dc34 -r eed176af3cc6 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Tue Feb 07 01:18:03 2012 +0100 +++ b/hedgewars/uTypes.pas Tue Feb 07 01:18:29 2012 +0100 @@ -58,6 +58,9 @@ sprFinger, sprAirBomb, sprAirplane, sprAmAirplane, sprAmGirder, sprHHTelepMask, sprSwitch, sprParachute, sprTarget, sprRopeNode, sprQuestion, sprPowerBar, sprWindBar, sprWindL, sprWindR, +{$IFDEF ANDROID} + sprFireButton, sprArrowUp, sprArrowDown, sprArrowLeft, sprArrowRight, sprBackjump, sprForwardjump, +{$ENDIF} sprFlake, sprHandRope, sprHandBazooka, sprHandShotgun, sprHandDEagle, sprHandAirAttack, sprHandBaseball, sprPHammer, sprHandBlowTorch, sprBlowTorch, sprTeleport, sprHHDeath, @@ -83,7 +86,7 @@ sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb, sprBulletHit, sprSnowball, sprHandSnowball, sprSnow, sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis, - sprFireButton, sprSlider + sprSlider ); // Gears that interact with other Gears and/or Land diff -r 4450e746dc34 -r eed176af3cc6 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Tue Feb 07 01:18:03 2012 +0100 +++ b/hedgewars/uVariables.pas Tue Feb 07 01:18:29 2012 +0100 @@ -192,6 +192,20 @@ LuaGoals : shortstring; +///////////////////////////////////// +//Buttons +{$IFDEF MOBILE} + buttonScale: GLFloat; + + arrowUpX, arrowUpY, arrowUpW, arrowUpH: LongInt; + arrowDownX, arrowDownY, arrowDownW, arrowDownH: LongInt; + arrowLeftX, arrowLeftY, arrowLeftW, arrowLeftH: LongInt; + arrowRightX, arrowRightY, arrowRightW, arrowRightH: LongInt; + + firebuttonX, fireButtonY, fireButtonW, fireButtonH: LongInt; + backjumpX, backjumpY, backjumpW, backjumpH: LongInt; + forwardjumpX, forwardjumpY, forwardjumpW, forwardjumpH: LongInt; +{$ENDIF} const cHHFileName = 'Hedgehog'; cCHFileName = 'Crosshair'; @@ -380,6 +394,22 @@ Width: 80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindL (FileName: 'WindR'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindR +{$IFDEF ANDROID} + (FileName: 'firebutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton + (FileName: 'arrowUp'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowUp + (FileName: 'arrowDown'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowDown + (FileName: 'arrowLeft'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowLeft + (FileName: 'arrowRight'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowRight + (FileName: 'backjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprBackjump + (FileName: 'forwardjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprForwardJump +{$ENDIF} (FileName: 'Flake'; Path:ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil; Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake (FileName: 'amRope'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; @@ -631,8 +661,6 @@ Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet (FileName: 'TARDIS'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 48; Height: 79; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprTardis - (FileName: 'firebutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 450; Height: 150; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton (FileName: 'slider'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 5; Height: 17; imageWidth: 5; imageHeight: 15; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false) // sprSlider ); diff -r 4450e746dc34 -r eed176af3cc6 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Tue Feb 07 01:18:03 2012 +0100 +++ b/hedgewars/uWorld.pas Tue Feb 07 01:18:29 2012 +0100 @@ -198,6 +198,46 @@ SkyOffset:= 0; HorizontOffset:= 0; +{$IFDEF ANDROID} +//positioning of the buttons +buttonScale:= 1.5/cDefaultZoomLevel; +firebuttonX:= (cScreenWidth shr 1) - Round(spritesData[sprFireButton].Texture^.h * buttonScale); +firebuttonY:= -Round(spritesData[sprFireButton].Texture^.h* buttonScale) + cScreenHeight; +firebuttonW:= Round(spritesData[sprFireButton].Texture^.w * buttonScale); +firebuttonH:= Round(spritesData[sprFireButton].Texture^.h * buttonScale); + +backjumpX:= (cScreenWidth shr 1) - Round(spritesData[sprbackjump].Texture^.h * 2 * buttonScale); +backjumpY:= -Round(spritesData[sprbackjump].Texture^.h * 1.2 * buttonScale) + cScreenHeight; +backjumpW:= Round(spritesData[sprbackjump].Texture^.w * buttonScale); +backjumpH:= Round(spritesData[sprbackjump].Texture^.h * buttonScale); + +forwardjumpX:= (cScreenWidth shr 1) - Round(spritesData[sprforwardjump].Texture^.h * 1.2 * buttonScale); +forwardjumpY:= -Round(spritesData[sprforwardjump].Texture^.h * 2 * buttonScale) + cScreenHeight; +forwardjumpW:= Round(spritesData[sprforwardjump].Texture^.w * buttonScale); +forwardjumpH:= Round(spritesData[sprforwardjump].Texture^.h * buttonScale); + +arrowLeftX:= -(cScreenWidth shr 1); +arrowLeftY:= -Round(spritesData[sprArrowLeft].Texture^.h*buttonScale) + cScreenHeight - Round(spritesData[sprArrowLeft].Texture^.h*buttonScale); +arrowLeftW:= Round(spritesData[sprArrowLeft].Texture^.h * buttonScale); +arrowLeftH:= Round(spritesData[sprArrowLeft].Texture^.h * buttonScale); + +arrowRightX:= -(cScreenWidth shr 1)+ Round(spritesData[sprArrowUp].Texture^.h * buttonScale *2); +arrowRightY:= -Round(spritesData[sprArrowRight].Texture^.h*buttonScale) + cScreenHeight - Round(spritesData[sprArrowRight].Texture^.h*buttonScale); +arrowRightW:= Round(spritesData[sprArrowRight].Texture^.w * buttonScale); +arrowRightH:= Round(spritesData[sprArrowRight].Texture^.h * buttonScale); + +arrowUpX:= -(cScreenWidth shr 1) + Round(spritesData[sprArrowUp].Texture^.h * buttonScale); +arrowUpY:= -Round(spritesData[sprArrowUp].Texture^.h*buttonScale) + cScreenHeight - Round(spritesData[sprArrowUp].Texture^.h*buttonScale*2); +arrowUpW:= Round(spritesData[sprArrowUp].Texture^.w * buttonScale); +arrowUpH:= Round(spritesData[sprArrowUp].Texture^.h * buttonScale); + +arrowDownX:= -(cScreenWidth shr 1) + Round(spritesData[sprArrowUp].Texture^.h * buttonScale); +arrowDownY:= -Round(spritesData[sprArrowDown].Texture^.h*buttonscale) + cScreenHeight; +arrowDownW:= Round(spritesData[sprArrowDown].Texture^.w * buttonScale); +arrowDownH:= Round(spritesData[sprArrowDown].Texture^.h * buttonScale); + + +{$ENDIF} end; procedure InitCameraBorders; @@ -887,6 +927,7 @@ highlight: Boolean; smallScreenOffset, offsetX, offsetY, screenBottom: LongInt; VertexBuffer: array [0..3] of TVertex2f; + scale: GLFloat; begin if (cReducedQuality and rqNoBackground) = 0 then begin @@ -1053,7 +1094,14 @@ {$IFDEF ANDROID} // Draw buttons Related to the Touch interface -DrawTexture(Round(-cScreenWidth*0.5 + cScreenHeight*0.02),Round((cScreenHeight*0.98)-(spritesData[sprFireButton].Height*0.4) ),spritesData[sprFireButton].Texture, 0.4); +DrawTexture(arrowLeftX, arrowLeftY,spritesData[sprArrowLeft].Texture, buttonScale); +DrawTexture(arrowRightX, arrowRightY,spritesData[sprArrowRight].Texture, buttonScale); +DrawTexture(arrowUpX, arrowUpY,spritesData[sprArrowUp].Texture, buttonScale); +DrawTexture(arrowDownX, arrowDownY,spritesData[sprArrowDown].Texture, buttonScale); + +DrawTexture(fireButtonX, firebuttonY, spritesData[sprFireButton].Texture, buttonScale); +DrawTexture(backjumpX, backjumpY, spritesData[sprBackjump].Texture, buttonScale); +DrawTexture(forwardjumpX, forwardjumpY, spritesData[sprForwardjump].Texture, buttonScale); {$ENDIF} // Teams Healths diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowdown.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowdown.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowleft.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowleft.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowright.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowright.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowup.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/arrowup.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/backjump.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/backjump.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/firebutton.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/firebutton.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/forwardjump.png Binary file project_files/Android-build/SDL-android-project/assets/Data/Graphics/Buttons/forwardjump.png has changed diff -r 4450e746dc34 -r eed176af3cc6 project_files/Android-build/Templates/Makefile.android --- a/project_files/Android-build/Templates/Makefile.android Tue Feb 07 01:18:03 2012 +0100 +++ b/project_files/Android-build/Templates/Makefile.android Tue Feb 07 01:18:29 2012 +0100 @@ -20,7 +20,7 @@ $(PPCROSSARM) $(LINKERFLAGS) $(PPCROSSARM_FLAGS) $(PPCROSSARM_INCLUDES) $(FPC_DEFINES) -oout/libhwengine.so ../../hedgewars/hwLibrary.pas ${CMAKE_COMMAND} -E copy out/libhwengine.so SDL-android-project/libs/armeabi/ - ${ANT} clean -f $(SDL_ANDROID_DIR)/build.xml + ${ANT} clean -f $(SDL_ANDROID_DIR)/build.xml ${ANT} debug install -f $(SDL_ANDROID_DIR)/build.xml clean: ${CMAKE_COMMAND} -E remove_directory out diff -r 4450e746dc34 -r eed176af3cc6 tools/PascalUnitSyntaxTree.hs --- a/tools/PascalUnitSyntaxTree.hs Tue Feb 07 01:18:03 2012 +0100 +++ b/tools/PascalUnitSyntaxTree.hs Tue Feb 07 01:18:29 2012 +0100 @@ -99,6 +99,7 @@ | BTChar | BTString | BTInt + | BTBool | BTRecord [(String, BaseType)] | BTArray BaseType BaseType | BTFunction diff -r 4450e746dc34 -r eed176af3cc6 tools/pas2c.hs --- a/tools/pas2c.hs Tue Feb 07 01:18:03 2012 +0100 +++ b/tools/pas2c.hs Tue Feb 07 01:18:29 2012 +0100 @@ -64,28 +64,21 @@ renderCFiles :: Map.Map String PascalUnit -> IO () renderCFiles units = do let u = Map.toList units - let ns = Map.map toNamespace units - mapM_ (toCFiles ns) u + let nss = Map.map (toNamespace nss) units + mapM_ (toCFiles nss) u where - toNamespace :: PascalUnit -> [Record] - toNamespace = concatMap tv2id . extractTVs - - extractTVs (System tv) = tv - extractTVs (Program {}) = [] - extractTVs (Unit _ (Interface _ (TypesAndVars tv)) _ _ _) = tv - - tv2id :: TypeVarDeclaration -> [Record] - tv2id (TypeDeclaration i t@(Sequence ids)) = map (\(Identifier i _) -> fi i BTUnknown) $ i : ids - tv2id (TypeDeclaration (Identifier i _) t) = [(map toLower i, (i, BTUnknown))] - tv2id (VarDeclaration _ (ids, t) _) = map (\(Identifier i _) -> fi i BTUnknown) ids - tv2id (FunctionDeclaration (Identifier i _) _ _ _) = [fi i BTUnknown] - tv2id (OperatorDeclaration i _ _ _ _) = [fi i BTUnknown] - fi i t = (map toLower i, (i, t)) - + toNamespace :: Map.Map String [Record] -> PascalUnit -> [Record] + toNamespace nss (System tvs) = + currentScope $ execState (mapM_ (tvar2C True) tvs) (RenderState [] BTUnknown nss) + toNamespace _ (Program {}) = [] + toNamespace nss (Unit _ interface _ _ _) = + currentScope $ execState (interface2C interface) (RenderState [] BTUnknown nss) + toCFiles :: Map.Map String [Record] -> (String, PascalUnit) -> IO () toCFiles _ (_, System _) = return () toCFiles ns p@(fn, pu) = do + hPutStrLn stdout $ show $ Map.lookup "pas2cSystem" ns hPutStrLn stderr $ "Rendering '" ++ fn ++ "'..." toCFiles' p where @@ -149,10 +142,10 @@ id2C False (Identifier i t) = do let i' = map toLower i v <- gets $ find (\(a, _) -> a == i') . currentScope - --ns <- gets currentScope + ns <- gets currentScope modify (\s -> s{lastType = t}) if isNothing v then - error $ "Not defined: '" ++ i' ++ "'"-- ++ show ns + error $ "Not defined: '" ++ i' ++ "'\n" ++ show ns else return . text . fst . snd . fromJust $ v @@ -171,7 +164,8 @@ where f "integer" = BTInt f "pointer" = BTPointerTo BTVoid - f _ = error $ show st + f "boolean" = BTBool + f _ = error $ "Unknown system type: " ++ show st resolveType (PointerTo t) = liftM BTPointerTo $ resolveType t resolveType (RecordType tv mtvs) = do tvs <- mapM f (concat $ tv : fromMaybe [] mtvs) @@ -183,6 +177,7 @@ resolveType (ArrayDecl Nothing t) = liftM (BTArray BTInt) $ resolveType t resolveType (FunctionType _ _) = return BTFunction resolveType (DeriveType _) = return BTInt +resolveType (String _) = return BTString --resolveType UnknownType = return BTUnknown resolveType a = error $ "resolveType: " ++ show a @@ -216,6 +211,7 @@ tvar2C _ td@(TypeDeclaration i' t) = do tp <- type2C t tb <- resolveType t + error $ show (td, tb) i <- id2CTyped tb i' return $ text "type" <+> i <+> tp <> text ";"