325 |
325 |
326 |
326 |
327 initExpr2C :: InitExpression -> State RenderState Doc |
327 initExpr2C :: InitExpression -> State RenderState Doc |
328 initExpr2C InitNull = return $ text "NULL" |
328 initExpr2C InitNull = return $ text "NULL" |
329 initExpr2C (InitAddress expr) = liftM ((<>) (text "&")) (initExpr2C expr) |
329 initExpr2C (InitAddress expr) = liftM ((<>) (text "&")) (initExpr2C expr) |
330 initExpr2C (InitPrefixOp op expr) = liftM2 (<>) (op2C op) (initExpr2C expr) |
330 initExpr2C (InitPrefixOp op expr) = liftM (text (op2C op) <>) (initExpr2C expr) |
331 initExpr2C (InitBinOp op expr1 expr2) = do |
331 initExpr2C (InitBinOp op expr1 expr2) = do |
332 e1 <- initExpr2C expr1 |
332 e1 <- initExpr2C expr1 |
333 e2 <- initExpr2C expr2 |
333 e2 <- initExpr2C expr2 |
334 o <- op2C op |
334 return $ parens $ e1 <+> text (op2C op) <+> e2 |
335 return $ parens $ e1 <+> o <+> e2 |
|
336 initExpr2C (InitNumber s) = return $ text s |
335 initExpr2C (InitNumber s) = return $ text s |
337 initExpr2C (InitFloat s) = return $ text s |
336 initExpr2C (InitFloat s) = return $ text s |
338 initExpr2C (InitHexNumber s) = return $ text "0x" <> (text . map toLower $ s) |
337 initExpr2C (InitHexNumber s) = return $ text "0x" <> (text . map toLower $ s) |
339 initExpr2C (InitString s) = return $ doubleQuotes $ text s |
338 initExpr2C (InitString s) = return $ doubleQuotes $ text s |
340 initExpr2C (InitChar a) = return $ quotes $ text "\\x" <> text (showHex (read a) "") |
339 initExpr2C (InitChar a) = return $ quotes $ text "\\x" <> text (showHex (read a) "") |
453 |
452 |
454 expr2C :: Expression -> State RenderState Doc |
453 expr2C :: Expression -> State RenderState Doc |
455 expr2C (Expression s) = return $ text s |
454 expr2C (Expression s) = return $ text s |
456 expr2C (BinOp op expr1 expr2) = do |
455 expr2C (BinOp op expr1 expr2) = do |
457 e1 <- expr2C expr1 |
456 e1 <- expr2C expr1 |
|
457 t1 <- gets lastType |
458 e2 <- expr2C expr2 |
458 e2 <- expr2C expr2 |
459 o <- op2C op |
459 case (op2C op, t1) of |
460 return $ parens $ e1 <+> o <+> e2 |
460 ("+", BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strconcat" (BTFunction BTString)) |
|
461 --("==", BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strcompare" (BTFunction BTBool)) |
|
462 --("!=", BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strncompare" (BTFunction BTBool)) |
|
463 ("&", BTBool) -> return $ parens $ e1 <+> text "&&" <+> e2 |
|
464 ("|", BTBool) -> return $ parens $ e1 <+> text "||" <+> e2 |
|
465 (o, _) -> return $ parens $ e1 <+> text o <+> e2 |
461 expr2C (NumberLiteral s) = return $ text s |
466 expr2C (NumberLiteral s) = return $ text s |
462 expr2C (FloatLiteral s) = return $ text s |
467 expr2C (FloatLiteral s) = return $ text s |
463 expr2C (HexNumber s) = return $ text "0x" <> (text . map toLower $ s) |
468 expr2C (HexNumber s) = return $ text "0x" <> (text . map toLower $ s) |
464 expr2C (StringLiteral s) = return $ doubleQuotes $ text s |
469 expr2C (StringLiteral s) = return $ doubleQuotes $ text s |
465 expr2C (Reference ref) = ref2C ref |
470 expr2C (Reference ref) = ref2C ref |
466 expr2C (PrefixOp op expr) = liftM2 (<>) (op2C op) (expr2C expr) |
471 expr2C (PrefixOp op expr) = liftM (text (op2C op) <>) (expr2C expr) |
467 expr2C Null = return $ text "NULL" |
472 expr2C Null = return $ text "NULL" |
468 expr2C (BuiltInFunCall params ref) = do |
473 expr2C (BuiltInFunCall params ref) = do |
469 r <- ref2C ref |
474 r <- ref2C ref |
470 ps <- mapM expr2C params |
475 ps <- mapM expr2C params |
471 return $ |
476 return $ |
538 e <- expr2C expr |
543 e <- expr2C expr |
539 return $ parens t <> e |
544 return $ parens t <> e |
540 ref2C (RefExpression expr) = expr2C expr |
545 ref2C (RefExpression expr) = expr2C expr |
541 |
546 |
542 |
547 |
543 op2C :: String -> State RenderState Doc |
548 op2C :: String -> String |
544 op2C "or" = return $ text "|" |
549 op2C "or" = "|" |
545 op2C "and" = return $ text "&" |
550 op2C "and" = "&" |
546 op2C "not" = return $ text "!" |
551 op2C "not" = "!" |
547 op2C "xor" = return $ text "^" |
552 op2C "xor" = "^" |
548 op2C "div" = return $ text "/" |
553 op2C "div" = "/" |
549 op2C "mod" = return $ text "%" |
554 op2C "mod" = "%" |
550 op2C "shl" = return $ text "<<" |
555 op2C "shl" = "<<" |
551 op2C "shr" = return $ text ">>" |
556 op2C "shr" = ">>" |
552 op2C "<>" = return $ text "!=" |
557 op2C "<>" = "!=" |
553 op2C "=" = return $ text "==" |
558 op2C "=" = "==" |
554 op2C a = return $ text a |
559 op2C a = a |
555 |
560 |