uCommands compiles
authorunc0rr
Tue, 24 Apr 2012 23:33:39 +0400
changeset 6923 d2405a6a86f5
parent 6922 93bdd3d251fe
child 6924 57b66ee3bff3
uCommands compiles
hedgewars/pas2c.h
hedgewars/uCommands.pas
tools/pas2c.hs
--- a/hedgewars/pas2c.h	Tue Apr 24 22:27:56 2012 +0400
+++ b/hedgewars/pas2c.h	Tue Apr 24 23:33:39 2012 +0400
@@ -56,6 +56,7 @@
 string255 _strconcat(string255 a, string255 b);
 string255 _strappend(string255 s, char c);
 string255 _strprepend(char c, string255 s);
+bool _strcompare(string255 a, string255 b);
 char * _pchar(string255 s);
 
 int Length(string255 a);
--- a/hedgewars/uCommands.pas	Tue Apr 24 22:27:56 2012 +0400
+++ b/hedgewars/uCommands.pas	Tue Apr 24 23:33:39 2012 +0400
@@ -33,7 +33,7 @@
 procedure StopMessages(Message: Longword);
 
 implementation
-uses Types, uConsts, uVariables, uConsole, uUtils, uDebug;
+uses uConsts, uVariables, uConsole, uUtils, uDebug;
 
 type  PVariable = ^TVariable;
     TVariable = record
--- a/tools/pas2c.hs	Tue Apr 24 22:27:56 2012 +0400
+++ b/tools/pas2c.hs	Tue Apr 24 23:33:39 2012 +0400
@@ -49,6 +49,8 @@
     strs <- gets stringConsts
     let a = find ((==) str . snd) strs
     if isJust a then
+        do
+        modify (\s -> s{lastType = BTString})
         return . text . fst . fromJust $ a
     else
         do
@@ -463,7 +465,7 @@
     return r
     where
     type2C' VoidType = return (text "void" <+>)
-    type2C' (String l) = return (text ("string" ++ show l) <+>)
+    type2C' (String l) = return (text "string255" <+>)--return (text ("string" ++ show l) <+>)
     type2C' (PointerTo (SimpleType i)) = liftM (\i a -> text "struct __" <> i <+> text "*" <+> a) $ id2C IODeferred i
     type2C' (PointerTo t) = liftM (\t a -> t (parens $ text "*" <> a)) $ type2C t
     type2C' (RecordType tvs union) = do
@@ -510,10 +512,11 @@
     ps <- mapM phrase2C p
     return $ text "{" $+$ (nest 4 . vcat $ ps) $+$ text "}"
 phrase2C (ProcCall f@(FunCall {}) []) = liftM (<> semi) $ ref2C f
-phrase2C (ProcCall ref params) = do
+phrase2C (ProcCall ref []) = liftM (<> semi) $ ref2CF ref
+phrase2C (ProcCall ref params) = error $ "ProcCall"{-do
     r <- ref2C ref
     ps <- mapM expr2C params
-    return $ r <> parens (hsep . punctuate (char ',') $ ps) <> semi
+    return $ r <> parens (hsep . punctuate (char ',') $ ps) <> semi -}
 phrase2C (IfThenElse (expr) phrase1 mphrase2) = do
     e <- expr2C expr
     p1 <- (phrase2C . wrapPhrase) phrase1
@@ -524,10 +527,12 @@
     elsePart | isNothing mphrase2 = return $ empty
              | otherwise = liftM (text "else" $$) $ (phrase2C . wrapPhrase) (fromJust mphrase2)
 phrase2C (Assignment ref expr) = do
-    r <- ref2C ref 
-    e <- expr2C expr
-    return $
-        r <> text " = " <> e <> semi
+    r <- ref2C ref
+    t <- gets lastType
+    e <- case (t, expr) of
+         (BTFunction _, (Reference r')) -> ref2C r'
+         _ -> expr2C expr
+    return $ r <+> text "=" <+> e <> semi
 phrase2C (WhileCycle expr phrase) = do
     e <- expr2C expr
     p <- phrase2C $ wrapPhrase phrase
@@ -599,7 +604,12 @@
         ("!=", BTString, _) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strncompare" (BTFunction BTBool))
         ("&", BTBool, _) -> return $ parens e1 <+> text "&&" <+> parens e2
         ("|", BTBool, _) -> return $ parens e1 <+> text "||" <+> parens e2
-        (o, _, _) -> return $ parens e1 <+> text o <+> parens e2
+        (o, _, _) | o `elem` boolOps -> do
+                        modify(\s -> s{lastType = BTBool})
+                        return $ parens e1 <+> text o <+> parens e2
+                  | otherwise -> return $ parens e1 <+> text o <+> parens e2
+    where
+        boolOps = ["==", "!=", "<", ">", "<=", ">="]
 expr2C (NumberLiteral s) = return $ text s
 expr2C (FloatLiteral s) = return $ text s
 expr2C (HexNumber s) = return $ text "0x" <> (text . map toLower $ s)