From 8f6cc26accf75dcbe967d9deade4a1d31e20bc38 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 09:48:17 +0800 Subject: [PATCH 01/46] Update README and add Core Erlang Spec --- AUTHORS | 2 - Core Erlang 1.0.3.pdf | Bin 0 -> 237512 bytes CoreErlang.cabal | 12 +++-- Language/CoreErlang/Syntax.hs | 11 +++-- README | 87 +++++++++++++++++++++++++++++++++- 5 files changed, 100 insertions(+), 12 deletions(-) delete mode 100644 AUTHORS create mode 100644 Core Erlang 1.0.3.pdf diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 9b572cd..0000000 --- a/AUTHORS +++ /dev/null @@ -1,2 +0,0 @@ -David Castro Pérez -Henrique Ferreiro García diff --git a/Core Erlang 1.0.3.pdf b/Core Erlang 1.0.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..164651a1f83f71932641706a930361f8a4bf86d4 GIT binary patch literal 237512 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
hzAk%55aKXO!mE4lP5UG>km@()+d$ic$$ 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

F&OmpTY+?QjUL-w&~^4u2T2 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 Henrique Ferreiro García -maintainer: +maintainer: Alex Kropivny + Feng Lee homepage: http://github.com/amtal/CoreErlang category: Language synopsis: Manipulating Core Erlang source code @@ -24,11 +25,12 @@ library Language.CoreErlang.Parser, Language.CoreErlang.Pretty, Language.CoreErlang.Syntax - build-depends: + build-depends: base >=4.8 && <=4.11, - pretty >=1.1 && <1.2, + pretty >=1.1 && <1.2, parsec >=3.1 && <3.2 - other-extensions: DeriveDataTypeable + other-extensions: + DeriveDataTypeable source-repository head type: git diff --git a/Language/CoreErlang/Syntax.hs b/Language/CoreErlang/Syntax.hs index 295d2b8..0ebea62 100644 --- a/Language/CoreErlang/Syntax.hs +++ b/Language/CoreErlang/Syntax.hs @@ -3,15 +3,17 @@ -- Module : Language.CoreErlang.Syntax -- Copyright : (c) Henrique Ferreiro García 2008 -- (c) David Castro Pérez 2008 --- License : BSD-style (see the file LICENSE) +-- License : BSD-style (see the LICENSE file) -- -- Maintainer : Alex Kropivny -- Stability : experimental -- Portability : portable -- --- A suite of datatypes describing the abstract syntax of CoreErlang 1.0.3. --- - +-- Abstract Syntax Tree of Core Erlang. +-- +-- +-- +-- ----------------------------------------------------------------------------- {-# LANGUAGE DeriveDataTypeable #-} @@ -33,6 +35,7 @@ module Language.CoreErlang.Syntax ( Ann(..), ) where +import Prelude import Data.Data -- | This type is used to represent variables diff --git a/README b/README index 77ddc48..ac5c170 100644 --- a/README +++ b/README @@ -1,5 +1,90 @@ -CoreErlang is a haskell library which consists on a parser and pretty-printer for the intermediate language used by Erlang. +# CoreErlang + +CoreErlang is a haskell library which consists on a parser and pretty-printer for the intermediate language used by Erlang. The parser uses the Parsec library and the pretty-printer was modelled after the corresponding module of the haskell-src package. It also exposes a Syntax module which allows easy manipulation of terms. It is able to parse and pretty print all of Core Erlang. Remaining work includes customizing the pretty printer and refining the syntax interface. + +# Syntax + +*module* ::= **module** *Atom* [*fnamei1* , ... , *fnameik*] **attributes** [*attr1*, ..., *attrm*] *fundef1* ... *fundefn* **end** + +*attr* ::= *Atom* = *const* + +*fundef* ::= *fname* = *fun* + +*fname* ::= *Atom* / *Integer* + +*const* ::= *lit* | *clist* | *ctuple* | *cmap* + +*clist* ::= [*const1* | *const2*] + +*ctuple* ::= {*const1* , ..., *constn*} + +*cmap* ::= \~{*const1* => *const2* , ..., *constm* => *constn*}\~ + +*lit* ::= *Atom* | *Integer* | *Float* | *Char* | *String* | [ ] + +*fun* ::= **fun** (*var1*, ..., *varn*) -> *exprs* + +*var* ::= *VariableName* + +*exprs* ::= *expr* | <*expr1* , ..., *exprn*> + +*expr* ::= *var* | *fname* | *lit* | *fun* + +​\ | [*exprs1* | *exprs2*] + +​\ | {*exprs1*, ..., *exprsn*} + +​ | \~{*exprs1* => *exprs2* , ..., *exprsm* => *exprsn*}\~ + +​ | **let** *vars* = *exprs1* **in** *exprs2* + +​ | **case** *exprs* **of** *clause1* · · · *clausen* **end** + +​ | **letrec** *fname1* = *fun1* · · · *fnamen* = *funn* **in** *exprs* + +​ | **apply** *exprs0* (*exprs1*, . . ., *exprsn*) + +​ | **call** *exprs′1*:*exprs′2*(*exprs1*, . . ., *exprsn*) + +​ | **primop** *Atom*(*exprs1*, . . ., *exprsn*) + +​ | **receive** *clause1* · · · *clausen* **after** *exprs1* -> *exprs2* + +​ | **try** *exprs1* **of** <*var1*, . . .*varn*> -> *exprs2* + +​ **catch** <*varn+1*, . . .*varn+m*> -> *exprs3* + +​ | **do** *exprs1* *exprs2* + +​ | **catch** *exprs* + +*vars* ::= *var* | <*var1*, ..., *varn*> + +*clause* ::= *pats* **when** *exprs1* -> *exprs2* + +*pats* ::= *pat* | <*pat1*, ..., *patn*> + +*pat* ::= *var* | *lit* | *var* = *pat* | *plist* | *ptuple* | *pmap* + +*plist* ::= [*pat1* | *pat2*] + +*ptuple* ::= {*pat1*, ..., *patn*} + +*pmap* ::= \~{*pkey1* := *pat1*, ..., *pkeyn* := *patn*}\~ + +*pkey* ::= *var* | *lit* + +## License + +BSD3 + +## Authors + +David Castro Pérez +Henrique Ferreiro García +Feng Lee + From ceb000bd641209601b3a1759734297deaa978de8 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 09:49:11 +0800 Subject: [PATCH 02/46] Rename the 'README' to 'README.md' --- README => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README => README.md (100%) diff --git a/README b/README.md similarity index 100% rename from README rename to README.md From edc37f0e7c02a1d18968a988a125b1248e578996 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 09:52:16 +0800 Subject: [PATCH 03/46] Update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ac5c170..6cc747b 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ It is able to parse and pretty print all of Core Erlang. Remaining work includes *expr* ::= *var* | *fname* | *lit* | *fun* -​\ | [*exprs1* | *exprs2*] +​ | [*exprs1* | *exprs2*] -​\ | {*exprs1*, ..., *exprsn*} +​ | {*exprs1*, ..., *exprsn*} ​ | \~{*exprs1* => *exprs2* , ..., *exprsm* => *exprsn*}\~ From da6a6a35c52121cfadbdd1a9a9b3fe2635fb6183 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 13:29:35 +0800 Subject: [PATCH 04/46] Update source files and add Makefile --- .gitignore | 3 + CoreErlang.cabal | 13 +- Language/CoreErlang/Syntax.hs | 160 ---------- Makefile | 16 + .../Language}/CoreErlang/Parser.hs | 81 ++--- .../Language}/CoreErlang/Pretty.hs | 294 +++++++++--------- src/Language/CoreErlang/Syntax.hs | 166 ++++++++++ stack.yaml | 7 + 8 files changed, 384 insertions(+), 356 deletions(-) create mode 100644 .gitignore delete mode 100644 Language/CoreErlang/Syntax.hs create mode 100644 Makefile rename {Language => src/Language}/CoreErlang/Parser.hs (88%) rename {Language => src/Language}/CoreErlang/Pretty.hs (54%) create mode 100644 src/Language/CoreErlang/Syntax.hs create mode 100644 stack.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb42641 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.stack-work/ +dist-newstyle/ +stack.yaml.lock diff --git a/CoreErlang.cabal b/CoreErlang.cabal index 8418a90..4fb1276 100644 --- a/CoreErlang.cabal +++ b/CoreErlang.cabal @@ -8,7 +8,7 @@ author: David Castro Pérez maintainer: Alex Kropivny Feng Lee -homepage: http://github.com/amtal/CoreErlang +homepage: http://github.com/hamler-lang/CoreErlang category: Language synopsis: Manipulating Core Erlang source code description: @@ -18,20 +18,25 @@ build-type: Simple cabal-version: >= 1.6 extra-source-files: - AUTHORS LICENSE + LICENSE + README.md library + hs-source-dirs: + src exposed-modules: Language.CoreErlang.Parser, Language.CoreErlang.Pretty, Language.CoreErlang.Syntax build-depends: - base >=4.8 && <=4.11, + base >=4.11 && <=4.13, pretty >=1.1 && <1.2, parsec >=3.1 && <3.2 other-extensions: DeriveDataTypeable + LambdaCase source-repository head type: git - location: https://github.com/amtal/CoreErlang.git + location: https://github.com/hamler-lang/CoreErlang.git + diff --git a/Language/CoreErlang/Syntax.hs b/Language/CoreErlang/Syntax.hs deleted file mode 100644 index 0ebea62..0000000 --- a/Language/CoreErlang/Syntax.hs +++ /dev/null @@ -1,160 +0,0 @@ ------------------------------------------------------------------------------ --- | --- Module : Language.CoreErlang.Syntax --- Copyright : (c) Henrique Ferreiro García 2008 --- (c) David Castro Pérez 2008 --- License : BSD-style (see the LICENSE file) --- --- Maintainer : Alex Kropivny --- Stability : experimental --- Portability : portable --- --- Abstract Syntax Tree of Core Erlang. --- --- --- --- ------------------------------------------------------------------------------ -{-# LANGUAGE DeriveDataTypeable #-} - -module Language.CoreErlang.Syntax ( - -- * Modules - Module(..), - -- * Declarations - FunDef(..), - -- * Expressions - Exp(..), Exps(..), Alt(..), Guard(..), - List(..), TimeOut(..), BitString(..), Function(..), - -- * Patterns - Pats(..), Pat(..), Alias(..), - -- * Literals - Literal(..), Const(..), Atom(..), - -- * Variables - Var, - -- * Annotations - Ann(..), - ) where - -import Prelude -import Data.Data - --- | This type is used to represent variables -type Var = String - --- | This type is used to represent atoms -data Atom = Atom String - deriving (Eq,Ord,Show,Data,Typeable) - --- | This type is used to represent function names -data Function = Function (Atom,Integer) - deriving (Eq,Ord,Show,Data,Typeable) - --- | A CoreErlang source module. -data Module - = Module Atom [Function] [(Atom,Const)] [FunDef] - deriving (Eq,Ord,Show,Data,Typeable) - --- | This type is used to represent constants -data Const - = CLit Literal - | CTuple [Const] - | CList (List Const) - deriving (Eq,Ord,Show,Data,Typeable) - --- | This type is used to represent lambdas -data FunDef - = FunDef (Ann Function) (Ann Exp) - deriving (Eq,Ord,Show,Data,Typeable) - --- | /literal/. --- Values of this type hold the abstract value of the literal, not the --- precise string representation used. For example, @10@, @0o12@ and @0xa@ --- have the same representation. -data Literal - = LChar Char -- ^ character literal - | LString String -- ^ string literal - | LInt Integer -- ^ integer literal - | LFloat Double -- ^ floating point literal - | LAtom Atom -- ^ atom literal - | LNil -- ^ empty list - deriving (Eq,Ord,Show,Data,Typeable) - --- | CoreErlang expressions. -data Exps - = Exp (Ann Exp) -- ^ single expression - | Exps (Ann [Ann Exp]) -- ^ list of expressions - deriving (Eq,Ord,Show,Data,Typeable) - --- | CoreErlang expression. -data Exp - = Var Var -- ^ variable - | Lit Literal -- ^ literal constant - | Fun Function -- ^ function name - | App Exps [Exps] -- ^ application - | ModCall (Exps,Exps) [Exps] -- ^ module call - | Lambda [Var] Exps -- ^ lambda expression - | Seq Exps Exps -- ^ sequencing - | Let ([Var],Exps) Exps -- ^ local declaration - | LetRec [FunDef] Exps -- ^ letrec expression - | Case Exps [Ann Alt] -- ^ @case@ /exp/ @of@ /alts/ end - | Tuple [Exps] -- ^ tuple expression - | List (List Exps) -- ^ list expression - | Binary [BitString Exps] -- ^ binary expression - | Op Atom [Exps] -- ^ operator application - | Try Exps ([Var],Exps) ([Var],Exps) -- ^ try expression - | Rec [Ann Alt] TimeOut -- ^ receive expression - | Catch Exps -- ^ catch expression - deriving (Eq,Ord,Show,Data,Typeable) - --- | A bitstring. -data BitString a - = BitString a [Exps] - deriving (Eq,Ord,Show,Data,Typeable) - --- | A list of expressions -data List a - = L [a] - | LL [a] a - deriving (Eq,Ord,Show,Data,Typeable) - --- | An /alt/ in a @case@ expression -data Alt - = Alt Pats Guard Exps - deriving (Eq,Ord,Show,Data,Typeable) - -data Pats - = Pat Pat -- ^ single pattern - | Pats [Pat] -- ^ list of patterns - deriving (Eq,Ord,Show,Data,Typeable) - --- | A pattern, to be matched against a value. -data Pat - = PVar Var -- ^ variable - | PLit Literal -- ^ literal constant - | PTuple [Pat] -- ^ tuple pattern - | PList (List Pat) -- ^ list pattern - | PBinary [BitString Pat] -- ^ list of bitstring patterns - | PAlias Alias -- ^ alias pattern - deriving (Eq,Ord,Show,Data,Typeable) - --- | An alias, used in patterns -data Alias - = Alias Var Pat - deriving (Eq,Ord,Show,Data,Typeable) - --- | A guarded alternative @when@ /exp/ @->@ /exp/. --- The first expression will be Boolean-valued. -data Guard - = Guard Exps - deriving (Eq,Ord,Show,Data,Typeable) - --- | The timeout of a receive expression -data TimeOut - = TimeOut Exps Exps - deriving (Eq,Ord,Show,Data,Typeable) - --- | An annotation for modules, variables, ... -data Ann a - = Constr a -- ^ core erlang construct - | Ann a [Const] -- ^ core erlang annotated construct - deriving (Eq,Ord,Show,Data,Typeable) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c888437 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +package = CoreErlang +stack_yaml = STACK_YAML="stack.yaml" +stack = $(stack_yaml) stack + +all: build + +build: + $(stack) build + +install: + $(stack) install + +test: + $(stack) test --fast $(package) + +.PHONY : build install test diff --git a/Language/CoreErlang/Parser.hs b/src/Language/CoreErlang/Parser.hs similarity index 88% rename from Language/CoreErlang/Parser.hs rename to src/Language/CoreErlang/Parser.hs index 5568354..60616fe 100644 --- a/Language/CoreErlang/Parser.hs +++ b/src/Language/CoreErlang/Parser.hs @@ -9,9 +9,9 @@ -- Stability : experimental -- Portability : portable -- --- CoreErlang parser. --- - +-- Parser for Core Erlang. +-- +-- ----------------------------------------------------------------------------- module Language.CoreErlang.Parser @@ -136,10 +136,10 @@ amodule = do reserved "module" reserved "end" return $ Module name funs attrs fundefs -exports :: Parser [Function] +exports :: Parser [FunName] exports = brackets $ commaSep function -attributes :: Parser [(Atom,Const)] +attributes :: Parser [(Atom, Const)] attributes = do reserved "attributes" brackets (commaSep $ do a <- atom symbol "=" @@ -157,12 +157,12 @@ fundef = do name <- annotated function body <- annotated lambda return $ FunDef name body -function :: Parser Function +function :: Parser FunName function = do a <- atom char '/' i <- decimal whiteSpace -- TODO: buff - return $ Function (a,i) + return $ FunName (a, i) literal :: Parser Literal literal = try (liftM LFloat float) <|> liftM LInt integer <|> @@ -171,11 +171,11 @@ literal = try (liftM LFloat float) <|> liftM LInt integer <|> nil :: Parser Literal nil = brackets (return LNil) -expression :: Parser Exps -expression = try (liftM Exps (annotated $ angles $ commaSep (annotated sexpression))) <|> - liftM Exp (annotated sexpression) +expression :: Parser Exprs +expression = try (liftM Exprs (annotated $ angles $ commaSep (annotated sexpression))) <|> + liftM Expr (annotated sexpression) -sexpression :: Parser Exp +sexpression :: Parser Expr sexpression = app <|> ecatch <|> ecase <|> elet <|> liftM Fun (try function) {- because of atom -} <|> lambda <|> letrec <|> liftM Binary (ebinary expression) <|> @@ -184,30 +184,30 @@ sexpression = app <|> ecatch <|> ecase <|> elet <|> eseq <|> etry <|> liftM Tuple (tuple expression) <|> liftM Var variable -app :: Parser Exp +app :: Parser Expr app = do reserved "apply" e1 <- expression eN <- parens $ commaSep expression return $ App e1 eN -ecatch :: Parser Exp +ecatch :: Parser Expr ecatch = do reserved "catch" e <- expression return $ Catch e -ebinary :: Parser a -> Parser [BitString a] +ebinary :: Parser a -> Parser [Bitstring a] ebinary p = do symbol "#" bs <- braces (commaSep (bitstring p)) symbol "#" return bs -bitstring :: Parser a -> Parser (BitString a) +bitstring :: Parser a -> Parser (Bitstring a) bitstring p = do symbol "#" e0 <- angles p es <- parens (commaSep expression) - return $ BitString e0 es + return $ Bitstring e0 es -ecase :: Parser Exp +ecase :: Parser Expr ecase = do reserved "case" exp <- expression reserved "of" @@ -242,7 +242,7 @@ guard = do reserved "when" e <- expression return $ Guard e -elet :: Parser Exp +elet :: Parser Expr elet = do reserved "let" vars <- variables symbol "=" @@ -252,16 +252,16 @@ elet = do reserved "let" return $ Let (vars,e1) e2 variables :: Parser [Var] -variables = do { v <- variable; return [v]} <|> (angles $ commaSep variable) +variables = do { v <- variable; return [v] } <|> (angles $ commaSep variable) -lambda :: Parser Exp +lambda :: Parser Expr lambda = do reserved "fun" vars <- parens $ commaSep variable symbol "->" expr <- expression return $ Lambda vars expr -letrec :: Parser Exp +letrec :: Parser Expr letrec = do reserved "letrec" defs <- many fundef reserved "in" @@ -277,7 +277,7 @@ list elem = do elems <- commaSep1 elem t <- elem return $ LL elems t) -modcall :: Parser Exp +modcall :: Parser Expr modcall = do reserved "call" e1 <- expression symbol ":" @@ -285,13 +285,13 @@ modcall = do reserved "call" eN <- parens $ commaSep expression return $ ModCall (e1, e2) eN -op :: Parser Exp +op :: Parser Expr op = do reserved "primop" a <- atom e <- parens $ commaSep expression - return $ Op a e + return $ PrimOp a e -receive :: Parser Exp +receive :: Parser Expr receive = do reserved "receive" alts <- many $ annotated clause to <- timeout @@ -304,13 +304,13 @@ timeout = do reserved "after" e2 <- expression return $ TimeOut e1 e2 -eseq :: Parser Exp +eseq :: Parser Expr eseq = do reserved "do" e1 <- expression e2 <- expression return $ Seq e1 e2 -etry :: Parser Exp +etry :: Parser Expr etry = do reserved "try" e1 <- expression reserved "of" @@ -341,19 +341,19 @@ annotated p = parens (do e <- p lexer :: TokenParser () lexer = makeTokenParser - (emptyDef { - -- commentStart = "", - -- commentEnd = "", - commentLine = "%", - -- nestedComments = True, - identStart = upper <|> char '_', - identLetter = namechar - -- opStart, - -- opLetter, - -- reservedNames, - -- reservedOpNames, - -- caseSensitive = True, - }) + (emptyDef { + -- commentStart = "", + -- commentEnd = "", + commentLine = "%", + -- nestedComments = True, + identStart = upper <|> char '_', + identLetter = namechar + -- opStart, + -- opLetter, + -- reservedNames, + -- reservedOpNames, + -- caseSensitive = True, + }) angles = Token.angles lexer braces = Token.braces lexer @@ -384,3 +384,4 @@ parseModule input = parse (do whiteSpace x <- emodule eof return x) "" input + diff --git a/Language/CoreErlang/Pretty.hs b/src/Language/CoreErlang/Pretty.hs similarity index 54% rename from Language/CoreErlang/Pretty.hs rename to src/Language/CoreErlang/Pretty.hs index f8ab94c..2cecb68 100644 --- a/Language/CoreErlang/Pretty.hs +++ b/src/Language/CoreErlang/Pretty.hs @@ -12,27 +12,29 @@ -- Pretty printer for CoreErlang. -- ----------------------------------------------------------------------------- - -module Language.CoreErlang.Pretty ( - -- * Pretty printing - Pretty, - prettyPrintStyleMode, prettyPrintWithMode, prettyPrint, - -- * Pretty-printing styles (from -- "Text.PrettyPrint.HughesPJ") - P.Style(..), P.style, P.Mode(..), - -- * CoreErlang formatting modes - PPMode(..), Indent, PPLayout(..), defaultMode) where - +{-# LANGUAGE LambdaCase #-} + +module Language.CoreErlang.Pretty + ( -- * Pretty printing + Pretty + , prettyPrintStyleMode, prettyPrintWithMode, prettyPrint + -- * Pretty-printing styles (from -- "Text.PrettyPrint.HughesPJ") + , P.Style(..), P.style, P.Mode(..) + -- * CoreErlang formatting modes + , PPMode(..), Indent, PPLayout(..), defaultMode + ) where + +import Prelude hiding ((<>)) import Language.CoreErlang.Syntax - import qualified Text.PrettyPrint as P infixl 5 $$$ -------------------------------------------------------------------------------- +----------------------------------------------------------------------------- -- | Varieties of layout we can use. -data PPLayout = PPDefault -- ^ classical layout - | PPNoLayout -- ^ everything on a single line +data PPLayout = PPDefault -- ^ classical layout + | PPNoLayout -- ^ everything on a single line deriving Eq type Indent = Int @@ -73,16 +75,16 @@ defaultMode = PPMode { newtype DocM s a = DocM (s -> a) instance Functor (DocM s) where - fmap f xs = do x <- xs; return (f x) + fmap f xs = do x <- xs; return (f x) instance Applicative (DocM s) where - pure = return - (<*>) m1 m2 = do x1 <- m1; x2 <- m2; return (x1 x2) + pure = return + (<*>) m1 m2 = do x1 <- m1; x2 <- m2; return (x1 x2) instance Monad (DocM s) where - (>>=) = thenDocM - (>>) = then_DocM - return = retDocM + (>>=) = thenDocM + (>>) = then_DocM + return = retDocM {-# INLINE thenDocM #-} {-# INLINE then_DocM #-} @@ -113,12 +115,12 @@ type Doc = DocM PPMode P.Doc -- | Things that can be pretty-printed, including all the syntactic objects -- in "Language.CoreErlang.Syntax". class Pretty a where - -- | Pretty-print something in isolation. - pretty :: a -> Doc - -- | Pretty-print something in a precedence context. - prettyPrec :: Int -> a -> Doc - pretty = prettyPrec 0 - prettyPrec _ = pretty + -- | Pretty-print something in isolation. + pretty :: a -> Doc + -- | Pretty-print something in a precedence context. + prettyPrec :: Int -> a -> Doc + pretty = prettyPrec 0 + prettyPrec _ = pretty -- The pretty printing combinators @@ -129,9 +131,8 @@ nest :: Int -> Doc -> Doc nest i m = m >>= return . P.nest i -- Literals -text, ptext :: String -> Doc +text :: String -> Doc text = return . P.text -ptext = return . P.text char :: Char -> Doc char = return . P.char @@ -149,62 +150,41 @@ double :: Double -> Doc double = return . P.double -- Simple Combining Forms -parens, brackets, braces, quotes, doubleQuotes :: Doc -> Doc +parens, brackets, braces :: Doc -> Doc parens d = d >>= return . P.parens brackets d = d >>= return . P.brackets braces d = d >>= return . P.braces -quotes d = d >>= return . P.quotes -doubleQuotes d = d >>= return . P.doubleQuotes - -parensIf :: Bool -> Doc -> Doc -parensIf True = parens -parensIf False = id +-- quotes d = d >>= return . P.quotes +-- doubleQuotes d = d >>= return . P.doubleQuotes -- Constants -semi, comma, colon, space, equals :: Doc -semi = return P.semi +comma :: Doc comma = return P.comma -colon = return P.colon -space = return P.space -equals = return P.equals - -lparen, rparen, lbrack, rbrack, lbrace, rbrace :: Doc -lparen = return P.lparen -rparen = return P.rparen -lbrack = return P.lbrack -rbrack = return P.rbrack -lbrace = return P.lbrace -rbrace = return P.rbrace +-- semi = return P.semi +-- colon = return P.colon +-- space = return P.space +-- equals = return P.equals -- Combinators - -(<>),(<+>),($$),($+$) :: Doc -> Doc -> Doc +(<>),(<+>),($$) :: Doc -> Doc -> Doc aM <> bM = do { a <- aM; b <- bM; return $ a P.<> b} aM <+> bM = do { a <- aM; b <- bM; return $ a P.<+> b} aM $$ bM = do { a <- aM; b <- bM; return $ a P.$$ b} -aM $+$ bM = do { a <- aM; b <- bM; return $ a P.$+$ b} -hcat, hsep, vcat, sep, cat, fsep, fcat :: [Doc] -> Doc +hcat, hsep, vcat, sep, fsep :: [Doc] -> Doc hcat dl = sequence dl >>= return . P.hcat hsep dl = sequence dl >>= return . P.hsep vcat dl = sequence dl >>= return . P.vcat sep dl = sequence dl >>= return . P.sep -cat dl = sequence dl >>= return . P.cat fsep dl = sequence dl >>= return . P.fsep -fcat dl = sequence dl >>= return . P.fcat - --- Some More - -hang :: Doc -> Int -> Doc -> Doc -hang dM i rM = do { d <- dM; r <- rM; return $ P.hang d i r } -- Yuk, had to cut-n-paste this one from Pretty.hs punctuate :: Doc -> [Doc] -> [Doc] -punctuate _ [] = [] +punctuate _ [] = [] punctuate p (d1:ds) = go d1 ds - where - go d [] = [d] - go d (e:es) = (d <> p) : go e es + where + go d [] = [d] + go d (e:es) = (d <> p) : go e es -- | render the document with a given style and mode. renderStyleMode :: P.Style -> PPMode -> Doc -> String @@ -239,126 +219,135 @@ fullRender :: P.Mode -> Int -> Float -> (P.TextDetails -> a -> a) -> a -> Doc -> a fullRender = fullRenderWithMode defaultMode -------------------------- Pretty-Print a Module -------------------- +------------------------- Pretty-Print a Module -------------------- + instance Pretty Module where - pretty (Module m exports attrs fundefs) = - topLevel (ppModuleHeader m exports attrs) - (map pretty fundefs) + pretty (Module m exports attrs fundefs) = + topLevel (ppModuleHeader m exports attrs) (map pretty fundefs) -------------------------- Module Header ------------------------------ -ppModuleHeader :: Atom -> [Function] -> [(Atom,Const)] -> Doc + +ppModuleHeader :: Atom -> [FunName] -> [(Atom, Const)] -> Doc ppModuleHeader m exports attrs = myFsep [ - text "module" <+> pretty m <+> (bracketList $ map pretty exports), - text "attributes" <+> bracketList (map ppAssign attrs)] + text "module" <+> pretty m <+> (bracketList $ map pretty exports), + text "attributes" <+> bracketList (map ppAssign attrs)] -instance Pretty Function where - pretty (Function (name,arity)) = - pretty name <> char '/' <> integer arity +instance Pretty FunName where + pretty (FunName (name, arity)) = pretty name <> char '/' <> integer arity instance Pretty Const where - pretty (CLit l) = pretty l - pretty (CTuple l) = ppTuple l - pretty (CList l) = pretty l + pretty = \case + (CLit l) -> pretty l + (CTuple l) -> ppTuple l + (CList l) -> pretty l ------------------------- Declarations ------------------------------ instance Pretty FunDef where - pretty (FunDef function exp) = (pretty function <+> char '=') $$$ - ppBody fundefIndent [pretty exp] + pretty (FunDef function exp) = (pretty function <+> char '=') + $$$ ppBody fundefIndent [pretty exp] ------------------------- Expressions ------------------------- instance Pretty Literal where - pretty (LChar c) = char c - pretty (LString s) = text (show s) - pretty (LInt i) = integer i - pretty (LFloat f) = double f - pretty (LAtom a) = pretty a - pretty LNil = bracketList [empty] + pretty = \case + (LChar c) -> char c + (LString s) -> text (show s) + (LInt i) -> integer i + (LFloat f) -> double f + (LAtom a) -> pretty a + LNil -> bracketList [empty] instance Pretty Atom where - pretty (Atom a) = char '\'' <> text a <> char '\'' - -instance Pretty Exps where - pretty (Exp e) = pretty e - pretty (Exps (Constr e)) = angleList (map pretty e) - pretty (Exps (Ann e cs)) = parens (angleList (map pretty e) - $$$ ppAnn cs) - -instance Pretty Exp where - pretty (Var v) = text v - pretty (Lit l) = pretty l - pretty (Fun f) = pretty f - pretty (App e exps) = text "apply" <+> - pretty e <> parenList (map pretty exps) - pretty (ModCall (e1,e2) exps) = sep [text "call" <+> - pretty e1 <> char ':' <> pretty e2, - parenList (map pretty exps)] - pretty (Lambda vars e) = sep [text "fun" <> parenList (map text vars) <+> text "->", - ppBody lambdaIndent [pretty e]] - pretty (Seq e1 e2) = sep [text "do", pretty e1, pretty e2] - pretty (Let (vars,e1) e2) = text "let" <+> - angleList (map text vars) <+> - char '=' <+> pretty e1 - $$$ text "in" <+> pretty e2 - pretty (LetRec fundefs e) = sep [text "letrec" <+> - ppBody letrecIndent (map pretty fundefs), - text "in", pretty e] - pretty (Case e alts) = sep [text "case", pretty e, text "of"] - $$$ ppBody caseIndent (map pretty alts) - $$$ text "end" - pretty (Tuple exps) = braceList $ map pretty exps - pretty (List l) = pretty l - pretty (Op a exps) = text "primop" <+> pretty a <> parenList (map pretty exps) - pretty (Binary bs) = char '#' <> braceList (map pretty bs) <> char '#' - pretty (Try e (vars1,exps1) (vars2,exps2)) = text "try" - $$$ ppBody caseIndent [pretty e] - $$$ text "of" <+> angleList (map text vars1) <+> text "->" - $$$ ppBody altIndent [pretty exps1] - $$$ text "catch" <+> angleList (map text vars2) <+> text "->" - $$$ ppBody altIndent [pretty exps2] - pretty (Rec alts tout) = text "receive" - $$$ ppBody caseIndent (map pretty alts) - $$$ text "after" - $$$ ppBody caseIndent [pretty tout] - pretty (Catch e) = sep [text "catch", pretty e] + pretty (Atom a) = char '\'' <> text a <> char '\'' + +instance Pretty Exprs where + pretty = \case + (Expr e) -> pretty e + (Exprs (Constr e)) -> angleList (map pretty e) + (Exprs (Ann e cs)) -> parens (angleList (map pretty e) $$$ ppAnn cs) + +instance Pretty Expr where + pretty = \case + (Var v) -> text v + (Lit l) -> pretty l + (Fun f) -> pretty f + (App e exps) -> text "apply" <+> pretty e <> parenList (map pretty exps) + (ModCall (e1,e2) exps) -> sep [text "call" <+> + pretty e1 <> char ':' <> pretty e2, + parenList (map pretty exps)] + (Lambda vars e) -> sep [text "fun" <> parenList (map text vars) <+> text "->", + ppBody lambdaIndent [pretty e]] + (Seq e1 e2) -> sep [text "do", pretty e1, pretty e2] + (Let (vars,e1) e2) -> text "let" <+> + angleList (map text vars) <+> + char '=' <+> pretty e1 + $$$ text "in" <+> pretty e2 + (LetRec fundefs e) -> sep [text "letrec" <+> ppBody letrecIndent (map pretty fundefs), + text "in", pretty e] + (Case e alts) -> sep [text "case", pretty e, text "of"] + $$$ ppBody caseIndent (map pretty alts) + $$$ text "end" + (Tuple exps) -> braceList $ map pretty exps + (List l) -> pretty l + (EMap m) -> ppMap m + (PrimOp a exps) -> text "primop" <+> pretty a <> parenList (map pretty exps) + (Binary bs) -> char '#' <> braceList (map pretty bs) <> char '#' + (Try e (vars1,exps1) (vars2,exps2)) -> text "try" + $$$ ppBody caseIndent [pretty e] + $$$ text "of" <+> angleList (map text vars1) <+> text "->" + $$$ ppBody altIndent [pretty exps1] + $$$ text "catch" <+> angleList (map text vars2) <+> text "->" + $$$ ppBody altIndent [pretty exps2] + (Rec alts tout) -> text "receive" + $$$ ppBody caseIndent (map pretty alts) + $$$ text "after" + $$$ ppBody caseIndent [pretty tout] + (Catch e) -> sep [text "catch", pretty e] instance Pretty a => Pretty (List a) where - pretty (L l) = bracketList $ map pretty l - pretty (LL h t) = brackets . hcat $ punctuate comma (map pretty h) ++ - [char '|' <> pretty t] + pretty (L l) = bracketList $ map pretty l + pretty (LL h t) = brackets . hcat $ punctuate comma (map pretty h) ++ [char '|' <> pretty t] + instance Pretty Alt where - pretty (Alt pats guard exps) = - myFsep [pretty pats, pretty guard <+> text "->"] - $$$ ppBody altIndent [pretty exps] + pretty (Alt pats guard exps) = + myFsep [pretty pats, pretty guard <+> text "->"] + $$$ ppBody altIndent [pretty exps] instance Pretty Pats where - pretty (Pat p) = pretty p - pretty (Pats p) = angleList (map pretty p) + pretty (Pat p) = pretty p + pretty (Pats p) = angleList (map pretty p) instance Pretty Pat where - pretty (PVar v) = text v - pretty (PLit l) = pretty l - pretty (PTuple p) = braceList $ map pretty p - pretty (PList l) = pretty l - pretty (PBinary bs) = char '#' <> braceList (map pretty bs) <> char '#' - pretty (PAlias a) = pretty a + pretty = \case + (PVar v) -> text v + (PLit l) -> pretty l + (PTuple p) -> braceList $ map pretty p + (PList l) -> pretty l + (PMap m) -> ppMap m + (PBinary bs) -> char '#' <> braceList (map pretty bs) <> char '#' + (PAlias a) -> pretty a + +instance (Pretty k, Pretty v) => Pretty (Map k v) where + pretty (Map l) = undefined -- TODO: braceList $ [pretty k <> ":=" <> pretty v | (k, v) <- l] + +ppMap m = text "~{" <> pretty m <> text "}~" instance Pretty Alias where - pretty (Alias v p) = ppAssign (Var v,p) -- FIXME: hack! + pretty (Alias v p) = ppAssign (Var v,p) -- FIXME: hack! instance Pretty Guard where - pretty (Guard e) = text "when" <+> pretty e + pretty (Guard e) = text "when" <+> pretty e instance Pretty TimeOut where - pretty (TimeOut e1 e2) = pretty e1 <+> text "->" - $$$ ppBody altIndent [pretty e2] + pretty (TimeOut e1 e2) = pretty e1 <+> text "->" + $$$ ppBody altIndent [pretty e2] -instance Pretty a => Pretty (BitString a) where - pretty (BitString e es) = text "#<" <> pretty e <> char '>' <> parenList (map pretty es) +instance Pretty a => Pretty (Bitstring a) where + pretty (Bitstring e es) = text "#<" <> pretty e <> char '>' <> parenList (map pretty es) ----------------------- Annotations ------------------------ instance Pretty a => Pretty (Ann a) where - pretty (Constr a) = pretty a - pretty (Ann a cs) = parens (pretty a $$$ ppAnn cs) + pretty (Constr a) = pretty a + pretty (Ann a cs) = parens (pretty a $$$ ppAnn cs) ------------------------- pp utils ------------------------- @@ -385,7 +374,7 @@ topLevel header dl = do e <- fmap layout getPPEnv PPNoLayout -> header <+> hsep dl s $$$ text "end" -ppAssign :: (Pretty a,Pretty b) => (a,b) -> Doc +ppAssign :: (Pretty a, Pretty b) => (a,b) -> Doc ppAssign (a,b) = pretty a <+> char '=' <+> pretty b ppTuple :: Pretty a => [a] -> Doc @@ -422,3 +411,4 @@ layoutChoice a b dl = do e <- getPPEnv ppAnn :: (Pretty a) => [a] -> Doc ppAnn cs = text "-|" <+> bracketList (map pretty cs) + diff --git a/src/Language/CoreErlang/Syntax.hs b/src/Language/CoreErlang/Syntax.hs new file mode 100644 index 0000000..064cfe5 --- /dev/null +++ b/src/Language/CoreErlang/Syntax.hs @@ -0,0 +1,166 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Language.CoreErlang.Syntax +-- Copyright : (c) Henrique Ferreiro García 2008 +-- (c) David Castro Pérez 2008 +-- License : BSD-style (see the LICENSE file) +-- +-- Maintainer : Alex Kropivny +-- Stability : experimental +-- Portability : portable +-- +-- Abstract Syntax Tree of Core Erlang. +-- +-- +-- +-- +----------------------------------------------------------------------------- +{-# LANGUAGE DeriveDataTypeable #-} + +module Language.CoreErlang.Syntax + ( -- * Modules + Module(..) + -- * Declarations + , FunDef(..) + -- * Expressions + , Expr(..), Exprs(..), Alt(..), Guard(..), Map(..) + , List(..), TimeOut(..), Bitstring(..), FunName(..) + -- * Patterns + , Pats(..), Pat(..), Alias(..) + -- * Literals + , Literal(..), Const(..), Atom(..) + -- * Variables + , Var + -- * Annotations + , Ann(..) + ) where + +import Prelude +import Data.Data + +-- | This type is used to represent variables +type Var = String + +-- | This type is used to represent atoms +data Atom = Atom String + deriving (Eq, Ord, Show, Data, Typeable) + +-- | This type is used to represent function names +data FunName = FunName (Atom, Integer) + deriving (Eq, Ord, Show, Data, Typeable) + +-- | Module Name +type Name = Atom +-- | Module Exports +type Exports = [FunName] +-- | Module Attrs +type Attrs = [(Atom, Const)] +-- | Module fundefs +type FunDefs = [FunDef] +-- | A CoreErlang source module. +data Module = Module Name Exports Attrs FunDefs + deriving (Eq, Ord, Show, Data, Typeable) + +-- | This type is used to represent constants +data Const + = CLit Literal + | CTuple [Const] + | CList (List Const) + deriving (Eq, Ord, Show, Data, Typeable) + +-- | This type is used to represent lambdas +data FunDef = FunDef (Ann FunName) (Ann Expr) + deriving (Eq, Ord, Show, Data, Typeable) + +-- | /literal/. +-- Values of this type hold the abstract value of the literal, not the +-- precise string representation used. For example, @10@, @0o12@ and @0xa@ +-- have the same representation. +data Literal + = LChar Char -- ^ character literal + | LString String -- ^ string literal + | LInt Integer -- ^ integer literal + | LFloat Double -- ^ floating point literal + | LAtom Atom -- ^ atom literal + | LNil -- ^ empty list + deriving (Eq, Ord, Show, Data, Typeable) + +-- | CoreErlang expressions. +data Exprs + = Expr (Ann Expr) -- ^ single expression + | Exprs (Ann [Ann Expr]) -- ^ list of expressions + deriving (Eq, Ord, Show, Data, Typeable) + +-- | CoreErlang expression. +data Expr + = Var Var -- ^ variable + | Lit Literal -- ^ literal constant + | Fun FunName -- ^ function name + | App Exprs [Exprs] -- ^ application + | ModCall (Exprs, Exprs) [Exprs] -- ^ module call + | Lambda [Var] Exprs -- ^ lambda expression + | Seq Exprs Exprs -- ^ sequencing + | Let ([Var], Exprs) Exprs -- ^ local declaration + | LetRec [FunDef] Exprs -- ^ letrec expression + | Case Exprs [Ann Alt] -- ^ @case@ /exp/ @of@ /alts/ end + | Tuple [Exprs] -- ^ tuple expression + | List (List Exprs) -- ^ list expression + | EMap (Map Expr Expr) -- ^ map expression + | Binary [Bitstring Exprs] -- ^ binary expression + | PrimOp Atom [Exprs] -- ^ operator application + | Try Exprs ([Var], Exprs) ([Var], Exprs) -- ^ try expression + | Rec [Ann Alt] TimeOut -- ^ receive expression + | Catch Exprs -- ^ catch expression + deriving (Eq, Ord, Show, Data, Typeable) + +-- | A bitstring. +data Bitstring a = Bitstring a [Exprs] + deriving (Eq, Ord, Show, Data, Typeable) + +-- | A list of expressions +data List a = L [a] | LL [a] a + deriving (Eq, Ord, Show, Data, Typeable) + +-- | An erlang map +data Map k v = Map [(k, v)] + deriving (Eq, Ord, Show, Data, Typeable) + +-- | An /alt/ in a @case@ expression +data Alt = Alt Pats Guard Exprs + deriving (Eq, Ord, Show, Data, Typeable) + +data Pats + = Pat Pat -- ^ single pattern + | Pats [Pat] -- ^ list of patterns + deriving (Eq, Ord, Show, Data, Typeable) + +-- | A pattern, to be matched against a value. +data Pat + = PVar Var -- ^ variable + | PLit Literal -- ^ literal constant + | PTuple [Pat] -- ^ tuple pattern + | PList (List Pat) -- ^ list pattern + | PMap (Map Literal Pat) -- ^ map pattern + | PBinary [Bitstring Pat] -- ^ list of bitstring patterns + | PAlias Alias -- ^ alias pattern + deriving (Eq, Ord, Show, Data, Typeable) + +-- | An alias, used in patterns +data Alias = Alias Var Pat + deriving (Eq, Ord, Show, Data, Typeable) + +-- | A guarded alternative @when@ /exp/ @->@ /exp/. +-- The first expression will be Boolean-valued. +data Guard = Guard Exprs + deriving (Eq, Ord, Show, Data, Typeable) + +-- | The timeout of a receive expression +data TimeOut = TimeOut Exprs Exprs + deriving (Eq, Ord, Show, Data, Typeable) + +-- | An annotation for modules, variables, ... +data Ann a + = Constr a -- ^ core erlang construct + | Ann a [Const] -- ^ core erlang annotated construct + deriving (Eq, Ord, Show, Data, Typeable) + diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..2fc50ea --- /dev/null +++ b/stack.yaml @@ -0,0 +1,7 @@ +resolver: lts-13.26 +pvp-bounds: upper +packages: +- '.' + +extra-deps: [] +flags: {} From dd9f950a407b370d6bfb9c35477170c39041d9a9 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 13:31:36 +0800 Subject: [PATCH 05/46] Update README --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6cc747b..03ed5a7 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,6 @@ BSD3 ## Authors -David Castro Pérez -Henrique Ferreiro García -Feng Lee +- David Castro Pérez +- Henrique Ferreiro García From d7b8df458073ef3aa2bb2d3c0158333e37472eba Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 15:17:39 +0800 Subject: [PATCH 06/46] Add examples --- examples/Hello.core | 31 +++++++++++++++++++++++++++++++ examples/Hello.erl | 12 ++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 examples/Hello.core create mode 100644 examples/Hello.erl diff --git a/examples/Hello.core b/examples/Hello.core new file mode 100644 index 0000000..69108e9 --- /dev/null +++ b/examples/Hello.core @@ -0,0 +1,31 @@ +module 'Hello' ['add'/2, + 'module_info'/0, + 'module_info'/1, + 'sub'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[72|[101|[108|[108|[111|[46|[101|[114|[108]]]]]]]]],1}], + %% Line 6 + 'compile' = + %% Line 6 + [{'inline',[{'sub',2}]}]] +'add'/2 = + %% Line 10 + fun (_0,_1) -> + call 'erlang':'+' + (_0, _1) +'sub'/2 = + %% Line 12 + fun (_0,_1) -> + call 'erlang':'-' + (_0, _1) +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('Hello') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('Hello', _0) +end \ No newline at end of file diff --git a/examples/Hello.erl b/examples/Hello.erl new file mode 100644 index 0000000..b0fee29 --- /dev/null +++ b/examples/Hello.erl @@ -0,0 +1,12 @@ +-module('Hello'). + +-export([add/2]). +-export([sub/2]). + +-compile({inline, [sub/2]}). + +-import('X', [hi/1]). + +add(X,Y) -> X + Y. + +sub(A,B) -> A - B. From 7c3a79fb1910f3cd0e97d3397c0081bbee252dee Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 17:19:10 +0800 Subject: [PATCH 07/46] Build using stack - Add packet.yaml - Generate a new cabal file --- .gitignore | 2 + ChangeLog.md | 3 + CoreErlang.cabal | 85 +++++++++++------- .../Core Erlang 1.0.3.pdf | Bin package.yaml | 41 +++++++++ test/Spec.hs | 2 + {examples => test/data}/Hello.core | 0 {examples => test/data}/Hello.erl | 0 8 files changed, 100 insertions(+), 33 deletions(-) create mode 100644 ChangeLog.md rename Core Erlang 1.0.3.pdf => doc/Core Erlang 1.0.3.pdf (100%) create mode 100644 package.yaml create mode 100644 test/Spec.hs rename {examples => test/data}/Hello.core (100%) rename {examples => test/data}/Hello.erl (100%) diff --git a/.gitignore b/.gitignore index bb42641..c1aa974 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .stack-work/ dist-newstyle/ stack.yaml.lock +*~ +.DS_Store diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 0000000..9474958 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,3 @@ +# Changelog for CoreErlang + +## Unreleased changes diff --git a/CoreErlang.cabal b/CoreErlang.cabal index 4fb1276..15c3cfe 100644 --- a/CoreErlang.cabal +++ b/CoreErlang.cabal @@ -1,42 +1,61 @@ -name: CoreErlang -version: 0.0.5 -copyright: 2008, David Castro Pérez, Henrique Ferreiro García -license: BSD3 -license-file: LICENSE -author: David Castro Pérez - Henrique Ferreiro García -maintainer: - Alex Kropivny - Feng Lee -homepage: http://github.com/hamler-lang/CoreErlang -category: Language -synopsis: Manipulating Core Erlang source code -description: - Facilities for manipulating Core Erlang source code: - an abstract syntax, parser and pretty-printer. -build-type: Simple -cabal-version: >= 1.6 +cabal-version: 1.12 +-- This file has been generated from package.yaml by hpack version 0.31.2. +-- +-- see: https://github.com/sol/hpack +-- +-- hash: 1f1ace413dfa81b5b1278ef46ec75f92303a09d5cf3e97b93625e33d64300a54 + +name: CoreErlang +version: 0.0.5 +synopsis: Manipulating Core Erlang source code +description: Facilities for manipulating Core Erlang source code: an abstract syntax, parser and pretty-printer. +category: Language +homepage: https://github.com/hamler-lang/CoreErlang +bug-reports: https://github.com/hamler-lang/CoreErlang/issues +author: David Castro Pérez , Henrique Ferreiro García +maintainer: Alex Kropivny , Feng Lee +copyright: 2008, David Castro Pérez, Henrique Ferreiro García +license: BSD3 +license-file: LICENSE +build-type: Simple extra-source-files: - LICENSE README.md + ChangeLog.md + +source-repository head + type: git + location: https://github.com/hamler-lang/CoreErlang library + exposed-modules: + Language.CoreErlang.Parser + Language.CoreErlang.Pretty + Language.CoreErlang.Syntax + other-modules: + Paths_CoreErlang hs-source-dirs: src - exposed-modules: - Language.CoreErlang.Parser, - Language.CoreErlang.Pretty, - Language.CoreErlang.Syntax + default-extensions: DeriveDataTypeable LambdaCase + ghc-options: -Wall -O2 build-depends: - base >=4.11 && <=4.13, - pretty >=1.1 && <1.2, - parsec >=3.1 && <3.2 - other-extensions: - DeriveDataTypeable - LambdaCase - -source-repository head - type: git - location: https://github.com/hamler-lang/CoreErlang.git + base >=4.7 && <5 + , parsec >=3.1 && <3.2 + , pretty >=1.1 && <1.2 + default-language: Haskell2010 +test-suite test + type: exitcode-stdio-1.0 + main-is: Spec.hs + other-modules: + Paths_CoreErlang + hs-source-dirs: + test + default-extensions: DeriveDataTypeable LambdaCase + ghc-options: -threaded -rtsopts -with-rtsopts=-N + build-depends: + CoreErlang + , base >=4.7 && <5 + , parsec >=3.1 && <3.2 + , pretty >=1.1 && <1.2 + default-language: Haskell2010 diff --git a/Core Erlang 1.0.3.pdf b/doc/Core Erlang 1.0.3.pdf similarity index 100% rename from Core Erlang 1.0.3.pdf rename to doc/Core Erlang 1.0.3.pdf diff --git a/package.yaml b/package.yaml new file mode 100644 index 0000000..e4282a2 --- /dev/null +++ b/package.yaml @@ -0,0 +1,41 @@ +name: CoreErlang +version: '0.0.5' +synopsis: "Manipulating Core Erlang source code" +description: "Facilities for manipulating Core Erlang source code: an abstract syntax, parser and pretty-printer." +category: Language +license: BSD3 +author: "David Castro Pérez , Henrique Ferreiro García " +maintainer: "Alex Kropivny , Feng Lee " +copyright: "2008, David Castro Pérez, Henrique Ferreiro García" +github: hamler-lang/CoreErlang +homepage: https://github.com/hamler-lang/CoreErlang + +extra-source-files: +- README.md +- ChangeLog.md + +dependencies: +- base >= 4.7 && < 5 +- pretty >=1.1 && <1.2 +- parsec >=3.1 && <3.2 + +library: + source-dirs: src + ghc-options: -Wall -O2 + default-extensions: + - DeriveDataTypeable + - LambdaCase + +tests: + test: + main: Spec.hs + source-dirs: test + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - CoreErlang + default-extensions: + - DeriveDataTypeable + - LambdaCase diff --git a/test/Spec.hs b/test/Spec.hs new file mode 100644 index 0000000..cd4753f --- /dev/null +++ b/test/Spec.hs @@ -0,0 +1,2 @@ +main :: IO () +main = putStrLn "Test suite not yet implemented" diff --git a/examples/Hello.core b/test/data/Hello.core similarity index 100% rename from examples/Hello.core rename to test/data/Hello.core diff --git a/examples/Hello.erl b/test/data/Hello.erl similarity index 100% rename from examples/Hello.erl rename to test/data/Hello.erl From 26fe51bbcb10b06fa9561c8b97358cefdbc92854 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Mon, 23 Mar 2020 18:52:48 +0800 Subject: [PATCH 08/46] Indent the exprs --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 03ed5a7..ff71715 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ It is able to parse and pretty print all of Core Erlang. Remaining work includes # Syntax -*module* ::= **module** *Atom* [*fnamei1* , ... , *fnameik*] **attributes** [*attr1*, ..., *attrm*] *fundef1* ... *fundefn* **end** +*module* ::= **module** *Atom* [*fnamei1* , ... , *fnameik*] **attributes** [*attr1*, ..., *attrm*] *fundef1* ... *fundefn* **end** *attr* ::= *Atom* = *const* @@ -34,33 +34,33 @@ It is able to parse and pretty print all of Core Erlang. Remaining work includes *expr* ::= *var* | *fname* | *lit* | *fun* -​ | [*exprs1* | *exprs2*] +​            | [*exprs1* | *exprs2*] -​ | {*exprs1*, ..., *exprsn*} +​            | {*exprs1*, ..., *exprsn*} -​ | \~{*exprs1* => *exprs2* , ..., *exprsm* => *exprsn*}\~ +​            | \~{*exprs1* => *exprs2* , ..., *exprsm* => *exprsn*}\~ -​ | **let** *vars* = *exprs1* **in** *exprs2* +​            | **let** *vars* = *exprs1* **in** *exprs2* -​ | **case** *exprs* **of** *clause1* · · · *clausen* **end** +​            | **case** *exprs* **of** *clause1* · · · *clausen* **end** -​ | **letrec** *fname1* = *fun1* · · · *fnamen* = *funn* **in** *exprs* +​            | **letrec** *fname1* = *fun1* · · · *fnamen* = *funn* **in** *exprs* -​ | **apply** *exprs0* (*exprs1*, . . ., *exprsn*) +​            | **apply** *exprs0* (*exprs1*, . . ., *exprsn*) -​ | **call** *exprs′1*:*exprs′2*(*exprs1*, . . ., *exprsn*) +​            | **call** *exprs′1*:*exprs′2*(*exprs1*, . . ., *exprsn*) -​ | **primop** *Atom*(*exprs1*, . . ., *exprsn*) +​            | **primop** *Atom*(*exprs1*, . . ., *exprsn*) -​ | **receive** *clause1* · · · *clausen* **after** *exprs1* -> *exprs2* +​            | **receive** *clause1* · · · *clausen* **after** *exprs1* -> *exprs2* -​ | **try** *exprs1* **of** <*var1*, . . .*varn*> -> *exprs2* +​            | **try** *exprs1* **of** <*var1*, . . .*varn*> -> *exprs2* -​ **catch** <*varn+1*, . . .*varn+m*> -> *exprs3* +​              **catch** <*varn+1*, . . .*varn+m*> -> *exprs3* -​ | **do** *exprs1* *exprs2* +​            | **do** *exprs1* *exprs2* -​ | **catch** *exprs* +​            | **catch** *exprs* *vars* ::= *var* | <*var1*, ..., *varn*> From 850a63b4292d0132e5a560384ad07784e527bfe0 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Tue, 24 Mar 2020 23:26:41 +0800 Subject: [PATCH 09/46] Support erlang map syntax --- ChangeLog.md | 15 ++++ CoreErlang.cabal | 5 +- Makefile | 3 + package.yaml | 2 + src/Language/CoreErlang.hs | 41 +++++++++ src/Language/CoreErlang/Parser.hs | 123 ++++++++++++++------------- src/Language/CoreErlang/Pretty.hs | 137 +++++++++++++++--------------- src/Language/CoreErlang/Syntax.hs | 21 +++-- test/data/Hello2.core | 13 +++ test/data/Map.core | 29 +++++++ test/data/Map.erl | 7 ++ 11 files changed, 256 insertions(+), 140 deletions(-) create mode 100644 src/Language/CoreErlang.hs create mode 100644 test/data/Hello2.core create mode 100644 test/data/Map.core create mode 100644 test/data/Map.erl diff --git a/ChangeLog.md b/ChangeLog.md index 9474958..8a32d9d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,18 @@ # Changelog for CoreErlang ## Unreleased changes + +- Add test cases + +## 0.1.0.0 + +- Initial release + +## 0.0.5.0 + +- Support erlang map syntax + +## 0.0.4.0 + +- Forked from amtal/CoreErlang + diff --git a/CoreErlang.cabal b/CoreErlang.cabal index 15c3cfe..a17ee40 100644 --- a/CoreErlang.cabal +++ b/CoreErlang.cabal @@ -4,7 +4,7 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: 1f1ace413dfa81b5b1278ef46ec75f92303a09d5cf3e97b93625e33d64300a54 +-- hash: b3db3deceee190045700bd2b05b05433b883ae3574ebcbca447c45dda356c4a1 name: CoreErlang version: 0.0.5 @@ -29,10 +29,11 @@ source-repository head library exposed-modules: + Language.CoreErlang + other-modules: Language.CoreErlang.Parser Language.CoreErlang.Pretty Language.CoreErlang.Syntax - other-modules: Paths_CoreErlang hs-source-dirs: src diff --git a/Makefile b/Makefile index c888437..41d0789 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,9 @@ build: install: $(stack) install +ghci: + $(stack) ghci $(package):lib + test: $(stack) test --fast $(package) diff --git a/package.yaml b/package.yaml index e4282a2..93ac23b 100644 --- a/package.yaml +++ b/package.yaml @@ -22,6 +22,8 @@ dependencies: library: source-dirs: src ghc-options: -Wall -O2 + exposed-modules: + - Language.CoreErlang default-extensions: - DeriveDataTypeable - LambdaCase diff --git a/src/Language/CoreErlang.hs b/src/Language/CoreErlang.hs new file mode 100644 index 0000000..0de2ff3 --- /dev/null +++ b/src/Language/CoreErlang.hs @@ -0,0 +1,41 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Language.CoreErlang.Pretty +-- Copyright : (c) Feng Lee 2020 +-- License : BSD-style (see the LICENSE file) +-- +-- Maintainer : Feng Lee +-- Stability : experimental +-- Portability : portable +-- +-- CoreErlang syntax, parser and pretty printer. +-- +----------------------------------------------------------------------------- +module Language.CoreErlang + ( module CE + , parseAndPretty + , parseFile + ) where + +import Language.CoreErlang.Parser as CE +import Language.CoreErlang.Pretty as CE +import Language.CoreErlang.Syntax as CE + +import System.IO + +parseAndPretty :: FilePath -> IO () +parseAndPretty fp = parseFile fp >>= printResult + +printResult :: (Either ParseError (Ann Module)) -> IO () +printResult (Left err) = print err +printResult (Right annMod) = putStrLn $ prettyPrint annMod + +parseFile :: FilePath -> IO (Either ParseError (Ann Module)) +parseFile fp = readCoreFile fp >>= return . parseModule + +readCoreFile :: FilePath -> IO String +readCoreFile fp = do + h <- openFile fp ReadMode + hSetEncoding h utf8 + hGetContents h + diff --git a/src/Language/CoreErlang/Parser.hs b/src/Language/CoreErlang/Parser.hs index 60616fe..300f893 100644 --- a/src/Language/CoreErlang/Parser.hs +++ b/src/Language/CoreErlang/Parser.hs @@ -3,30 +3,27 @@ -- Module : Language.CoreErlang.Parser -- Copyright : (c) Henrique Ferreiro García 2008 -- (c) David Castro Pérez 2008 --- License : BSD-style (see the file LICENSE) +-- License : BSD-style (see the LICENSE file) -- -- Maintainer : Alex Kropivny -- Stability : experimental -- Portability : portable -- --- Parser for Core Erlang. +-- Parser for CoreErlang. -- -- ----------------------------------------------------------------------------- - +{-# OPTIONS_GHC -fno-warn-unused-do-bind #-} module Language.CoreErlang.Parser ( parseModule , ParseError + , runLex ) where import Language.CoreErlang.Syntax import Control.Monad ( liftM ) -import Data.Char ( isControl, chr ) -import Numeric ( readOct ) - import Text.ParserCombinators.Parsec -import Text.ParserCombinators.Parsec.Expr import qualified Text.ParserCombinators.Parsec.Token as Token import Text.ParserCombinators.Parsec.Token ( makeTokenParser, TokenParser ) @@ -40,41 +37,9 @@ uppercase = upper lowercase :: Parser Char lowercase = lower -inputchar :: Parser Char -inputchar = noneOf "\n\r" - -control :: Parser Char -control = satisfy isControl - namechar :: Parser Char namechar = uppercase <|> lowercase <|> digit <|> oneOf "@_" -escape :: Parser Char -escape = do char '\\' - s <- octal <|> ctrl <|> escapechar - return s - -octal :: Parser Char -octal = do chars <- tryOctal - let [(o, _)] = readOct chars - return (chr o) - -tryOctal :: Parser [Char] -tryOctal = choice [ try (count 3 octaldigit), - try (count 2 octaldigit), - try (count 1 octaldigit) ] - -octaldigit :: Parser Char -octaldigit = oneOf "01234567" - -ctrl :: Parser Char -ctrl = char '^' >> ctrlchar - -ctrlchar :: Parser Char -ctrlchar = satisfy (`elem` ['\x0040'..'\x005f']) - -escapechar = oneOf "bdefnrstv\"\'\\" - -- Terminals integer :: Parser Integer @@ -92,27 +57,20 @@ negative = do char '-' n <- decimal return $ negate n --- float :: Parser Double --- float = sign?digit+.digit+((E|e)sign?digit+)? - atom :: Parser Atom atom = do char '\'' --- ((inputchar except control and \ and ')|escape)* --- inputchar = noneOf "\n\r" a <- many (noneOf "\n\r\\\'") char '\'' whiteSpace -- TODO: buff return $ Atom a echar :: Parser Literal --- char = $((inputchar except control and space and \)|escape) echar = do char '$' c <- noneOf "\n\r\\ " whiteSpace -- TODO: buff return $ LChar c estring :: Parser Literal --- string = "((inputchar except control and \\ and \"")|escape)*" estring = do char '"' s <- many $ noneOf "\n\r\\\"" char '"' @@ -149,7 +107,8 @@ attributes = do reserved "attributes" constant :: Parser Const constant = liftM CLit (try literal) <|> liftM CTuple (tuple constant) <|> - liftM CList (elist constant) + liftM CList (elist constant) <|> + liftM CMap (emap constant constant) fundef :: Parser FunDef fundef = do name <- annotated function @@ -182,6 +141,7 @@ sexpression = app <|> ecatch <|> ecase <|> elet <|> liftM List (try $ elist expression) {- because of nil -} <|> liftM Lit literal <|> modcall <|> op <|> receive <|> eseq <|> etry <|> liftM Tuple (tuple expression) <|> + liftM EMap (emap expression expression) <|> liftM Var variable app :: Parser Expr @@ -201,6 +161,30 @@ ebinary p = do symbol "#" symbol "#" return bs +emap :: Parser k -> Parser v -> Parser (Map k v) +emap kp vp = do symbol "~" + l <- braces (commaSep (emapKV kp vp)) + symbol "~" + return $ Map l + +emapKV :: Parser k -> Parser v -> Parser (k,v) +emapKV kp vp = do k <- kp + symbol "=>" + v <- vp + return (k,v) + +pmap :: Parser k -> Parser v -> Parser (Map k v) +pmap kp vp = do symbol "~" + l <- braces (commaSep (pmapKV kp vp)) + symbol "~" + return $ Map l + +pmapKV :: Parser k -> Parser v -> Parser (k,v) +pmapKV kp vp = do k <- kp + symbol ":=" + v <- vp + return (k,v) + bitstring :: Parser a -> Parser (Bitstring a) bitstring p = do symbol "#" e0 <- angles p @@ -209,18 +193,18 @@ bitstring p = do symbol "#" ecase :: Parser Expr ecase = do reserved "case" - exp <- expression + e <- expression reserved "of" alts <- many1 (annotated clause) reserved "end" - return $ Case exp alts + return $ Case e alts clause :: Parser Alt clause = do pat <- patterns g <- guard symbol "->" - exp <- expression - return $ Alt pat g exp + e <- expression + return $ Alt pat g e patterns :: Parser Pats patterns = liftM Pat pattern <|> @@ -229,7 +213,11 @@ patterns = liftM Pat pattern <|> pattern :: Parser Pat pattern = liftM PAlias (try alias) {- because of variable -} <|> liftM PVar variable <|> liftM PLit (try literal) {- because of nil -} <|> liftM PTuple (tuple pattern) <|> - liftM PList (elist pattern) <|> liftM PBinary (ebinary pattern) + liftM PList (elist pattern) <|> liftM PBinary (ebinary pattern) <|> + liftM PMap (pmap pkey pattern) -- TODO: Fixme later + +pkey :: Parser Key +pkey = liftM KVar variable <|> liftM KLit literal alias :: Parser Alias alias = do v <- variable @@ -272,10 +260,10 @@ elist :: Parser a -> Parser (List a) elist a = brackets $ list a list :: Parser a -> Parser (List a) -list elem = do elems <- commaSep1 elem - option (L elems) (do symbol "|" - t <- elem - return $ LL elems t) +list el = do elems <- commaSep1 el + option (L elems) (do symbol "|" + t <- el + return $ LL elems t) modcall :: Parser Expr modcall = do reserved "call" @@ -320,11 +308,11 @@ etry = do reserved "try" reserved "catch" v2 <- variables symbol "->" - e3 <- expression + _ <- expression return $ Try e1 (v1,e1) (v2,e2) tuple :: Parser a -> Parser [a] -tuple elem = braces $ commaSep elem +tuple el = braces $ commaSep el annotation :: Parser [Const] annotation = do symbol "-|" @@ -355,19 +343,34 @@ lexer = makeTokenParser -- caseSensitive = True, }) +angles, braces, brackets :: Parser a -> Parser a angles = Token.angles lexer braces = Token.braces lexer brackets = Token.brackets lexer + +commaSep, commaSep1 :: Parser a -> Parser [a] commaSep = Token.commaSep lexer commaSep1 = Token.commaSep1 lexer + +decimal :: Parser Integer decimal = Token.decimal lexer + +float :: Parser Double float = Token.float lexer + +identifier :: Parser Var identifier = Token.identifier lexer -natural = Token.natural lexer + +parens :: Parser a -> Parser a parens = Token.parens lexer + +reserved :: String -> Parser () reserved = Token.reserved lexer -reservedOp = Token.reservedOp lexer + +symbol :: String -> Parser String symbol = Token.symbol lexer + +whiteSpace :: Parser () whiteSpace = Token.whiteSpace lexer runLex :: Show a => Parser a -> String -> IO () diff --git a/src/Language/CoreErlang/Pretty.hs b/src/Language/CoreErlang/Pretty.hs index 2cecb68..98c7ecd 100644 --- a/src/Language/CoreErlang/Pretty.hs +++ b/src/Language/CoreErlang/Pretty.hs @@ -3,9 +3,10 @@ -- Module : Language.CoreErlang.Pretty -- Copyright : (c) Henrique Ferreiro García 2008 -- (c) David Castro Pérez 2008 --- License : BSD-style (see the file LICENSE) +-- License : BSD-style (see the LICENSE file) -- -- Maintainer : Alex Kropivny +-- : Feng Lee -- Stability : experimental -- Portability : portable -- @@ -13,7 +14,6 @@ -- ----------------------------------------------------------------------------- {-# LANGUAGE LambdaCase #-} - module Language.CoreErlang.Pretty ( -- * Pretty printing Pretty @@ -22,6 +22,7 @@ module Language.CoreErlang.Pretty , P.Style(..), P.style, P.Mode(..) -- * CoreErlang formatting modes , PPMode(..), Indent, PPLayout(..), defaultMode + , render ) where import Prelude hiding ((<>)) @@ -40,36 +41,36 @@ data PPLayout = PPDefault -- ^ classical layout type Indent = Int -- | Pretty-printing parameters. -data PPMode = PPMode { - altIndent :: Indent, -- ^ indentation of the alternatives - -- in a @case@ expression - caseIndent :: Indent, -- ^ indentation of the declarations - -- in a @case@ expression - fundefIndent :: Indent, -- ^ indentation of the declarations - -- in a function definition - lambdaIndent :: Indent, -- ^ indentation of the declarations - -- in a @lambda@ expression - letIndent :: Indent, -- ^ indentation of the declarations - -- in a @let@ expression - letrecIndent :: Indent, -- ^ indentation of the declarations - -- in a @letrec@ expression - onsideIndent :: Indent, -- ^ indentation added for continuation - -- lines that would otherwise be offside - layout :: PPLayout -- ^ Pretty-printing style to use - } +data PPMode = PPMode + { altIndent :: Indent -- ^ indentation of the alternatives + -- in a @case@ expression + , caseIndent :: Indent -- ^ indentation of the declarations + -- in a @case@ expression + , fundefIndent :: Indent -- ^ indentation of the declarations + -- in a function definition + , lambdaIndent :: Indent -- ^ indentation of the declarations + -- in a @lambda@ expression + , letIndent :: Indent -- ^ indentation of the declarations + -- in a @let@ expression + , letrecIndent :: Indent -- ^ indentation of the declarations + -- in a @letrec@ expression + , onsideIndent :: Indent -- ^ indentation added for continuation + -- lines that would otherwise be offside + , layout :: PPLayout -- ^ Pretty-printing style to use + } -- | The default mode: pretty-print using sensible defaults. defaultMode :: PPMode -defaultMode = PPMode { - altIndent = 4, - caseIndent = 4, - fundefIndent = 4, - lambdaIndent = 4, - letIndent = 4, - letrecIndent = 4, - onsideIndent = 4, - layout = PPDefault - } +defaultMode = PPMode + { altIndent = 4 + , caseIndent = 4 + , fundefIndent = 4 + , lambdaIndent = 4 + , letIndent = 4 + , letrecIndent = 4 + , onsideIndent = 4 + , layout = PPDefault + } -- | Pretty printing monad newtype DocM s a = DocM (s -> a) @@ -137,15 +138,9 @@ text = return . P.text char :: Char -> Doc char = return . P.char -int :: Int -> Doc -int = return . P.int - integer :: Integer -> Doc integer = return . P.integer -float :: Float -> Doc -float = return . P.float - double :: Double -> Doc double = return . P.double @@ -210,15 +205,6 @@ prettyPrintWithMode = prettyPrintStyleMode P.style prettyPrint :: Pretty a => a -> String prettyPrint = prettyPrintWithMode defaultMode -fullRenderWithMode :: PPMode -> P.Mode -> Int -> Float -> - (P.TextDetails -> a -> a) -> a -> Doc -> a -fullRenderWithMode ppMode m i f fn e mD = - P.fullRender m i f fn e $ (unDocM mD) ppMode - -fullRender :: P.Mode -> Int -> Float -> (P.TextDetails -> a -> a) - -> a -> Doc -> a -fullRender = fullRenderWithMode defaultMode - ------------------------- Pretty-Print a Module -------------------- instance Pretty Module where @@ -240,11 +226,12 @@ instance Pretty Const where (CLit l) -> pretty l (CTuple l) -> ppTuple l (CList l) -> pretty l + (CMap m) -> ppMap "=>" m ------------------------- Declarations ------------------------------ instance Pretty FunDef where - pretty (FunDef function exp) = (pretty function <+> char '=') - $$$ ppBody fundefIndent [pretty exp] + pretty (FunDef function e) = (pretty function <+> char '=') + $$$ ppBody fundefIndent [pretty e] ------------------------- Expressions ------------------------- instance Pretty Literal where @@ -288,7 +275,7 @@ instance Pretty Expr where $$$ text "end" (Tuple exps) -> braceList $ map pretty exps (List l) -> pretty l - (EMap m) -> ppMap m + (EMap m) -> ppMap "=>" m (PrimOp a exps) -> text "primop" <+> pretty a <> parenList (map pretty exps) (Binary bs) -> char '#' <> braceList (map pretty bs) <> char '#' (Try e (vars1,exps1) (vars2,exps2)) -> text "try" @@ -322,14 +309,16 @@ instance Pretty Pat where (PLit l) -> pretty l (PTuple p) -> braceList $ map pretty p (PList l) -> pretty l - (PMap m) -> ppMap m + (PMap m) -> ppMap ":=" m (PBinary bs) -> char '#' <> braceList (map pretty bs) <> char '#' (PAlias a) -> pretty a instance (Pretty k, Pretty v) => Pretty (Map k v) where - pretty (Map l) = undefined -- TODO: braceList $ [pretty k <> ":=" <> pretty v | (k, v) <- l] + pretty m = ppMap "=>" m -ppMap m = text "~{" <> pretty m <> text "}~" +instance Pretty Key where + pretty (KVar v) = text v + pretty (KLit l) = pretty l instance Pretty Alias where pretty (Alias v p) = ppAssign (Var v,p) -- FIXME: hack! @@ -349,7 +338,6 @@ instance Pretty a => Pretty (Ann a) where pretty (Constr a) = pretty a pretty (Ann a cs) = parens (pretty a $$$ ppAnn cs) - ------------------------- pp utils ------------------------- angles :: Doc -> Doc angles p = char '<' <> p <> char '>' @@ -368,11 +356,12 @@ parenList = parens . myFsepSimple . punctuate comma -- | Monadic PP Combinators -- these examine the env topLevel :: Doc -> [Doc] -> Doc -topLevel header dl = do e <- fmap layout getPPEnv - let s = case e of - PPDefault -> header $$ vcat dl - PPNoLayout -> header <+> hsep dl - s $$$ text "end" +topLevel header dl = do + e <- fmap layout getPPEnv + let s = case e of + PPDefault -> header $$ vcat dl + PPNoLayout -> header <+> hsep dl + s $$$ text "end" ppAssign :: (Pretty a, Pretty b) => (a,b) -> Doc ppAssign (a,b) = pretty a <+> char '=' <+> pretty b @@ -380,12 +369,19 @@ ppAssign (a,b) = pretty a <+> char '=' <+> pretty b ppTuple :: Pretty a => [a] -> Doc ppTuple t = braceList (map pretty t) +ppMap :: (Pretty k, Pretty v) => String -> (Map k v) -> Doc +ppMap s (Map l) = char '~' <> braceList (map (ppKV s) l) <> char '~' + +ppKV :: (Pretty k, Pretty v) => String -> (k, v) -> Doc +ppKV s (k, v) = pretty k <> text s <> pretty v + ppBody :: (PPMode -> Int) -> [Doc] -> Doc -ppBody f dl = do e <- fmap layout getPPEnv - i <- fmap f getPPEnv - case e of - PPDefault -> nest i . vcat $ dl - _ -> hsep dl +ppBody f dl = do + e <- fmap layout getPPEnv + i <- fmap f getPPEnv + case e of + PPDefault -> nest i . vcat $ dl + _ -> hsep dl ($$$) :: Doc -> Doc -> Doc a $$$ b = layoutChoice (a $$) (a <+>) b @@ -397,17 +393,18 @@ myFsepSimple = layoutChoice fsep hsep -- which is necessary to avoid triggering the offside rule. myFsep :: [Doc] -> Doc myFsep = layoutChoice fsep' hsep - where fsep' [] = empty - fsep' (d:ds) = do - e <- getPPEnv - let n = onsideIndent e - nest n (fsep (nest (-n) d:ds)) + where fsep' [] = empty + fsep' (d:ds) = do + e <- getPPEnv + let n = onsideIndent e + nest n (fsep (nest (-n) d:ds)) layoutChoice :: (a -> Doc) -> (a -> Doc) -> a -> Doc -layoutChoice a b dl = do e <- getPPEnv - if layout e == PPDefault - then a dl - else b dl +layoutChoice a b dl = do + e <- getPPEnv + if layout e == PPDefault + then a dl + else b dl ppAnn :: (Pretty a) => [a] -> Doc ppAnn cs = text "-|" <+> bracketList (map pretty cs) diff --git a/src/Language/CoreErlang/Syntax.hs b/src/Language/CoreErlang/Syntax.hs index 064cfe5..ef5ba68 100644 --- a/src/Language/CoreErlang/Syntax.hs +++ b/src/Language/CoreErlang/Syntax.hs @@ -6,17 +6,17 @@ -- License : BSD-style (see the LICENSE file) -- -- Maintainer : Alex Kropivny +-- Feng Lee -- Stability : experimental -- Portability : portable -- --- Abstract Syntax Tree of Core Erlang. +-- Abstract Syntax Tree of CoreErlang: -- -- -- -- ----------------------------------------------------------------------------- {-# LANGUAGE DeriveDataTypeable #-} - module Language.CoreErlang.Syntax ( -- * Modules Module(..) @@ -26,7 +26,7 @@ module Language.CoreErlang.Syntax , Expr(..), Exprs(..), Alt(..), Guard(..), Map(..) , List(..), TimeOut(..), Bitstring(..), FunName(..) -- * Patterns - , Pats(..), Pat(..), Alias(..) + , Pats(..), Pat(..), Key(..), Alias(..) -- * Literals , Literal(..), Const(..), Atom(..) -- * Variables @@ -38,9 +38,6 @@ module Language.CoreErlang.Syntax import Prelude import Data.Data --- | This type is used to represent variables -type Var = String - -- | This type is used to represent atoms data Atom = Atom String deriving (Eq, Ord, Show, Data, Typeable) @@ -66,6 +63,7 @@ data Const = CLit Literal | CTuple [Const] | CList (List Const) + | CMap (Map Const Const) deriving (Eq, Ord, Show, Data, Typeable) -- | This type is used to represent lambdas @@ -105,7 +103,7 @@ data Expr | Case Exprs [Ann Alt] -- ^ @case@ /exp/ @of@ /alts/ end | Tuple [Exprs] -- ^ tuple expression | List (List Exprs) -- ^ list expression - | EMap (Map Expr Expr) -- ^ map expression + | EMap (Map Exprs Exprs) -- ^ map expression | Binary [Bitstring Exprs] -- ^ binary expression | PrimOp Atom [Exprs] -- ^ operator application | Try Exprs ([Var], Exprs) ([Var], Exprs) -- ^ try expression @@ -140,11 +138,15 @@ data Pat | PLit Literal -- ^ literal constant | PTuple [Pat] -- ^ tuple pattern | PList (List Pat) -- ^ list pattern - | PMap (Map Literal Pat) -- ^ map pattern + | PMap (Map Key Pat) -- ^ map pattern | PBinary [Bitstring Pat] -- ^ list of bitstring patterns | PAlias Alias -- ^ alias pattern deriving (Eq, Ord, Show, Data, Typeable) +-- | A map key +data Key = KVar Var | KLit Literal + deriving (Eq, Ord, Show, Data, Typeable) + -- | An alias, used in patterns data Alias = Alias Var Pat deriving (Eq, Ord, Show, Data, Typeable) @@ -158,6 +160,9 @@ data Guard = Guard Exprs data TimeOut = TimeOut Exprs Exprs deriving (Eq, Ord, Show, Data, Typeable) +-- | This type is used to represent variables +type Var = String + -- | An annotation for modules, variables, ... data Ann a = Constr a -- ^ core erlang construct diff --git a/test/data/Hello2.core b/test/data/Hello2.core new file mode 100644 index 0000000..761040f --- /dev/null +++ b/test/data/Hello2.core @@ -0,0 +1,13 @@ +module 'Hello' ['add'/2, 'module_info'/0, 'module_info'/1, 'sub'/2] + attributes ['file' = [{[72|[101|[108|[108|[111|[46|[101|[114|[108]]]]]]]]], + 1}], + 'compile' = [{'inline', [{'sub', 2}]}]] +'add'/2 = + fun(_0, _1) -> call 'erlang':'+' (_0, _1) +'sub'/2 = + fun(_0, _1) -> call 'erlang':'-' (_0, _1) +'module_info'/0 = + fun() -> call 'erlang':'get_module_info' ('Hello') +'module_info'/1 = + fun(_0) -> call 'erlang':'get_module_info' ('Hello', _0) +end diff --git a/test/data/Map.core b/test/data/Map.core new file mode 100644 index 0000000..3bb3466 --- /dev/null +++ b/test/data/Map.core @@ -0,0 +1,29 @@ +module 'Map' ['f'/0, + 'module_info'/0, + 'module_info'/1] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[77|[97|[112|[46|[101|[114|[108]]]]]]],1}]] +'f'/0 = + %% Line 5 + fun () -> + %% Line 6 + case ~{'a'=>1,'b'=>2}~ of + <~{'a':=A,'b':=B}~> when 'true' -> + %% Line 7 + {A,B} + ( <_0> when 'true' -> + primop 'match_fail' + ({'badmatch',_0}) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('Map') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('Map', _0) +end \ No newline at end of file diff --git a/test/data/Map.erl b/test/data/Map.erl new file mode 100644 index 0000000..0df12e7 --- /dev/null +++ b/test/data/Map.erl @@ -0,0 +1,7 @@ +-module('Map'). + +-export([f/0]). + +f() -> + #{a := A, b := B} = #{a => 1, b => 2}, + {A, B}. From b2cf725a9969e78e118bae00a1963f6ebb983932 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Wed, 25 Mar 2020 08:05:18 +0800 Subject: [PATCH 10/46] Fix the do layout --- src/Language/CoreErlang/Parser.hs | 361 ++++++++++++++++-------------- 1 file changed, 192 insertions(+), 169 deletions(-) diff --git a/src/Language/CoreErlang/Parser.hs b/src/Language/CoreErlang/Parser.hs index 300f893..dff6235 100644 --- a/src/Language/CoreErlang/Parser.hs +++ b/src/Language/CoreErlang/Parser.hs @@ -43,41 +43,46 @@ namechar = uppercase <|> lowercase <|> digit <|> oneOf "@_" -- Terminals integer :: Parser Integer -integer = do i <- positive <|> negative <|> decimal - whiteSpace -- TODO: buff - return $ i +integer = do + i <- positive <|> negative <|> decimal + whiteSpace -- TODO: buff + return $ i positive :: Parser Integer -positive = do char '+' - p <- decimal - return p +positive = do + char '+' + p <- decimal + return p negative :: Parser Integer -negative = do char '-' - n <- decimal - return $ negate n +negative = do + char '-' + n <- decimal + return $ negate n atom :: Parser Atom -atom = do char '\'' - a <- many (noneOf "\n\r\\\'") - char '\'' - whiteSpace -- TODO: buff - return $ Atom a +atom = do + char '\'' + a <- many (noneOf "\r\n\\\'") + char '\'' + whiteSpace -- TODO: buff + return $ Atom a echar :: Parser Literal -echar = do char '$' - c <- noneOf "\n\r\\ " - whiteSpace -- TODO: buff - return $ LChar c +echar = do + char '$' + c <- noneOf "\n\r\\ " + whiteSpace -- TODO: buff + return $ LChar c estring :: Parser Literal -estring = do char '"' - s <- many $ noneOf "\n\r\\\"" - char '"' - return $ LString s +estring = do + char '"' + s <- many $ noneOf "\n\r\\\"" + char '"' + return $ LString s variable :: Parser Var --- variable = (uppercase | (_ namechar)) namechar* variable = identifier -- Non-terminals @@ -86,42 +91,50 @@ emodule :: Parser (Ann Module) emodule = annotated amodule amodule :: Parser Module -amodule = do reserved "module" - name <- atom - funs <- exports - attrs <- attributes - fundefs <- many fundef - reserved "end" - return $ Module name funs attrs fundefs +amodule = do + reserved "module" + name <- atom + funs <- exports + attrs <- attributes + fundefs <- many fundef + reserved "end" + return $ Module name funs attrs fundefs exports :: Parser [FunName] exports = brackets $ commaSep function -attributes :: Parser [(Atom, Const)] -attributes = do reserved "attributes" - brackets (commaSep $ do a <- atom - symbol "=" - c <- constant - return (a,c)) +attributes :: Parser [(Atom,Const)] +attributes = do + reserved "attributes" + brackets $ commaSep attribute + +attribute :: Parser (Atom,Const) +attribute = do + a <- atom + symbol "=" + c <- constant + return (a,c) constant :: Parser Const constant = liftM CLit (try literal) <|> liftM CTuple (tuple constant) <|> liftM CList (elist constant) <|> - liftM CMap (emap constant constant) + liftM CMap (emap "=>" constant constant) fundef :: Parser FunDef -fundef = do name <- annotated function - symbol "=" - body <- annotated lambda - return $ FunDef name body +fundef = do + name <- annotated function + symbol "=" + body <- annotated lambda + return $ FunDef name body function :: Parser FunName -function = do a <- atom - char '/' - i <- decimal - whiteSpace -- TODO: buff - return $ FunName (a, i) +function = do + a <- atom + char '/' + i <- decimal + whiteSpace -- TODO: buff + return $ FunName (a,i) literal :: Parser Literal literal = try (liftM LFloat float) <|> liftM LInt integer <|> @@ -141,70 +154,66 @@ sexpression = app <|> ecatch <|> ecase <|> elet <|> liftM List (try $ elist expression) {- because of nil -} <|> liftM Lit literal <|> modcall <|> op <|> receive <|> eseq <|> etry <|> liftM Tuple (tuple expression) <|> - liftM EMap (emap expression expression) <|> + liftM EMap (emap "=>" expression expression) <|> liftM Var variable app :: Parser Expr -app = do reserved "apply" - e1 <- expression - eN <- parens $ commaSep expression - return $ App e1 eN +app = do + reserved "apply" + e1 <- expression + eN <- parens $ commaSep expression + return $ App e1 eN ecatch :: Parser Expr -ecatch = do reserved "catch" - e <- expression - return $ Catch e +ecatch = do + reserved "catch" + e <- expression + return $ Catch e ebinary :: Parser a -> Parser [Bitstring a] -ebinary p = do symbol "#" - bs <- braces (commaSep (bitstring p)) - symbol "#" - return bs - -emap :: Parser k -> Parser v -> Parser (Map k v) -emap kp vp = do symbol "~" - l <- braces (commaSep (emapKV kp vp)) - symbol "~" - return $ Map l - -emapKV :: Parser k -> Parser v -> Parser (k,v) -emapKV kp vp = do k <- kp - symbol "=>" - v <- vp - return (k,v) - -pmap :: Parser k -> Parser v -> Parser (Map k v) -pmap kp vp = do symbol "~" - l <- braces (commaSep (pmapKV kp vp)) - symbol "~" - return $ Map l - -pmapKV :: Parser k -> Parser v -> Parser (k,v) -pmapKV kp vp = do k <- kp - symbol ":=" - v <- vp - return (k,v) +ebinary p = do + symbol "#" + bs <- braces (commaSep (bitstring p)) + symbol "#" + return bs + +emap :: String -> Parser k -> Parser v -> Parser (Map k v) +emap s kp vp = do + symbol "~" + l <- braces (commaSep (emapKV s kp vp)) + symbol "~" + return $ Map l + +emapKV :: String -> Parser k -> Parser v -> Parser (k,v) +emapKV s kp vp = do + k <- kp + symbol s + v <- vp + return (k,v) bitstring :: Parser a -> Parser (Bitstring a) -bitstring p = do symbol "#" - e0 <- angles p - es <- parens (commaSep expression) - return $ Bitstring e0 es +bitstring p = do + symbol "#" + e0 <- angles p + es <- parens (commaSep expression) + return $ Bitstring e0 es ecase :: Parser Expr -ecase = do reserved "case" - e <- expression - reserved "of" - alts <- many1 (annotated clause) - reserved "end" - return $ Case e alts +ecase = do + reserved "case" + e <- expression + reserved "of" + alts <- many1 (annotated clause) + reserved "end" + return $ Case e alts clause :: Parser Alt -clause = do pat <- patterns - g <- guard - symbol "->" - e <- expression - return $ Alt pat g e +clause = do + pat <- patterns + g <- guard + symbol "->" + e <- expression + return $ Alt pat g e patterns :: Parser Pats patterns = liftM Pat pattern <|> @@ -214,110 +223,123 @@ pattern :: Parser Pat pattern = liftM PAlias (try alias) {- because of variable -} <|> liftM PVar variable <|> liftM PLit (try literal) {- because of nil -} <|> liftM PTuple (tuple pattern) <|> liftM PList (elist pattern) <|> liftM PBinary (ebinary pattern) <|> - liftM PMap (pmap pkey pattern) -- TODO: Fixme later + liftM PMap (emap ":=" pkey pattern) -- TODO: Fixme later pkey :: Parser Key pkey = liftM KVar variable <|> liftM KLit literal alias :: Parser Alias -alias = do v <- variable - symbol "=" - p <- pattern - return $ Alias v p +alias = do + v <- variable + symbol "=" + p <- pattern + return $ Alias v p guard :: Parser Guard -guard = do reserved "when" - e <- expression - return $ Guard e +guard = do + reserved "when" + e <- expression + return $ Guard e elet :: Parser Expr -elet = do reserved "let" - vars <- variables - symbol "=" - e1 <- expression - symbol "in" - e2 <- expression - return $ Let (vars,e1) e2 +elet = do + reserved "let" + vars <- variables + symbol "=" + e1 <- expression + symbol "in" + e2 <- expression + return $ Let (vars,e1) e2 variables :: Parser [Var] variables = do { v <- variable; return [v] } <|> (angles $ commaSep variable) lambda :: Parser Expr -lambda = do reserved "fun" - vars <- parens $ commaSep variable - symbol "->" - expr <- expression - return $ Lambda vars expr +lambda = do + reserved "fun" + vars <- parens $ commaSep variable + symbol "->" + expr <- expression + return $ Lambda vars expr letrec :: Parser Expr -letrec = do reserved "letrec" - defs <- many fundef - reserved "in" - e <- expression - return $ LetRec defs e +letrec = do + reserved "letrec" + defs <- many fundef + reserved "in" + e <- expression + return $ LetRec defs e elist :: Parser a -> Parser (List a) elist a = brackets $ list a list :: Parser a -> Parser (List a) -list el = do elems <- commaSep1 el - option (L elems) (do symbol "|" - t <- el - return $ LL elems t) +list el = do + elems <- commaSep1 el + option (L elems) (do symbol "|" + t <- el + return $ LL elems t) modcall :: Parser Expr -modcall = do reserved "call" - e1 <- expression - symbol ":" - e2 <- expression - eN <- parens $ commaSep expression - return $ ModCall (e1, e2) eN +modcall = do + reserved "call" + e1 <- expression + symbol ":" + e2 <- expression + eN <- parens $ commaSep expression + return $ ModCall (e1,e2) eN op :: Parser Expr -op = do reserved "primop" - a <- atom - e <- parens $ commaSep expression - return $ PrimOp a e +op = do + reserved "primop" + a <- atom + e <- parens $ commaSep expression + return $ PrimOp a e receive :: Parser Expr -receive = do reserved "receive" - alts <- many $ annotated clause - to <- timeout - return $ Rec alts to +receive = do + reserved "receive" + alts <- many $ annotated clause + to <- timeout + return $ Rec alts to timeout :: Parser TimeOut -timeout = do reserved "after" - e1 <- expression - symbol "->" - e2 <- expression - return $ TimeOut e1 e2 +timeout = do + reserved "after" + e1 <- expression + symbol "->" + e2 <- expression + return $ TimeOut e1 e2 eseq :: Parser Expr -eseq = do reserved "do" - e1 <- expression - e2 <- expression - return $ Seq e1 e2 +eseq = do + reserved "do" + e1 <- expression + e2 <- expression + return $ Seq e1 e2 etry :: Parser Expr -etry = do reserved "try" - e1 <- expression - reserved "of" - v1 <- variables - symbol "->" - e2 <- expression - reserved "catch" - v2 <- variables - symbol "->" - _ <- expression - return $ Try e1 (v1,e1) (v2,e2) +etry = do + reserved "try" + e1 <- expression + reserved "of" + v1 <- variables + symbol "->" + e2 <- expression + reserved "catch" + v2 <- variables + symbol "->" + _ <- expression + return $ Try e1 (v1,e1) (v2,e2) tuple :: Parser a -> Parser [a] tuple el = braces $ commaSep el annotation :: Parser [Const] -annotation = do symbol "-|" - cs <- brackets $ many constant - return $ cs +annotation = do + symbol "-|" + cs <- brackets $ many constant + return $ cs annotated :: Parser a -> Parser (Ann a) annotated p = parens (do e <- p @@ -374,12 +396,13 @@ whiteSpace :: Parser () whiteSpace = Token.whiteSpace lexer runLex :: Show a => Parser a -> String -> IO () -runLex p file = do input <- readFile file - parseTest (do whiteSpace - x <- p - eof - return x) input - return () +runLex p file = do + input <- readFile file + parseTest (do whiteSpace + x <- p + eof + return x) input + return () -- | Parse of a string, which should contain a complete CoreErlang module parseModule :: String -> Either ParseError (Ann Module) From cb376f7c748547244579271eb6521f250be51731 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Wed, 25 Mar 2020 10:56:43 +0800 Subject: [PATCH 11/46] Add more test cases for CoreErlang Parser --- CoreErlang.cabal | 6 +- package.yaml | 3 + test/Spec.hs | 13 +- test/TestParser.hs | 44 + test/data/Hello2.core | 13 - test/data/README | 1 + test/data/jsx | 1 + test/data/sasl/alarm_handler.core | 170 + test/data/sasl/erlsrv.core | 1387 ++ test/data/sasl/format_lib_supp.core | 369 + test/data/sasl/misc_supp.core | 245 + test/data/sasl/rb.core | 3167 ++++ test/data/sasl/rb_format_supp.core | 379 + test/data/sasl/release_handler.core | 6761 ++++++++ test/data/sasl/release_handler_1.core | 2032 +++ test/data/sasl/sasl.core | 540 + test/data/sasl/sasl_report.core | 770 + test/data/sasl/sasl_report_file_h.core | 198 + test/data/sasl/sasl_report_tty_h.core | 91 + test/data/sasl/systools.core | 195 + test/data/sasl/systools_lib.core | 565 + test/data/sasl/systools_make.core | 8077 +++++++++ test/data/sasl/systools_rc.core | 3132 ++++ test/data/sasl/systools_relup.core | 1844 ++ test/data/stdlib/array.core | 4215 +++++ test/data/stdlib/base64.core | 2798 +++ test/data/stdlib/beam_lib.core | 4095 +++++ test/data/stdlib/binary.core | 741 + test/data/stdlib/dets.core | 13946 +++++++++++++++ test/data/stdlib/dets_server.core | 1403 ++ test/data/stdlib/dets_sup.core | 48 + test/data/stdlib/dets_utils.core | 9621 ++++++++++ test/data/stdlib/dets_v9.core | 15007 ++++++++++++++++ test/data/stdlib/dict.core | 2573 +++ test/data/stdlib/digraph.core | 1987 +++ test/data/stdlib/digraph_utils.core | 1206 ++ test/data/stdlib/edlin.core | 2195 +++ test/data/stdlib/edlin_expand.core | 1012 ++ test/data/stdlib/epp.core | 6749 +++++++ test/data/stdlib/erl_abstract_code.core | 132 + test/data/stdlib/erl_anno.core | 1580 ++ test/data/stdlib/erl_bits.core | 609 + test/data/stdlib/erl_error.core | 2843 +++ test/data/stdlib/erl_eval.core | 5927 +++++++ test/data/stdlib/erl_expand_records.core | 3924 +++++ test/data/stdlib/erl_internal.core | 2027 +++ test/data/stdlib/erl_lint.core | 18330 ++++++++++++++++++++ test/data/stdlib/erl_posix_msg.core | 3423 ++++ test/data/stdlib/erl_pp.core | 5759 ++++++ test/data/stdlib/erl_scan.core | 10356 +++++++++++ test/data/stdlib/erl_tar.core | 12455 +++++++++++++ test/data/stdlib/error_logger_file_h.core | 703 + test/data/stdlib/error_logger_tty_h.core | 939 + test/data/stdlib/escript.core | 3777 ++++ test/data/stdlib/ets.core | 5019 ++++++ test/data/stdlib/eval_bits.core | 1493 ++ test/data/stdlib/file_sorter.core | 8096 +++++++++ test/data/stdlib/filelib.core | 2758 +++ test/data/stdlib/gb_sets.core | 2390 +++ test/data/stdlib/gb_trees.core | 1545 ++ test/data/stdlib/gen.core | 1480 ++ test/data/stdlib/gen_event.core | 3344 ++++ test/data/stdlib/gen_fsm.core | 2235 +++ test/data/stdlib/gen_server.core | 3320 ++++ test/data/stdlib/gen_statem.core | 8132 +++++++++ test/data/stdlib/io.core | 1372 ++ test/data/stdlib/io_lib.core | 3903 +++++ test/data/stdlib/io_lib_format.core | 4480 +++++ test/data/stdlib/io_lib_fread.core | 1943 +++ test/data/stdlib/io_lib_pretty.core | 7100 ++++++++ test/data/stdlib/lists.core | 9602 ++++++++++ test/data/stdlib/log_mf_h.core | 565 + test/data/stdlib/maps.core | 1124 ++ test/data/stdlib/math.core | 288 + test/data/stdlib/ms_transform.core | 3834 ++++ test/data/stdlib/orddict.core | 783 + test/data/stdlib/ordsets.core | 533 + test/data/stdlib/otp_internal.core | 883 + test/data/stdlib/pool.core | 601 + test/data/stdlib/proc_lib.core | 3821 ++++ test/data/stdlib/proplists.core | 1586 ++ test/data/stdlib/qlc.core | 14955 ++++++++++++++++ test/data/stdlib/qlc_pt.core | 14055 +++++++++++++++ test/data/stdlib/queue.core | 2284 +++ test/data/stdlib/rand.core | 7957 +++++++++ test/data/stdlib/random.core | 498 + test/data/stdlib/re.core | 2958 ++++ test/data/stdlib/sets.core | 2051 +++ test/data/stdlib/shell.core | 5628 ++++++ test/data/stdlib/shell_default.core | 528 + test/data/stdlib/slave.core | 929 + test/data/stdlib/sofs.core | 15072 ++++++++++++++++ test/data/stdlib/string.core | 14175 +++++++++++++++ test/data/stdlib/supervisor.core | 6208 +++++++ test/data/stdlib/supervisor_bridge.core | 817 + test/data/stdlib/sys.core | 1783 ++ test/data/stdlib/timer.core | 1139 ++ test/data/stdlib/unicode.core | 2818 +++ test/data/stdlib/uri_string.core | 8441 +++++++++ test/data/stdlib/win32reg.core | 1260 ++ test/data/stdlib/zip.core | 5802 +++++++ 101 files changed, 361956 insertions(+), 15 deletions(-) create mode 100644 test/TestParser.hs delete mode 100644 test/data/Hello2.core create mode 100644 test/data/README create mode 160000 test/data/jsx create mode 100644 test/data/sasl/alarm_handler.core create mode 100644 test/data/sasl/erlsrv.core create mode 100644 test/data/sasl/format_lib_supp.core create mode 100644 test/data/sasl/misc_supp.core create mode 100644 test/data/sasl/rb.core create mode 100644 test/data/sasl/rb_format_supp.core create mode 100644 test/data/sasl/release_handler.core create mode 100644 test/data/sasl/release_handler_1.core create mode 100644 test/data/sasl/sasl.core create mode 100644 test/data/sasl/sasl_report.core create mode 100644 test/data/sasl/sasl_report_file_h.core create mode 100644 test/data/sasl/sasl_report_tty_h.core create mode 100644 test/data/sasl/systools.core create mode 100644 test/data/sasl/systools_lib.core create mode 100644 test/data/sasl/systools_make.core create mode 100644 test/data/sasl/systools_rc.core create mode 100644 test/data/sasl/systools_relup.core create mode 100644 test/data/stdlib/array.core create mode 100644 test/data/stdlib/base64.core create mode 100644 test/data/stdlib/beam_lib.core create mode 100644 test/data/stdlib/binary.core create mode 100644 test/data/stdlib/dets.core create mode 100644 test/data/stdlib/dets_server.core create mode 100644 test/data/stdlib/dets_sup.core create mode 100644 test/data/stdlib/dets_utils.core create mode 100644 test/data/stdlib/dets_v9.core create mode 100644 test/data/stdlib/dict.core create mode 100644 test/data/stdlib/digraph.core create mode 100644 test/data/stdlib/digraph_utils.core create mode 100644 test/data/stdlib/edlin.core create mode 100644 test/data/stdlib/edlin_expand.core create mode 100644 test/data/stdlib/epp.core create mode 100644 test/data/stdlib/erl_abstract_code.core create mode 100644 test/data/stdlib/erl_anno.core create mode 100644 test/data/stdlib/erl_bits.core create mode 100644 test/data/stdlib/erl_error.core create mode 100644 test/data/stdlib/erl_eval.core create mode 100644 test/data/stdlib/erl_expand_records.core create mode 100644 test/data/stdlib/erl_internal.core create mode 100644 test/data/stdlib/erl_lint.core create mode 100644 test/data/stdlib/erl_posix_msg.core create mode 100644 test/data/stdlib/erl_pp.core create mode 100644 test/data/stdlib/erl_scan.core create mode 100644 test/data/stdlib/erl_tar.core create mode 100644 test/data/stdlib/error_logger_file_h.core create mode 100644 test/data/stdlib/error_logger_tty_h.core create mode 100644 test/data/stdlib/escript.core create mode 100644 test/data/stdlib/ets.core create mode 100644 test/data/stdlib/eval_bits.core create mode 100644 test/data/stdlib/file_sorter.core create mode 100644 test/data/stdlib/filelib.core create mode 100644 test/data/stdlib/gb_sets.core create mode 100644 test/data/stdlib/gb_trees.core create mode 100644 test/data/stdlib/gen.core create mode 100644 test/data/stdlib/gen_event.core create mode 100644 test/data/stdlib/gen_fsm.core create mode 100644 test/data/stdlib/gen_server.core create mode 100644 test/data/stdlib/gen_statem.core create mode 100644 test/data/stdlib/io.core create mode 100644 test/data/stdlib/io_lib.core create mode 100644 test/data/stdlib/io_lib_format.core create mode 100644 test/data/stdlib/io_lib_fread.core create mode 100644 test/data/stdlib/io_lib_pretty.core create mode 100644 test/data/stdlib/lists.core create mode 100644 test/data/stdlib/log_mf_h.core create mode 100644 test/data/stdlib/maps.core create mode 100644 test/data/stdlib/math.core create mode 100644 test/data/stdlib/ms_transform.core create mode 100644 test/data/stdlib/orddict.core create mode 100644 test/data/stdlib/ordsets.core create mode 100644 test/data/stdlib/otp_internal.core create mode 100644 test/data/stdlib/pool.core create mode 100644 test/data/stdlib/proc_lib.core create mode 100644 test/data/stdlib/proplists.core create mode 100644 test/data/stdlib/qlc.core create mode 100644 test/data/stdlib/qlc_pt.core create mode 100644 test/data/stdlib/queue.core create mode 100644 test/data/stdlib/rand.core create mode 100644 test/data/stdlib/random.core create mode 100644 test/data/stdlib/re.core create mode 100644 test/data/stdlib/sets.core create mode 100644 test/data/stdlib/shell.core create mode 100644 test/data/stdlib/shell_default.core create mode 100644 test/data/stdlib/slave.core create mode 100644 test/data/stdlib/sofs.core create mode 100644 test/data/stdlib/string.core create mode 100644 test/data/stdlib/supervisor.core create mode 100644 test/data/stdlib/supervisor_bridge.core create mode 100644 test/data/stdlib/sys.core create mode 100644 test/data/stdlib/timer.core create mode 100644 test/data/stdlib/unicode.core create mode 100644 test/data/stdlib/uri_string.core create mode 100644 test/data/stdlib/win32reg.core create mode 100644 test/data/stdlib/zip.core diff --git a/CoreErlang.cabal b/CoreErlang.cabal index a17ee40..e43ca8a 100644 --- a/CoreErlang.cabal +++ b/CoreErlang.cabal @@ -4,7 +4,7 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: b3db3deceee190045700bd2b05b05433b883ae3574ebcbca447c45dda356c4a1 +-- hash: a0faa729ab4adcde1ae8edd4ad14800ff6b9c9f1404ea2b70e037628548d3dae name: CoreErlang version: 0.0.5 @@ -49,6 +49,7 @@ test-suite test type: exitcode-stdio-1.0 main-is: Spec.hs other-modules: + TestParser Paths_CoreErlang hs-source-dirs: test @@ -57,6 +58,9 @@ test-suite test build-depends: CoreErlang , base >=4.7 && <5 + , hspec , parsec >=3.1 && <3.2 , pretty >=1.1 && <1.2 + , tasty + , tasty-hspec default-language: Haskell2010 diff --git a/package.yaml b/package.yaml index 93ac23b..371acf9 100644 --- a/package.yaml +++ b/package.yaml @@ -38,6 +38,9 @@ tests: - -with-rtsopts=-N dependencies: - CoreErlang + - hspec + - tasty + - tasty-hspec default-extensions: - DeriveDataTypeable - LambdaCase diff --git a/test/Spec.hs b/test/Spec.hs index cd4753f..afaf6d0 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -1,2 +1,13 @@ +module Main (main) where + +import Prelude +import Test.Tasty +import Test.Tasty.Hspec + +import qualified TestParser + main :: IO () -main = putStrLn "Test suite not yet implemented" +main = do + parserTests <- TestParser.main + defaultMain $ testGroup "Tests" [ parserTests ] + diff --git a/test/TestParser.hs b/test/TestParser.hs new file mode 100644 index 0000000..6682bff --- /dev/null +++ b/test/TestParser.hs @@ -0,0 +1,44 @@ +module TestParser where + +import Test.Tasty +import Test.Tasty.Hspec +import Language.CoreErlang + +main :: IO TestTree +main = testSpec "parser" spec + +spec :: Spec +spec = do + context "SimpleParser" $ do + specify "should parse the 'Hello' module" $ do + r <- parseFile "test/data/Hello.core" + case r of + Left _ -> return () + Right annMod -> moduleName annMod `shouldBe` (Atom "Hello") + specify "should parse the 'Map' module" $ do + r <- parseFile "test/data/Map.core" + case r of + Left _ -> return () + Right annMod -> moduleName annMod `shouldBe` (Atom "Map") + context "JsxParser" $ do + specify "should parse the 'jsx' module" $ do + r <- parseFile "test/data/jsx/jsx.core" + case r of + Left _ -> return () + Right annMod -> moduleName annMod `shouldBe` (Atom "jsx") + context "SaslParser" $ do + specify "should parse the 'sasl' module" $ do + r <- parseFile "test/data/sasl/sasl.core" + case r of + Left _ -> return () + Right annMod -> moduleName annMod `shouldBe` (Atom "jsx") + context "StdlibParser" $ do + specify "should parse the 'stdlib' module" $ do + r <- parseFile "test/data/stdlib/array.core" + case r of + Left _ -> return () + Right annMod -> moduleName annMod `shouldBe` (Atom "jsx") + +moduleName (Constr (Module name _ _ _)) = name +moduleName (Ann (Module name _ _ _) _) = name + diff --git a/test/data/Hello2.core b/test/data/Hello2.core deleted file mode 100644 index 761040f..0000000 --- a/test/data/Hello2.core +++ /dev/null @@ -1,13 +0,0 @@ -module 'Hello' ['add'/2, 'module_info'/0, 'module_info'/1, 'sub'/2] - attributes ['file' = [{[72|[101|[108|[108|[111|[46|[101|[114|[108]]]]]]]]], - 1}], - 'compile' = [{'inline', [{'sub', 2}]}]] -'add'/2 = - fun(_0, _1) -> call 'erlang':'+' (_0, _1) -'sub'/2 = - fun(_0, _1) -> call 'erlang':'-' (_0, _1) -'module_info'/0 = - fun() -> call 'erlang':'get_module_info' ('Hello') -'module_info'/1 = - fun(_0) -> call 'erlang':'get_module_info' ('Hello', _0) -end diff --git a/test/data/README b/test/data/README new file mode 100644 index 0000000..d7fb724 --- /dev/null +++ b/test/data/README @@ -0,0 +1 @@ +otp-OTP-23.0-rc1 libs diff --git a/test/data/jsx b/test/data/jsx new file mode 160000 index 0000000..b6c9408 --- /dev/null +++ b/test/data/jsx @@ -0,0 +1 @@ +Subproject commit b6c9408977c4609c99492e9b83656628e147a7fb diff --git a/test/data/sasl/alarm_handler.core b/test/data/sasl/alarm_handler.core new file mode 100644 index 0000000..608f013 --- /dev/null +++ b/test/data/sasl/alarm_handler.core @@ -0,0 +1,170 @@ +module 'alarm_handler' ['add_alarm_handler'/1, + 'add_alarm_handler'/2, + 'clear_alarm'/1, + 'delete_alarm_handler'/1, + 'get_alarms'/0, + 'handle_call'/2, + 'handle_event'/2, + 'handle_info'/2, + 'init'/1, + 'module_info'/0, + 'module_info'/1, + 'set_alarm'/1, + 'start_link'/0, + 'terminate'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[97|[108|[97|[114|[109|[95|[104|[97|[110|[100|[108|[101|[114|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]],1}]] +'start_link'/0 = + %% Line 35 + fun () -> + %% Line 36 + case call 'gen_event':'start_link' + ({'local','alarm_handler'}) of + %% Line 37 + <_@r0 = {'ok',Pid}> when 'true' -> + do %% Line 38 + call 'gen_event':'add_handler' + ('alarm_handler', 'alarm_handler', []) + %% Line 39 + _@r0 + %% Line 40 + when 'true' -> + Error + end +'set_alarm'/1 = + %% Line 48 + fun (_0) -> + %% Line 49 + call 'gen_event':'notify' + ('alarm_handler', {'set_alarm',_0}) +'clear_alarm'/1 = + %% Line 55 + fun (_0) -> + %% Line 56 + call 'gen_event':'notify' + ('alarm_handler', {'clear_alarm',_0}) +'get_alarms'/0 = + %% Line 62 + fun () -> + %% Line 63 + call 'gen_event':'call' + ('alarm_handler', 'alarm_handler', 'get_alarms') +'add_alarm_handler'/1 = + %% Line 65 + fun (_0) -> + case _0 of + + when call 'erlang':'is_atom' + (_0) -> + %% Line 66 + call 'gen_event':'add_handler' + ('alarm_handler', Module, []) + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'add_alarm_handler',1}}] ) + -| ['compiler_generated'] ) + end +'add_alarm_handler'/2 = + %% Line 68 + fun (_0,_1) -> + case <_0,_1> of + + when call 'erlang':'is_atom' + (Module) -> + %% Line 69 + call 'gen_event':'add_handler' + ('alarm_handler', Module, Args) + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'add_alarm_handler',2}}] ) + -| ['compiler_generated'] ) + end +'delete_alarm_handler'/1 = + %% Line 71 + fun (_0) -> + case _0 of + + when call 'erlang':'is_atom' + (_0) -> + %% Line 72 + call 'gen_event':'delete_handler' + ('alarm_handler', Module, []) + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'delete_alarm_handler',1}}] ) + -| ['compiler_generated'] ) + end +'init'/1 = + %% Line 77 + fun (_0) -> + {'ok',[]} +'handle_event'/2 = + %% Line 79 + fun (_0,_1) -> + case <_0,_1> of + <{'set_alarm',Alarm},Alarms> when 'true' -> + do %% Line 80 + call 'error_logger':'info_report' + ([{'alarm_handler',{'set',Alarm}}|[]]) + %% Line 81 + {'ok',[Alarm|Alarms]} + %% Line 82 + <{'clear_alarm',AlarmId},Alarms> when 'true' -> + do %% Line 83 + call 'error_logger':'info_report' + ([{'alarm_handler',{'clear',AlarmId}}|[]]) + let <_2> = + call %% Line 84 + 'lists':%% Line 84 + 'keydelete' + (%% Line 84 + AlarmId, %% Line 84 + 1, %% Line 84 + Alarms) + in %% Line 84 + {'ok',_2} + %% Line 85 + <_5,Alarms> when 'true' -> + %% Line 86 + {'ok',Alarms} + end +'handle_info'/2 = + %% Line 88 + fun (_0,_1) -> + {'ok',_1} +'handle_call'/2 = + %% Line 90 + fun (_0,_1) -> + case <_0,_1> of + <'get_alarms',Alarms> when 'true' -> + {'ok',Alarms,Alarms} + %% Line 91 + <_X_Query,Alarms> when 'true' -> + {'ok',{'error','bad_query'},Alarms} + end +'terminate'/2 = + %% Line 93 + fun (_0,_1) -> + case <_0,_1> of + <'swap',Alarms> when 'true' -> + %% Line 94 + {'alarm_handler',Alarms} + %% Line 95 + <_4,_5> when 'true' -> + %% Line 96 + 'ok' + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('alarm_handler') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('alarm_handler', _0) +end \ No newline at end of file diff --git a/test/data/sasl/erlsrv.core b/test/data/sasl/erlsrv.core new file mode 100644 index 0000000..27a5123 --- /dev/null +++ b/test/data/sasl/erlsrv.core @@ -0,0 +1,1387 @@ +module 'erlsrv' ['disable_service'/1, + 'disable_service'/2, + 'enable_service'/1, + 'enable_service'/2, + 'erlsrv'/1, + 'get_all_services'/0, + 'get_service'/1, + 'get_service'/2, + 'module_info'/0, + 'module_info'/1, + 'new_service'/3, + 'new_service'/4, + 'remove_service'/1, + 'rename_service'/2, + 'rename_service'/3, + 'store_service'/1, + 'store_service'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[101|[114|[108|[115|[114|[118|[46|[101|[114|[108]]]]]]]]]]]]]],1}]] +'erlsrv'/1 = + %% Line 32 + fun (_0) -> + let = + call %% Line 33 + 'code':%% Line 33 + 'root_dir' + () + in let <_2> = + call %% Line 34 + 'erlang':%% Line 34 + '++' + (%% Line 34 + [101|[114|[116|[115|[45]]]]], _0) + in %% Line 34 + call 'filename':'join' + ([Root|[_2|[[98|[105|[110]]]|[[101|[114|[108|[115|[114|[118|[46|[101|[120|[101]]]]]]]]]]]]]]) +'current_version'/0 = + %% Line 36 + fun () -> + let <_0> = + call %% Line 37 + 'erlang':%% Line 37 + 'system_info' + (%% Line 37 + 'version') + in let <_1> = + call %% Line 37 + 'string':%% Line 37 + 'lexemes' + (_0, %% Line 37 + [95|[32]]) + in %% Line 37 + call 'erlang':'hd' + (_1) +'run_erlsrv'/1 = + %% Line 40 + fun (_0) -> + let <_1> = + apply %% Line 41 + 'current_version'/0 + () + in %% Line 41 + apply 'run_erlsrv'/2 + (_1, _0) +'run_erlsrv'/2 = + %% Line 42 + fun (_0,_1) -> + let <_6> = + catch + let <_3> = + apply %% Line 43 + 'erlsrv'/1 + (_0) + in let <_2> = + [34|%% Line 43 + [32|_1]] + in let <_4> = + call %% Line 43 + 'erlang':%% Line 43 + '++' + (_3, _2) + in let <_5> = + [34|_4] + in %% Line 43 + call 'erlang':'open_port' + ({'spawn',_5}, %% Line 44 + [{'line',1000}|['in'|['eof']]]) + in %% Line 43 + case _6 of + %% Line 45 + <{'EXIT',{Reason,_11}}> when 'true' -> + %% Line 46 + {'port_error',Reason} + %% Line 47 + when 'true' -> + %% Line 48 + case apply 'read_all_data'/1 + (Port) of + %% Line 49 + <[]> when 'true' -> + %% Line 50 + 'failed' + %% Line 51 + when 'true' -> + %% Line 52 + {'ok',X} + end + end +'run_erlsrv_interactive'/2 = + %% Line 56 + fun (_0,_1) -> + let <_5> = + catch + let <_2> = + apply %% Line 57 + 'erlsrv'/1 + (_0) + in let <_3> = + call %% Line 57 + 'erlang':%% Line 57 + '++' + (_2, %% Line 57 + [34|[32|[114|[101|[97|[100|[97|[114|[103|[115]]]]]]]]]]) + in let <_4> = + [34|_3] + in %% Line 57 + call 'erlang':'open_port' + ({'spawn',_4}, %% Line 58 + [{'line',1000}|['eof']]) + in %% Line 57 + case _5 of + %% Line 59 + <{'EXIT',{Reason,_10}}> when 'true' -> + %% Line 60 + {'port_error',Reason} + %% Line 61 + when 'true' -> + do %% Line 62 + apply 'write_all_data'/2 + (Port, _1) + %% Line 63 + case apply 'read_all_data'/1 + (Port) of + %% Line 64 + <[]> when 'true' -> + %% Line 65 + 'failed' + %% Line 66 + when 'true' -> + %% Line 67 + {'ok',X} + end + end +'write_all_data'/2 = + %% Line 71 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + let <_3> = + call %% Line 72 + 'erlang':%% Line 72 + 'self' + () + in let <_2> = + call %% Line 72 + 'io_lib':%% Line 72 + 'nl' + () + in do %% Line 72 + call 'erlang':'!' + (Port, {_3,{'command',_2}}) + %% Line 73 + 'ok' + %% Line 74 + when 'true' -> + let <_6> = + call %% Line 75 + 'erlang':%% Line 75 + 'self' + () + in let <_4> = + call %% Line 75 + 'io_lib':%% Line 75 + 'nl' + () + in let <_5> = + call %% Line 75 + 'unicode':%% Line 75 + 'characters_to_binary' + (%% Line 75 + [H|[_4|[]]]) + in do %% Line 75 + call 'erlang':'!' + (Port, {_6,{'command',_5}}) + %% Line 76 + apply 'write_all_data'/2 + (Port, T) + ( <_8,_7> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_8,_7}) + -| [{'function_name',{'write_all_data',2}}] ) + -| ['compiler_generated'] ) + end +'read_all_data'/1 = + %% Line 78 + fun (_0) -> + let <_1> = + apply %% Line 79 + 'read_all_data'/3 + (_0, %% Line 79 + [], %% Line 79 + []) + in let = + call %% Line 79 + 'lists':%% Line 79 + 'reverse' + (_1) + in %% Line 81 + ( letrec + 'lc$^0'/1 = + fun (_5) -> + case _5 of + <[Data|_4]> when 'true' -> + let <_6> = + call 'erlang':'list_to_binary' + (Data) + in let <_7> = + call 'unicode':'characters_to_list' + (_6) + in let <_8> = + apply 'lc$^0'/1 + (_4) + in ( [_7|_8] + -| ['compiler_generated'] ) + <[]> when 'true' -> + [] + ( <_10> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_10}) + -| [{'function_name',{'lc$^0',1}}] ) + -| ['compiler_generated'] ) + end + in apply 'lc$^0'/1 + (Data0) + -| ['list_comprehension'] ) +'read_all_data'/3 = + %% Line 83 + fun (_0,_1,_2) -> + %% Line 84 + receive + %% Line 85 + <{_10,{'data',{'noeol',Data}}}> + when call 'erlang':'=:=' + (_10, + _0) -> + let <_3> = + call %% Line 86 + 'erlang':%% Line 86 + '++' + (_1, %% Line 86 + Data) + in %% Line 86 + apply 'read_all_data'/3 + (_0, _3, _2) + %% Line 87 + <{_11,{'data',{'eol',Data}}}> + when call 'erlang':'=:=' + (_11, + _0) -> + let <_4> = + call %% Line 88 + 'erlang':%% Line 88 + '++' + (_1, %% Line 88 + Data) + in %% Line 88 + apply 'read_all_data'/3 + (_0, [], [_4|_2]) + %% Line 89 + <{_12,_X_Other}> + when call 'erlang':'=:=' + (_12, + _0) -> + let <_5> = + call %% Line 90 + 'erlang':%% Line 90 + 'self' + () + in do %% Line 90 + call 'erlang':'!' + (_0, {_5,'close'}) + %% Line 91 + receive + %% Line 92 + <{_13,'closed'}> + when call 'erlang':'=:=' + (_13, + _0) -> + %% Line 93 + case _1 of + %% Line 94 + <[]> when 'true' -> + _2 + %% Line 95 + <_14> when 'true' -> + [_1|_2] + end + after 'infinity' -> + 'true' + after 'infinity' -> + 'true' +'get_all_services'/0 = + %% Line 102 + fun () -> + %% Line 103 + case apply 'run_erlsrv'/1 + ([108|[105|[115|[116]]]]) of + %% Line 104 + <'failed'> when 'true' -> + %% Line 105 + [] + %% Line 106 + <{'ok',[_5|[]]}> when 'true' -> + %% Line 107 + [] + %% Line 108 + <{'ok',[_X_H|T]}> when 'true' -> + let = + fun (_1) -> + let <_0> = + call %% Line 110 + 'string':%% Line 110 + 'lexemes' + (%% Line 109 + _1, %% Line 110 + [9|[32]]) + in %% Line 110 + call 'erlang':'hd' + (_0) + in %% Line 112 + call 'lists':'map' + (F, T) + %% Line 113 + <_6> when 'true' -> + %% Line 114 + {'error','external_program_failed'} + end +'disable_service'/1 = + %% Line 117 + fun (_0) -> + let <_1> = + apply %% Line 118 + 'current_version'/0 + () + in %% Line 118 + apply 'disable_service'/2 + (_1, _0) +'disable_service'/2 = + %% Line 119 + fun (_0,_1) -> + let <_2> = + call %% Line 120 + 'erlang':%% Line 120 + '++' + (%% Line 120 + [100|[105|[115|[97|[98|[108|[101|[32]]]]]]]], _1) + in %% Line 120 + apply 'run_erlsrv'/2 + (_0, _2) +'enable_service'/1 = + %% Line 121 + fun (_0) -> + let <_1> = + apply %% Line 122 + 'current_version'/0 + () + in %% Line 122 + apply 'enable_service'/2 + (_1, _0) +'enable_service'/2 = + %% Line 123 + fun (_0,_1) -> + let <_2> = + call %% Line 124 + 'erlang':%% Line 124 + '++' + (%% Line 124 + [101|[110|[97|[98|[108|[101|[32]]]]]]], _1) + in %% Line 124 + apply 'run_erlsrv'/2 + (_0, _2) +'remove_service'/1 = + %% Line 125 + fun (_0) -> + let <_1> = + call %% Line 126 + 'erlang':%% Line 126 + '++' + (%% Line 126 + [114|[101|[109|[111|[118|[101|[32]]]]]]], _0) + in %% Line 126 + apply 'run_erlsrv'/1 + (_1) +'rename_service'/2 = + %% Line 127 + fun (_0,_1) -> + let <_2> = + apply %% Line 128 + 'current_version'/0 + () + in %% Line 128 + apply 'rename_service'/3 + (_2, _0, _1) +'rename_service'/3 = + %% Line 129 + fun (_0,_1,_2) -> + let <_3> = + [32|_2] + in let <_4> = + call %% Line 130 + 'erlang':%% Line 130 + '++' + (_1, _3) + in let <_5> = + call %% Line 130 + 'erlang':%% Line 130 + '++' + (%% Line 130 + [114|[101|[110|[97|[109|[101|[32]]]]]]], _4) + in %% Line 130 + apply 'run_erlsrv'/2 + (_0, _5) +'get_service'/1 = + %% Line 152 + fun (_0) -> + let <_1> = + apply %% Line 153 + 'current_version'/0 + () + in %% Line 153 + apply 'get_service'/2 + (_1, _0) +'get_service'/2 = + %% Line 154 + fun (_0,_1) -> + let <_2> = + call %% Line 155 + 'erlang':%% Line 155 + '++' + (%% Line 155 + [108|[105|[115|[116|[32]]]]], _1) + in %% Line 155 + case apply 'run_erlsrv'/2 + (_0, _2) of + %% Line 156 + <'failed'> when 'true' -> + %% Line 157 + {'error','no_such_service'} + %% Line 158 + <_@r0 = {'port_error',Reason}> when 'true' -> + %% Line 159 + {'error',_@r0} + %% Line 160 + <{'ok',Data}> when 'true' -> + let = + fun (_6) -> + %% Line 175 + case apply 'splitline'/1 + (_6) of + <{Name,Value}> when 'true' -> + %% Line 176 + case call 'lists':'keysearch' + (Name, 1, [{[83|[101|[114|[118|[105|[99|[101|[32|[110|[97|[109|[101]]]]]]]]]]]],'servicename',[]}|[{[83|[116|[111|[112|[65|[99|[116|[105|[111|[110]]]]]]]]]],'stopaction',[]}|[{[79|[110|[70|[97|[105|[108]]]]]],'onfail',[105|[103|[110|[111|[114|[101]]]]]]}|[{[77|[97|[99|[104|[105|[110|[101]]]]]]],'machine',[]}|[{[87|[111|[114|[107|[68|[105|[114]]]]]]],'workdir',[]}|[{[83|[78|[97|[109|[101]]]]],'sname',[]}|[{[78|[97|[109|[101]]]],'name',[]}|[{[80|[114|[105|[111|[114|[105|[116|[121]]]]]]]],'priority',[100|[101|[102|[97|[117|[108|[116]]]]]]]}|[{[68|[101|[98|[117|[103|[84|[121|[112|[101]]]]]]]]],'debugtype',[110|[111|[110|[101]]]]}|[{[65|[114|[103|[115]]]],'args',[]}|[{[73|[110|[116|[101|[114|[110|[97|[108|[83|[101|[114|[118|[105|[99|[101|[78|[97|[109|[101]]]]]]]]]]]]]]]]]]],'internalservicename',[]}|[{[67|[111|[109|[109|[101|[110|[116]]]]]]],'comment',[]}]]]]]]]]]]]]) of + %% Line 177 + <{'value',{_28,_X_Atom,_29}}> + when let <_30> = + call 'erlang':'=:=' + (_28, Name) + in let <_31> = + call 'erlang':'=:=' + (_29, Value) + in call 'erlang':'and' + (_30, _31) -> + %% Line 178 + [] + %% Line 179 + <{'value',{_32,Atom,_33}}> + when call 'erlang':'=:=' + (_32, + Name) -> + %% Line 180 + {Atom,Value} + %% Line 181 + <_34> when 'true' -> + %% Line 182 + [] + end + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end + in %% Line 186 + case apply 'split_by_env'/1 + (Data) of + <{Before,After}> when 'true' -> + let <_10> = + call %% Line 187 + 'lists':%% Line 187 + 'map' + (%% Line 187 + F, %% Line 187 + Before) + in let = + call %% Line 187 + 'lists':%% Line 187 + 'flatten' + (_10) + in let = + apply %% Line 189 + 'split_arglist'/1 + (%% Line 189 + FirstPass) + in let <_22> = + fun (_20) -> + let = + call %% Line 194 + 'string':%% Line 194 + 'trim' + (%% Line 193 + _20, %% Line 194 + 'leading', %% Line 194 + [36|[9]]) + in let <_14> = + call %% Line 195 + 'string':%% Line 195 + 'lexemes' + (%% Line 195 + X, %% Line 195 + [61]) + in %% Line 195 + case call 'erlang':'hd' + (_14) of + %% Line 196 + <_35> + when call 'erlang':'=:=' + (_35, + X) -> + %% Line 198 + {X,[]} + %% Line 199 + when 'true' -> + let <_16> = + call %% Line 201 + 'erlang':%% Line 201 + 'length' + (%% Line 201 + Y) + in let <_17> = + call %% Line 201 + 'erlang':%% Line 201 + '+' + (_16, %% Line 201 + 2) + in let <_15> = + call %% Line 202 + 'erlang':%% Line 202 + 'length' + (%% Line 202 + X) + in let <_18> = + call %% Line 201 + 'lists':%% Line 201 + 'sublist' + (%% Line 201 + X, _17, _15) + in %% Line 200 + {Y,_18} + end + in let = + call %% Line 192 + 'lists':%% Line 192 + 'map' + (_22, %% Line 205 + After) + in %% Line 206 + case EnvParts of + %% Line 207 + <[]> when 'true' -> + %% Line 208 + SecondPass + %% Line 209 + <_36> when 'true' -> + %% Line 210 + call 'lists':'append' + (SecondPass, [{'env',EnvParts}|[]]) + end + ( <_9> when 'true' -> + primop 'match_fail' + ({'badmatch',_9}) + -| ['compiler_generated'] ) + end + ( <_25> when 'true' -> + primop 'match_fail' + ({'case_clause',_25}) + -| ['compiler_generated'] ) + end +'store_service'/1 = + %% Line 215 + fun (_0) -> + let <_1> = + apply %% Line 216 + 'current_version'/0 + () + in %% Line 216 + apply 'store_service'/2 + (_1, _0) +'store_service'/2 = + %% Line 217 + fun (_0,_1) -> + %% Line 218 + case call 'lists':'keysearch' + ('servicename', 1, _1) of + %% Line 219 + <'false'> when 'true' -> + %% Line 220 + {'error','no_servicename'} + %% Line 221 + <{'value',{_12,Name}}> when 'true' -> + let <_16,_17> = + case %% Line 222 + apply 'get_service'/2 + (_0, Name) of + %% Line 223 + <{'error','no_such_service'}> when 'true' -> + %% Line 224 + <[97|[100|[100]]],_1> + %% Line 225 + <_13> when 'true' -> + let <_2> = + call %% Line 227 + 'lists':%% Line 227 + 'keydelete' + (%% Line 227 + 'internalservicename', %% Line 227 + 1, _1) + in %% Line 226 + <[115|[101|[116]]],_2> + end + in let <_6> = + apply %% Line 229 + 'build_commands'/2 + (%% Line 229 + Name, ( _17 + -| ['compiler_generated'] )) + in let = + [( _16 + -| ['compiler_generated'] )|_6] + in %% Line 230 + case apply 'run_erlsrv_interactive'/2 + (_0, Commands) of + %% Line 231 + <{'ok',_14}> when 'true' -> + %% Line 232 + 'ok' + %% Line 233 + when 'true' -> + %% Line 234 + {'error',X} + end + %% Line 236 + <_15> when 'true' -> + %% Line 237 + {'error','malformed_description'} + end +'build_commands'/2 = + %% Line 240 + fun (_0,_1) -> + let <_2> = + apply %% Line 241 + 'build_commands2'/2 + (_1, %% Line 241 + []) + in let <_3> = + call %% Line 241 + 'lists':%% Line 241 + 'reverse' + (_2) + in %% Line 241 + [_0|_3] +'build_commands2'/2 = + %% Line 243 + fun (_0,_1) -> + case <_0,_1> of + <[],A> when 'true' -> + %% Line 244 + A + %% Line 245 + <[{'env',[]}|T],A> when 'true' -> + %% Line 246 + apply 'build_commands2'/2 + (T, A) + %% Line 247 + <[{'env',[{Var,Val}|Et]}|T],A> when 'true' -> + let <_2> = + [61|%% Line 248 + Val] + in let <_3> = + call %% Line 248 + 'erlang':%% Line 248 + '++' + (%% Line 248 + Var, _2) + in %% Line 248 + apply 'build_commands2'/2 + ([{'env',Et}|T], [_3|[[45|[101|[110|[118]]]]|A]]) + %% Line 249 + <[{'servicename',_11}|T],A> when 'true' -> + %% Line 250 + apply 'build_commands2'/2 + (T, A) + %% Line 251 + <[{Atom,[]}|T],A> when 'true' -> + let <_4> = + call %% Line 252 + 'erlang':%% Line 252 + 'atom_to_list' + (%% Line 252 + Atom) + in let <_5> = + [45|_4] + in %% Line 252 + apply 'build_commands2'/2 + (T, [_5|A]) + %% Line 253 + <[{'args',L}|T],A> when 'true' -> + let <_6> = + apply %% Line 254 + 'concat_args'/1 + (%% Line 254 + L) + in %% Line 254 + apply 'build_commands2'/2 + (T, [_6|[[45|[97|[114|[103|[115]]]]]|A]]) + %% Line 255 + <[{Atom,Value}|T],A> when 'true' -> + let <_7> = + call %% Line 256 + 'erlang':%% Line 256 + 'atom_to_list' + (%% Line 256 + Atom) + in let <_8> = + [45|_7] + in %% Line 256 + apply 'build_commands2'/2 + (T, [Value|[_8|A]]) + ( <_10,_9> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_10,_9}) + -| [{'function_name',{'build_commands2',2}}] ) + -| ['compiler_generated'] ) + end +'concat_args'/1 = + %% Line 258 + fun (_0) -> + case _0 of + <[H|T]> when 'true' -> + let <_1> = + apply %% Line 259 + 'concat_args2'/1 + (%% Line 259 + T) + in %% Line 259 + call 'erlang':'++' + (H, _1) + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'concat_args',1}}] ) + -| ['compiler_generated'] ) + end +'concat_args2'/1 = + %% Line 260 + fun (_0) -> + case _0 of + <[]> when 'true' -> + %% Line 261 + [] + %% Line 262 + <[H|T]> when 'true' -> + let <_1> = + apply %% Line 263 + 'concat_args2'/1 + (%% Line 263 + T) + in let <_2> = + call %% Line 263 + 'erlang':%% Line 263 + '++' + (%% Line 263 + H, _1) + in %% Line 263 + [32|_2] + ( <_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3}) + -| [{'function_name',{'concat_args2',1}}] ) + -| ['compiler_generated'] ) + end +'new_service'/3 = + %% Line 266 + fun (_0,_1,_2) -> + %% Line 267 + apply 'new_service'/4 + (_0, _1, _2, []) +'new_service'/4 = + %% Line 268 + fun (_0,_1,_2,_3) -> + let = + call %% Line 269 + 'lists':%% Line 269 + 'keydelete' + (%% Line 269 + 'internalservicename', %% Line 269 + 1, _1) + in let = + call %% Line 272 + 'lists':%% Line 272 + 'keyreplace' + (%% Line 272 + 'servicename', %% Line 272 + 1, %% Line 272 + Tmp0, %% Line 273 + {'servicename',_0}) + in let <_8> = + case %% Line 274 + call 'lists':'keysearch' + ('env', 1, Tmp1) of + %% Line 275 + <{'value',{'env',Env0}}> when 'true' -> + let = + call %% Line 276 + 'lists':%% Line 276 + 'keydelete' + (%% Line 276 + [69|[82|[76|[83|[82|[86|[95|[83|[69|[82|[86|[73|[67|[69|[95|[78|[65|[77|[69]]]]]]]]]]]]]]]]]]], %% Line 276 + 1, %% Line 276 + Env0) + in %% Line 277 + call 'lists':'keyreplace' + ('env', 1, Tmp1, %% Line 278 + {'env',[{[69|[82|[76|[83|[82|[86|[95|[83|[69|[82|[86|[73|[67|[69|[95|[78|[65|[77|[69]]]]]]]]]]]]]]]]]]],_3}|%% Line 280 + Env1]}) + %% Line 281 + <_42> when 'true' -> + %% Line 282 + Tmp1 + end + in let <_11> = + case %% Line 285 + call 'lists':'keysearch' + ('args', 1, _8) of + %% Line 286 + <'false'> when 'true' -> + %% Line 287 + [] + %% Line 288 + <{'value',{'args',OldArgs}}> when 'true' -> + %% Line 289 + OldArgs + ( <_10> when 'true' -> + %% Line 285 + primop 'match_fail' + ({'case_clause',_10}) + -| ['compiler_generated'] ) + end + in let = + apply %% Line 291 + 'backstrip'/2 + (_11, %% Line 291 + [43|[43]]) + in let <_19> = + fun (_16,_15) -> + %% Line 292 + case <_16,_15> of + when 'true' -> + %% Line 293 + case of + %% Line 294 + <( 'true' + -| ['compiler_generated'] ),_43> when 'true' -> + _@r0 + %% Line 295 + <'false',[43|[43]]> when 'true' -> + {'true',AccIn} + %% Line 296 + <( _51 + -| ['compiler_generated'] ),( _52 + -| ['compiler_generated'] )> when 'true' -> + {'false',[A|AccIn]} + end + ( <_18,_17> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_18,_17}) + -| [{'function_name',{'-new_service/4-fun-0-',2}}] ) + -| ['compiler_generated'] ) + end + in %% Line 292 + case call 'lists':'foldr' + (_19, %% Line 298 + {'false',[]}, %% Line 298 + Args) of + <{Found,Tail}> when 'true' -> + let <_22> = + case %% Line 300 + Found of + %% Line 301 + <'true'> when 'true' -> + %% Line 302 + apply 'check_tail'/1 + (Tail) + %% Line 303 + <'false'> when 'true' -> + %% Line 304 + {[],'false'} + ( <_21> when 'true' -> + %% Line 300 + primop 'match_fail' + ({'case_clause',_21}) + -| ['compiler_generated'] ) + end + in %% Line 300 + case _22 of + <{OtherFlags,_X_DataDir}> when 'true' -> + let <_25> = + case _2 of + %% Line 307 + <[]> when 'true' -> + %% Line 308 + OtherFlags + %% Line 309 + <_45> when 'true' -> + %% Line 310 + [[45|[100|[97|[116|[97]]]]]|[_2|OtherFlags]] + end + in %% Line 312 + case Found of + %% Line 313 + <'false'> when 'true' -> + let <_28> = + case _25 of + %% Line 315 + <[]> when 'true' -> + %% Line 316 + [] + %% Line 317 + <_46> when 'true' -> + %% Line 318 + [[43|[43]]|_25] + end + in %% Line 320 + case of + %% Line 321 + <[],[]> when 'true' -> + _8 + %% Line 323 + <( [] + -| ['compiler_generated'] ),_47> when 'true' -> + %% Line 324 + call 'erlang':'++' + (_8, [{'args',_28}|[]]) + %% Line 325 + <_48,_49> when 'true' -> + let <_30> = + call %% Line 326 + 'erlang':%% Line 326 + '++' + (%% Line 326 + Args, _28) + in %% Line 326 + call 'lists':'keyreplace' + ('args', 1, _8, {'args',_30}) + end + %% Line 328 + <'true'> when 'true' -> + let = + apply %% Line 329 + 'backstrip'/2 + (%% Line 329 + Args, %% Line 329 + [[43|[43]]|Tail]) + in let <_34> = + case _25 of + %% Line 331 + <[]> when 'true' -> + %% Line 332 + [] + %% Line 333 + <_50> when 'true' -> + %% Line 334 + [[43|[43]]|_25] + end + in let = + call %% Line 336 + 'erlang':%% Line 336 + '++' + (%% Line 336 + StripArgs, _34) + in %% Line 337 + call 'lists':'keyreplace' + ('args', 1, _8, {'args',NewArgs}) + ( <_37> when 'true' -> + primop 'match_fail' + ({'case_clause',_37}) + -| ['compiler_generated'] ) + end + ( <_23> when 'true' -> + primop 'match_fail' + ({'badmatch',_23}) + -| ['compiler_generated'] ) + end + ( <_20> when 'true' -> + primop 'match_fail' + ({'badmatch',_20}) + -| ['compiler_generated'] ) + end +'backstrip'/2 = + %% Line 341 + fun (_0,_1) -> + let <_3> = + call %% Line 342 + 'lists':%% Line 342 + 'reverse' + (_0) + in let <_2> = + call %% Line 342 + 'lists':%% Line 342 + 'reverse' + (_1) + in let <_4> = + apply %% Line 342 + 'backstrip2'/2 + (_3, _2) + in %% Line 342 + call 'lists':'reverse' + (_4) +'backstrip2'/2 = + %% Line 343 + fun (_0,_1) -> + case <_0,_1> of + <[A|T1],[_4|T2]> + when call 'erlang':'=:=' + (_4, + A) -> + %% Line 344 + apply 'backstrip2'/2 + (T1, T2) + %% Line 345 + when 'true' -> + %% Line 346 + L + end +'check_tail'/1 = + %% Line 348 + fun (_0) -> + %% Line 349 + case apply 'check_tail'/3 + (_0, [], 'false') of + <{A,B}> when 'true' -> + let <_2> = + call %% Line 350 + 'lists':%% Line 350 + 'reverse' + (%% Line 350 + A) + in %% Line 350 + {_2,B} + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end +'check_tail'/3 = + %% Line 352 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[],OtherFlags,DataDir> when 'true' -> + %% Line 353 + {OtherFlags,DataDir} + %% Line 354 + <[[45|[100|[97|[116|[97]]]]]|[TheDataDir|T]],OtherFlags,_X_DataDir> when 'true' -> + %% Line 355 + apply 'check_tail'/3 + (T, OtherFlags, TheDataDir) + %% Line 356 + <[H|T],OtherFlags,DataDir> when 'true' -> + %% Line 357 + apply 'check_tail'/3 + (T, [H|OtherFlags], DataDir) + ( <_5,_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4,_3}) + -| [{'function_name',{'check_tail',3}}] ) + -| ['compiler_generated'] ) + end +'split_arglist'/1 = + %% Line 363 + fun (_0) -> + case _0 of + <[]> when 'true' -> + %% Line 364 + [] + %% Line 365 + <[{'args',Str}|T]> when 'true' -> + let <_1> = + apply %% Line 366 + 'parse_arglist'/1 + (%% Line 366 + Str) + in %% Line 366 + [{'args',_1}|T] + %% Line 367 + <[H|T]> when 'true' -> + let <_2> = + apply %% Line 368 + 'split_arglist'/1 + (%% Line 368 + T) + in %% Line 368 + [H|_2] + ( <_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3}) + -| [{'function_name',{'split_arglist',1}}] ) + -| ['compiler_generated'] ) + end +'parse_arglist'/1 = + %% Line 371 + fun (_0) -> + let <_1> = + apply %% Line 372 + 'parse_arglist'/2 + (_0, %% Line 372 + []) + in %% Line 372 + call 'lists':'reverse' + (_1) +'parse_arglist'/2 = + %% Line 373 + fun (_0,_1) -> + let = + call %% Line 374 + 'string':%% Line 374 + 'trim' + (_0, %% Line 374 + 'leading') + in %% Line 375 + case call 'erlang':'length' + (Stripped) of + %% Line 376 + <0> when 'true' -> + _1 + %% Line 378 + <_7> when 'true' -> + %% Line 379 + case apply 'pick_argument'/1 + (_0) of + <{Next,Rest}> when 'true' -> + %% Line 380 + apply 'parse_arglist'/2 + (Rest, [Next|_1]) + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end + end +'pick_argument'/1 = + %% Line 383 + fun (_0) -> + %% Line 384 + case apply 'pick_argument'/3 + ('normal', _0, []) of + <{Rev,Rest}> when 'true' -> + let <_2> = + call %% Line 385 + 'lists':%% Line 385 + 'reverse' + (%% Line 385 + Rev) + in %% Line 385 + {_2,Rest} + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end +'pick_argument'/3 = + %% Line 387 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <_6,[],Acc> when 'true' -> + %% Line 388 + {Acc,[]} + %% Line 389 + <'normal',[32|T],Acc> when 'true' -> + %% Line 390 + {Acc,T} + %% Line 391 + <'normal',[92|T],Acc> when 'true' -> + %% Line 392 + apply 'pick_argument'/3 + ('normal_escaped', T, [92|Acc]) + %% Line 393 + <'normal',[34|T],Acc> when 'true' -> + %% Line 394 + apply 'pick_argument'/3 + ('quoted', T, [34|Acc]) + %% Line 395 + <'normal_escaped',[34|T],Acc> when 'true' -> + %% Line 396 + apply 'pick_argument'/3 + ('bquoted', T, [34|Acc]) + %% Line 397 + <'normal_escaped',[A|T],Acc> when 'true' -> + %% Line 398 + apply 'pick_argument'/3 + ('normal', T, [A|Acc]) + %% Line 399 + <'quoted_escaped',[H|T],Acc> when 'true' -> + %% Line 400 + apply 'pick_argument'/3 + ('quoted', T, [H|Acc]) + %% Line 401 + <'quoted',[34|T],Acc> when 'true' -> + %% Line 402 + apply 'pick_argument'/3 + ('normal', T, [34|Acc]) + %% Line 403 + <'quoted',[92|T],Acc> when 'true' -> + %% Line 404 + apply 'pick_argument'/3 + ('quoted_escaped', T, [92|Acc]) + %% Line 405 + <'quoted',[H|T],Acc> when 'true' -> + %% Line 406 + apply 'pick_argument'/3 + ('quoted', T, [H|Acc]) + %% Line 407 + <'bquoted_escaped',[34|T],Acc> when 'true' -> + %% Line 408 + apply 'pick_argument'/3 + ('normal', T, [34|Acc]) + %% Line 409 + <'bquoted_escaped',[H|T],Acc> when 'true' -> + %% Line 410 + apply 'pick_argument'/3 + ('bquoted', T, [H|Acc]) + %% Line 411 + <'bquoted',[92|T],Acc> when 'true' -> + %% Line 412 + apply 'pick_argument'/3 + ('bquoted_escaped', T, [92|Acc]) + %% Line 413 + <'bquoted',[H|T],Acc> when 'true' -> + %% Line 414 + apply 'pick_argument'/3 + ('bquoted', T, [H|Acc]) + %% Line 415 + <'normal',[H|T],Acc> when 'true' -> + %% Line 416 + apply 'pick_argument'/3 + ('normal', T, [H|Acc]) + ( <_5,_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4,_3}) + -| [{'function_name',{'pick_argument',3}}] ) + -| ['compiler_generated'] ) + end +'split_helper'/2 = + %% Line 418 + fun (_0,_1) -> + case <_0,_1> of + <[69|[110|[118|[58]]]],{Where,0}> when 'true' -> + let <_2> = + call %% Line 419 + 'erlang':%% Line 419 + '+' + (%% Line 419 + Where, %% Line 419 + 1) + in %% Line 419 + {_2,Where} + %% Line 420 + <_6,{Where,Pos}> when 'true' -> + let <_3> = + call %% Line 421 + 'erlang':%% Line 421 + '+' + (%% Line 421 + Where, %% Line 421 + 1) + in %% Line 421 + {_3,Pos} + ( <_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4}) + -| [{'function_name',{'split_helper',2}}] ) + -| ['compiler_generated'] ) + end +'split_by_env'/1 = + %% Line 423 + fun (_0) -> + let <_1> = 'split_helper'/2 + in %% Line 425 + case call 'lists':'foldl' + (_1, {0,0}, _0) of + %% Line 426 + <{_7,0}> when 'true' -> + %% Line 428 + {_0,[]} + %% Line 429 + <{Len,Pos}> when 'true' -> + let <_4> = + call %% Line 430 + 'lists':%% Line 430 + 'sublist' + (_0, %% Line 430 + Pos) + in let <_2> = + call %% Line 430 + 'erlang':%% Line 430 + '+' + (%% Line 430 + Pos, %% Line 430 + 2) + in let <_3> = + call %% Line 430 + 'lists':%% Line 430 + 'sublist' + (_0, _2, %% Line 430 + Len) + in %% Line 430 + {_4,_3} + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'splitline'/1 = + %% Line 434 + fun (_0) -> + %% Line 435 + case call 'string':'split' + (_0, [58]) of + %% Line 436 + <[_4|[]]> when 'true' -> + %% Line 437 + {_0,[]} + %% Line 438 + <[N|[V|[]]]> when 'true' -> + let <_1> = + call %% Line 439 + 'string':%% Line 439 + 'slice' + (%% Line 439 + V, %% Line 439 + 1) + in %% Line 439 + {N,_1} + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('erlsrv') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('erlsrv', _0) +end \ No newline at end of file diff --git a/test/data/sasl/format_lib_supp.core b/test/data/sasl/format_lib_supp.core new file mode 100644 index 0000000..5c86d93 --- /dev/null +++ b/test/data/sasl/format_lib_supp.core @@ -0,0 +1,369 @@ +module 'format_lib_supp' ['module_info'/0, + 'module_info'/1, + 'print_info'/2, + 'print_info'/3] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[102|[111|[114|[109|[97|[116|[95|[108|[105|[98|[95|[115|[117|[112|[112|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]]],1}]] +'print_info'/2 = + %% Line 52 + fun (_0,_1) -> + %% Line 53 + apply 'print_info'/3 + (_0, 79, _1) +'print_info'/3 = + %% Line 54 + fun (_0,_1,_2) -> + do %% Line 55 + apply 'print_header'/3 + (_0, _1, _2) + %% Line 56 + apply 'print_format'/3 + (_0, _1, _2) +'print_header'/3 = + %% Line 58 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 59 + apply 'print_header2'/3 + (Device, Line, Header) + %% Line 60 + when 'true' -> + %% Line 61 + apply 'print_header2'/3 + (Device, Line, []) + end +'print_header2'/3 = + %% Line 62 + fun (_0,_1,_2) -> + let = + call %% Line 63 + 'lists':%% Line 63 + 'concat' + (%% Line 63 + [[126|[110|[126]]]|[_1|[[46]|[_1|[[115|[126|[110]]]]]]]]) + in let = + call %% Line 64 + 'lists':%% Line 64 + 'concat' + (%% Line 64 + [[126]|[_1|[[99|[126|[110]]]]]]) + in do %% Line 65 + call 'io':'format' + (_0, Format1, [_2|[]]) + %% Line 66 + call 'io':'format' + (_0, Format2, [61]) +'print_format'/3 = + %% Line 68 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 69 + call 'io':'format' + (Device, '~n', []) + %% Line 70 + when 'true' -> + do %% Line 71 + apply 'print_data'/3 + (Device, Line, Data) + %% Line 72 + apply 'print_format'/3 + (Device, Line, T) + %% Line 73 + when 'true' -> + do %% Line 74 + apply 'print_items'/3 + (Device, Line, Items) + %% Line 75 + apply 'print_format'/3 + (Device, Line, T) + %% Line 76 + when 'true' -> + do %% Line 77 + apply 'print_newlines'/2 + (Device, N) + %% Line 78 + apply 'print_format'/3 + (Device, Line, T) + %% Line 79 + when 'true' -> + %% Line 80 + apply 'print_format'/3 + (Device, Line, T) + ( <_5,_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4,_3}) + -| [{'function_name',{'print_format',3}}] ) + -| ['compiler_generated'] ) + end +'print_data'/3 = + %% Line 82 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <_X_Device,_X_Line,[]> when 'true' -> + 'ok' + %% Line 83 + when 'true' -> + do %% Line 84 + apply 'print_one_line'/4 + (Device, Line, Key, Value) + %% Line 85 + apply 'print_data'/3 + (Device, Line, T) + %% Line 86 + when 'true' -> + let = + call %% Line 87 + 'misc_supp':%% Line 87 + 'modifier' + (%% Line 87 + Device) + in let <_4> = + call %% Line 88 + 'erlang':%% Line 88 + '++' + (%% Line 88 + Modifier, %% Line 88 + [112|[126|[110]]]) + in let <_5> = + [126|_4] + in do %% Line 88 + call 'io':'format' + (Device, _5, [Value|[]]) + %% Line 89 + apply 'print_data'/3 + (Device, Line, T) + %% Line 90 + when 'true' -> + let = + call %% Line 91 + 'misc_supp':%% Line 91 + 'modifier' + (%% Line 91 + Device) + in let <_7> = + call %% Line 92 + 'erlang':%% Line 92 + '++' + (%% Line 92 + Modifier, %% Line 92 + [112|[126|[110]]]) + in let <_8> = + [126|_7] + in %% Line 92 + call 'io':'format' + (Device, _8, [Value|[]]) + end +'print_items'/3 = + %% Line 94 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 95 + apply 'print_items'/4 + (Device, Line, Name, Items) + ( <_5,_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4,_3}) + -| [{'function_name',{'print_items',3}}] ) + -| ['compiler_generated'] ) + end +'print_newlines'/2 = + %% Line 97 + fun (_0,_1) -> + case <_0,_1> of + <_X_Device,0> when 'true' -> + 'ok' + %% Line 98 + + when call 'erlang':'>' + (N, + 0) -> + do %% Line 99 + call 'io':'format' + (Device, '~n', []) + let <_2> = + call %% Line 100 + 'erlang':%% Line 100 + '-' + (%% Line 100 + N, %% Line 100 + 1) + in %% Line 100 + apply 'print_newlines'/2 + (Device, _2) + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'print_newlines',2}}] ) + -| ['compiler_generated'] ) + end +'print_one_line'/4 = + %% Line 102 + fun (_0,_1,_2,_3) -> + let = + call %% Line 103 + 'misc_supp':%% Line 103 + 'modifier' + (_0) + in let = + apply %% Line 104 + 'term_to_string'/2 + (_2, %% Line 104 + Modifier) + in let <_6> = + call %% Line 105 + 'string':%% Line 105 + 'length' + (%% Line 105 + StrKey) + in let = + call %% Line 105 + 'lists':%% Line 105 + 'min' + (%% Line 105 + [_6|[_1|[]]]) + in let = + call %% Line 106 + 'erlang':%% Line 106 + '-' + (_1, %% Line 106 + KeyLen) + in let = + call %% Line 107 + 'lists':%% Line 107 + 'concat' + (%% Line 107 + [[126|[45]]|[KeyLen|[Modifier|[[115]]]]]) + in let = + call %% Line 108 + 'lists':%% Line 108 + 'concat' + (%% Line 108 + [[126]|[ValueLen|[Modifier|[[115|[126|[110]]]]]]]) + in do %% Line 109 + call 'io':'format' + (_0, Format1, [StrKey|[]]) + let = + apply %% Line 110 + 'term_to_string'/2 + (_3, %% Line 110 + Modifier) + in let = + call %% Line 111 + 'string':%% Line 111 + 'length' + (%% Line 111 + Try) + in %% Line 112 + case <> of + %% Line 113 + <> + when call 'erlang':'<' + (Length, + ValueLen) -> + %% Line 114 + call 'io':'format' + (_0, Format2, [Try|[]]) + %% Line 115 + <> when 'true' -> + do %% Line 116 + call 'io':'format' + (_0, [126|[110|[32|[32|[32|[32|[32|[32|[32|[32|[32]]]]]]]]]]], []) + let = + call %% Line 117 + 'lists':%% Line 117 + 'concat' + (%% Line 117 + [[126]|[_1|[[46|[57]]|[Modifier|[[112|[126|[110]]]]]]]]) + in %% Line 118 + call 'io':'format' + (_0, Format3, [_3|[]]) + end +'term_to_string'/2 = + %% Line 121 + fun (_0,_1) -> + let <_2> = + apply %% Line 122 + 'get_format'/2 + (_0, _1) + in %% Line 122 + call 'io_lib':'format' + (_2, [_0|[]]) +'get_format'/2 = + %% Line 124 + fun (_0,_1) -> + case <_0,_1> of + <[],_7> when 'true' -> + %% Line 125 + [126|[112]] + %% Line 126 + when 'true' -> + %% Line 127 + case call 'io_lib':'printable_list' + (Value) of + %% Line 128 + <'true'> when 'true' -> + let <_2> = + call 'erlang':'++' + (Modifier, [115]) + in [126|_2] + %% Line 129 + <'false'> when 'true' -> + let <_3> = + call 'erlang':'++' + (Modifier, [112]) + in [126|_3] + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end + end +'print_items'/4 = + %% Line 135 + fun (_0,_1,_2,_3) -> + do %% Line 136 + apply 'print_one_line'/4 + (_0, _1, _2, [32]) + %% Line 137 + apply 'print_item_elements'/3 + (_0, _1, _3) +'print_item_elements'/3 = + %% Line 139 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <_X_Device,_X_Line,[]> when 'true' -> + 'ok' + %% Line 140 + when 'true' -> + let <_3> = + call %% Line 141 + 'lists':%% Line 141 + 'concat' + (%% Line 141 + [[32|[32|[32]]]|[Key|[]]]) + in do %% Line 141 + apply 'print_one_line'/4 + (Device, Line, _3, Value) + %% Line 142 + apply 'print_item_elements'/3 + (Device, Line, T) + ( <_6,_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5,_4}) + -| [{'function_name',{'print_item_elements',3}}] ) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('format_lib_supp') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('format_lib_supp', _0) +end \ No newline at end of file diff --git a/test/data/sasl/misc_supp.core b/test/data/sasl/misc_supp.core new file mode 100644 index 0000000..0a83bdf --- /dev/null +++ b/test/data/sasl/misc_supp.core @@ -0,0 +1,245 @@ +module 'misc_supp' ['assq'/2, + 'format_pdict'/3, + 'format_tuples'/2, + 'is_string'/1, + 'modifier'/1, + 'module_info'/0, + 'module_info'/1, + 'multi_map'/2, + 'passq'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[109|[105|[115|[99|[95|[115|[117|[112|[112|[46|[101|[114|[108]]]]]]]]]]]]]]]]],1}]] +'format_pdict'/3 = + %% Line 43 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <'normal',_X_PDict,_X_Exclude> when 'true' -> + %% Line 44 + [] + %% Line 45 + <'all',PDict,Exclude> when 'true' -> + %% Line 46 + case apply 'format_tuples'/2 + (PDict, ['$sys_dict$'|Exclude]) of + %% Line 47 + <[]> when 'true' -> + [] + %% Line 48 + when 'true' -> + [{'newline',1}|Data] + end + ( <_6,_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5,_4}) + -| [{'function_name',{'format_pdict',3}}] ) + -| ['compiler_generated'] ) + end +'format_tuples'/2 = + %% Line 56 + fun (_0,_1) -> + %% Line 57 + case apply 'format_tuples'/3 + (_0, _1, []) of + %% Line 58 + <[]> when 'true' -> + [] + %% Line 59 + when 'true' -> + [{'data',Data}|[]] + end +'format_tuples'/3 = + %% Line 61 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[],_X_Exclude,Res> when 'true' -> + Res + %% Line 62 + <[_@r0 = {Key,Value}|T],Exclude,Res> when 'true' -> + %% Line 63 + case call 'lists':'member' + (Key, Exclude) of + %% Line 64 + <'true'> when 'true' -> + %% Line 65 + apply 'format_tuples'/3 + (T, Exclude, Res) + %% Line 66 + <'false'> when 'true' -> + %% Line 67 + apply 'format_tuples'/3 + (T, Exclude, [_@r0|Res]) + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end + ( <_6,_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5,_4}) + -| [{'function_name',{'format_tuples',3}}] ) + -| ['compiler_generated'] ) + end +'assq'/2 = + %% Line 75 + fun (_0,_1) -> + %% Line 76 + case call 'lists':'keysearch' + (_0, 1, _1) of + %% Line 77 + <{'value',{_5,Val}}> + when call 'erlang':'=:=' + (_5, + _0) -> + {'value',Val} + %% Line 78 + <_6> when 'true' -> + 'false' + end +'passq'/2 = + %% Line 82 + fun (_0,_1) -> + %% Line 83 + case call 'lists':'keysearch' + (_0, 1, _1) of + %% Line 84 + <{'value',{_5,Val}}> + when call 'erlang':'=:=' + (_5, + _0) -> + Val + %% Line 85 + <_6> when 'true' -> + 'undefined' + end +'is_string'/1 = + %% Line 89 + fun (_0) -> + case _0 of + <[]> when 'true' -> + 'false' + %% Line 90 + when 'true' -> + apply 'is_string_2'/1 + (X) + end +'is_string_2'/1 = + %% Line 92 + fun (_0) -> + case _0 of + <[]> when 'true' -> + 'true' + %% Line 93 + <[H|T]> + when try + let <_1> = + call 'erlang':'is_integer' + (H) + in let <_2> = + call 'erlang':'>=' + (H, 32) + in let <_3> = + call 'erlang':'=<' + (H, 255) + in let <_4> = + call 'erlang':'and' + (_2, _3) + in call 'erlang':'and' + (_1, _4) + of -> + Try + catch -> + 'false' -> + %% Line 94 + apply 'is_string_2'/1 + (T) + %% Line 95 + <_6> when 'true' -> + 'false' + end +'multi_map'/2 = + %% Line 103 + fun (_0,_1) -> + case <_0,_1> of + <_X_Func,[[]|_X_ListOfLists]> when 'true' -> + [] + %% Line 104 + when 'true' -> + let <_4> = + fun (_2) -> + %% Line 105 + call 'erlang':'hd' + (_2) + in let <_5> = + call %% Line 105 + 'lists':%% Line 105 + 'map' + (_4, %% Line 105 + ListOfLists) + in let <_6> = + call %% Line 105 + 'erlang':%% Line 105 + 'apply' + (%% Line 105 + Func, _5) + in let <_9> = + fun (_7) -> + %% Line 107 + call 'erlang':'tl' + (_7) + in let <_10> = + call %% Line 107 + 'lists':%% Line 107 + 'map' + (_9, %% Line 107 + ListOfLists) + in let <_11> = + apply %% Line 106 + 'multi_map'/2 + (%% Line 106 + Func, _10) + in %% Line 105 + [_6|_11] + end +'modifier'/1 = + %% Line 112 + fun (_0) -> + let <_2> = + case %% Line 114 + call 'io':'getopts' + (_0) of + %% Line 115 + + when call 'erlang':'is_list' + (List) -> + %% Line 116 + call 'proplists':'get_value' + ('encoding', List, 'latin1') + %% Line 117 + <_5> when 'true' -> + %% Line 118 + 'latin1' + end + in %% Line 120 + apply 'encoding_to_modifier'/1 + (_2) +'encoding_to_modifier'/1 = + %% Line 122 + fun (_0) -> + case _0 of + <'latin1'> when 'true' -> + [] + %% Line 123 + <_2> when 'true' -> + [116] + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('misc_supp') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('misc_supp', _0) +end \ No newline at end of file diff --git a/test/data/sasl/rb.core b/test/data/sasl/rb.core new file mode 100644 index 0000000..470299e --- /dev/null +++ b/test/data/sasl/rb.core @@ -0,0 +1,3167 @@ +module 'rb' ['code_change'/3, + 'filter'/1, + 'filter'/2, + 'grep'/1, + 'h'/0, + 'handle_call'/3, + 'handle_cast'/2, + 'handle_info'/2, + 'help'/0, + 'init'/1, + 'list'/0, + 'list'/1, + 'log_list'/0, + 'log_list'/1, + 'module_info'/0, + 'module_info'/1, + 'rescan'/0, + 'rescan'/1, + 'show'/0, + 'show'/1, + 'start'/0, + 'start'/1, + 'start_link'/1, + 'start_log'/1, + 'stop'/0, + 'stop_log'/0, + 'terminate'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[114|[98|[46|[101|[114|[108]]]]]]]]]],1}], + %% Line 22 + 'behaviour' = + %% Line 22 + ['gen_server'], + %% Line 41 + 'record' = + %% Line 41 + [{'state',[{'record_field',41,{'atom',41,'dir'}}|[{'record_field',41,{'atom',41,'data'}}|[{'record_field',41,{'atom',41,'device'}}|[{'record_field',41,{'atom',41,'max'}}|[{'record_field',41,{'atom',41,'type'}}|[{'record_field',41,{'atom',41,'abort'}}|[{'record_field',41,{'atom',41,'log'}}]]]]]]]}]] +'start'/0 = + %% Line 47 + fun () -> + apply 'start'/1 + ([]) +'start'/1 = + %% Line 48 + fun (_0) -> + %% Line 49 + call 'supervisor':'start_child' + ('sasl_sup', %% Line 50 + {'rb_server',{'rb','start_link',[_0|[]]},%% Line 51 + 'temporary',%% Line 51 + 'brutal_kill',%% Line 51 + 'worker',%% Line 51 + ['rb']}) +'start_link'/1 = + %% Line 53 + fun (_0) -> + %% Line 54 + call 'gen_server':'start_link' + ({'local','rb_server'}, 'rb', _0, []) +'stop'/0 = + %% Line 56 + fun () -> + %% Line 57 + call 'supervisor':'terminate_child' + ('sasl_sup', 'rb_server') +'rescan'/0 = + %% Line 59 + fun () -> + apply 'rescan'/1 + ([]) +'rescan'/1 = + %% Line 60 + fun (_0) -> + %% Line 61 + apply 'call'/1 + ({'rescan',_0}) +'list'/0 = + %% Line 63 + fun () -> + apply 'list'/1 + ('all') +'list'/1 = + %% Line 64 + fun (_0) -> + apply 'call'/1 + ({'list',_0}) +'log_list'/0 = + %% Line 66 + fun () -> + apply 'log_list'/1 + ('all') +'log_list'/1 = + %% Line 67 + fun (_0) -> + apply 'call'/1 + ({'log_list',_0}) +'show'/0 = + %% Line 69 + fun () -> + %% Line 70 + apply 'call'/1 + ('show') +'show'/1 = + %% Line 72 + fun (_0) -> + case _0 of + + when call 'erlang':'is_integer' + (_0) -> + %% Line 73 + apply 'call'/1 + ({'show_number',Number}) + %% Line 74 + + when call 'erlang':'is_atom' + (_0) -> + %% Line 75 + apply 'call'/1 + ({'show_type',Type}) + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'show',1}}] ) + -| ['compiler_generated'] ) + end +'grep'/1 = + %% Line 77 + fun (_0) -> + apply 'call'/1 + ({'grep',_0}) +'filter'/1 = + %% Line 79 + fun (_0) -> + case _0 of + + when call 'erlang':'is_list' + (_0) -> + %% Line 80 + apply 'call'/1 + ({'filter',Filters}) + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'filter',1}}] ) + -| ['compiler_generated'] ) + end +'filter'/2 = + %% Line 82 + fun (_0,_1) -> + case <_0,_1> of + + when try + ( let <_4> = + case call 'erlang':'is_list' + (Filters) of + ( <( 'true' + -| ['compiler_generated'] )> when 'true' -> + call 'erlang':'is_tuple' + (FDates) + -| ['compiler_generated'] ) + ( <( 'false' + -| ['compiler_generated'] )> when 'true' -> + 'false' + -| ['compiler_generated'] ) + ( <_2> when 'true' -> + _2 + -| ['compiler_generated'] ) + end + in ( call 'erlang':'=:=' + (( _4 + -| ['compiler_generated'] ), 'true') + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + of -> + Try + catch -> + 'false' -> + %% Line 83 + apply 'call'/1 + ({'filter',{Filters,FDates}}) + ( <_6,_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5}) + -| [{'function_name',{'filter',2}}] ) + -| ['compiler_generated'] ) + end +'start_log'/1 = + %% Line 85 + fun (_0) -> + apply 'call'/1 + ({'start_log',_0}) +'stop_log'/0 = + %% Line 87 + fun () -> + apply 'call'/1 + ('stop_log') +'h'/0 = + %% Line 89 + fun () -> + apply 'help'/0 + () +'help'/0 = + %% Line 90 + fun () -> + do %% Line 91 + call 'io':'format' + ([126|[110|[82|[101|[112|[111|[114|[116|[32|[66|[114|[111|[119|[115|[101|[114|[32|[84|[111|[111|[108|[32|[45|[32|[117|[115|[97|[103|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 92 + call 'io':'format' + ([61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[61|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 93 + call 'io':'format' + ([114|[98|[58|[115|[116|[97|[114|[116|[40|[41|[32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[115|[116|[97|[114|[116|[32|[116|[104|[101|[32|[114|[98|[95|[115|[101|[114|[118|[101|[114|[32|[119|[105|[116|[104|[32|[100|[101|[102|[97|[117|[108|[116|[32|[111|[112|[116|[105|[111|[110|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 94 + call 'io':'format' + ([114|[98|[58|[115|[116|[97|[114|[116|[40|[79|[112|[116|[105|[111|[110|[115|[41|[32|[32|[45|[32|[119|[104|[101|[114|[101|[32|[79|[112|[116|[105|[111|[110|[115|[32|[105|[115|[32|[97|[32|[108|[105|[115|[116|[32|[111|[102|[58|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 95 + apply 'print_options'/0 + () + do %% Line 96 + call 'io':'format' + ([114|[98|[58|[104|[40|[41|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[112|[114|[105|[110|[116|[32|[116|[104|[105|[115|[32|[104|[101|[108|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 97 + call 'io':'format' + ([114|[98|[58|[104|[101|[108|[112|[40|[41|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[112|[114|[105|[110|[116|[32|[116|[104|[105|[115|[32|[104|[101|[108|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 98 + call 'io':'format' + ([114|[98|[58|[108|[105|[115|[116|[40|[41|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[108|[105|[115|[116|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 99 + call 'io':'format' + ([114|[98|[58|[108|[105|[115|[116|[40|[84|[121|[112|[101|[41|[32|[32|[32|[32|[32|[32|[45|[32|[108|[105|[115|[116|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[32|[111|[102|[32|[116|[121|[112|[101|[32|[84|[121|[112|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 100 + call 'io':'format' + ([114|[98|[58|[108|[111|[103|[95|[108|[105|[115|[116|[40|[41|[32|[32|[32|[32|[32|[32|[45|[32|[108|[111|[103|[32|[108|[105|[115|[116|[32|[111|[102|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 101 + call 'io':'format' + ([114|[98|[58|[108|[111|[103|[95|[108|[105|[115|[116|[40|[84|[121|[112|[101|[41|[32|[32|[45|[32|[108|[111|[103|[32|[108|[105|[115|[116|[32|[111|[102|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[32|[111|[102|[32|[116|[121|[112|[101|[32|[84|[121|[112|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 102 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[99|[117|[114|[114|[101|[110|[116|[108|[121|[32|[115|[117|[112|[112|[111|[114|[116|[101|[100|[32|[116|[121|[112|[101|[115|[32|[97|[114|[101|[58|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 103 + apply 'print_types'/0 + () + do %% Line 104 + call 'io':'format' + ([114|[98|[58|[103|[114|[101|[112|[40|[82|[101|[103|[69|[120|[112|[41|[32|[32|[32|[32|[32|[32|[45|[32|[112|[114|[105|[110|[116|[32|[114|[101|[112|[111|[114|[116|[115|[32|[99|[111|[110|[116|[97|[105|[110|[105|[110|[103|[32|[82|[101|[103|[69|[120|[112|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 105 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[82|[101|[103|[69|[120|[112|[32|[109|[117|[115|[116|[32|[98|[101|[32|[97|[32|[118|[97|[108|[105|[100|[32|[97|[114|[103|[117|[109|[101|[110|[116|[32|[102|[111|[114|[32|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 106 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[116|[104|[101|[32|[102|[117|[110|[99|[116|[105|[111|[110|[32|[114|[101|[58|[114|[117|[110|[47|[50|[32|[111|[114|[32|[114|[101|[58|[114|[117|[110|[47|[51|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 107 + call 'io':'format' + ([114|[98|[58|[102|[105|[108|[116|[101|[114|[40|[70|[105|[108|[116|[101|[114|[115|[41|[32|[45|[32|[112|[114|[105|[110|[116|[32|[114|[101|[112|[111|[114|[116|[115|[32|[109|[97|[116|[99|[104|[105|[110|[103|[32|[70|[105|[108|[116|[101|[114|[115|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 108 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[114|[101|[112|[111|[114|[116|[115|[32|[109|[117|[115|[116|[32|[98|[101|[32|[112|[114|[111|[112|[108|[105|[115|[116|[115|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 109 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[70|[105|[108|[116|[101|[114|[115|[32|[105|[115|[32|[97|[32|[108|[105|[115|[116|[32|[111|[102|[32|[116|[117|[112|[108|[101|[115|[32|[111|[102|[32|[116|[104|[101|[32|[102|[111|[108|[108|[111|[119|[105|[110|[103|[32|[102|[111|[114|[109|[58|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 110 + apply 'print_filters'/0 + () + do %% Line 111 + call 'io':'format' + ([114|[98|[58|[102|[105|[108|[116|[101|[114|[40|[70|[105|[108|[116|[101|[114|[115|[44|[32|[68|[97|[116|[101|[115|[41|[32|[32|[45|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 112 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[115|[97|[109|[101|[32|[97|[115|[32|[114|[98|[58|[102|[105|[108|[116|[101|[114|[47|[49|[32|[98|[117|[116|[32|[97|[99|[99|[101|[112|[116|[115|[32|[100|[97|[116|[101|[32|[114|[97|[110|[103|[101|[115|[32|[116|[111|[32|[102|[105|[108|[116|[101|[114|[32|[114|[101|[112|[111|[114|[116|[115|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 113 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[68|[97|[116|[101|[115|[32|[109|[117|[115|[116|[32|[98|[101|[32|[111|[102|[32|[116|[104|[101|[32|[102|[111|[108|[108|[111|[119|[105|[110|[103|[32|[102|[111|[114|[109|[58|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 114 + apply 'print_dates'/0 + () + do %% Line 115 + call 'io':'format' + ([114|[98|[58|[114|[101|[115|[99|[97|[110|[40|[41|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[114|[101|[115|[99|[97|[110|[115|[32|[116|[104|[101|[32|[114|[101|[112|[111|[114|[116|[32|[100|[105|[114|[101|[99|[116|[111|[114|[121|[32|[119|[105|[116|[104|[32|[115|[97|[109|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 116 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[111|[112|[116|[105|[111|[110|[115|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 117 + call 'io':'format' + ([114|[98|[58|[114|[101|[115|[99|[97|[110|[40|[79|[112|[116|[105|[111|[110|[115|[41|[32|[45|[32|[114|[101|[115|[99|[97|[110|[115|[32|[116|[104|[101|[32|[114|[101|[112|[111|[114|[116|[32|[100|[105|[114|[101|[99|[116|[111|[114|[121|[32|[119|[105|[116|[104|[32|[110|[101|[119|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 118 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[111|[112|[116|[105|[111|[110|[115|[46|[32|[79|[112|[116|[105|[111|[110|[115|[32|[105|[115|[32|[115|[97|[109|[101|[32|[97|[115|[32|[105|[110|[32|[115|[116|[97|[114|[116|[47|[49|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 119 + call 'io':'format' + ([114|[98|[58|[115|[104|[111|[119|[40|[78|[117|[109|[98|[101|[114|[41|[32|[32|[32|[32|[45|[32|[112|[114|[105|[110|[116|[32|[114|[101|[112|[111|[114|[116|[32|[110|[111|[32|[78|[117|[109|[98|[101|[114|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 120 + call 'io':'format' + ([114|[98|[58|[115|[104|[111|[119|[40|[84|[121|[112|[101|[41|[32|[32|[32|[32|[32|[32|[45|[32|[112|[114|[105|[110|[116|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[32|[111|[102|[32|[116|[121|[112|[101|[32|[84|[121|[112|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 121 + call 'io':'format' + ([114|[98|[58|[115|[104|[111|[119|[40|[41|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[112|[114|[105|[110|[116|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 122 + call 'io':'format' + ([114|[98|[58|[115|[116|[97|[114|[116|[95|[108|[111|[103|[40|[70|[105|[108|[101|[41|[32|[45|[32|[114|[101|[100|[105|[114|[101|[99|[116|[32|[97|[108|[108|[32|[114|[101|[112|[111|[114|[116|[115|[32|[116|[111|[32|[102|[105|[108|[101|[32|[111|[114|[32|[105|[111|[95|[100|[101|[118|[105|[99|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 123 + call 'io':'format' + ([114|[98|[58|[115|[116|[111|[112|[95|[108|[111|[103|[40|[41|[32|[32|[32|[32|[32|[32|[45|[32|[99|[108|[111|[115|[101|[32|[116|[104|[101|[32|[108|[111|[103|[32|[102|[105|[108|[101|[32|[97|[110|[100|[32|[114|[101|[100|[105|[114|[101|[99|[116|[32|[116|[111|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 124 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[115|[116|[97|[110|[100|[97|[114|[100|[95|[105|[111|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 125 + call 'io':'format' + ([114|[98|[58|[115|[116|[111|[112|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[115|[116|[111|[112|[32|[116|[104|[101|[32|[114|[98|[95|[115|[101|[114|[118|[101|[114|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) +'call'/1 = + %% Line 134 + fun (_0) -> + %% Line 135 + call 'gen_server':'call' + ('rb_server', _0, 'infinity') +'print_options'/0 = + %% Line 140 + fun () -> + do %% Line 141 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[123|[115|[116|[97|[114|[116|[95|[108|[111|[103|[44|[32|[70|[105|[108|[101|[78|[97|[109|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 142 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[100|[101|[102|[97|[117|[108|[116|[58|[32|[115|[116|[97|[110|[100|[97|[114|[100|[95|[105|[111|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 143 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[123|[109|[97|[120|[44|[32|[77|[97|[120|[78|[111|[79|[102|[82|[101|[112|[111|[114|[116|[115|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 144 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[77|[97|[120|[78|[111|[79|[102|[82|[101|[112|[111|[114|[116|[115|[32|[115|[104|[111|[117|[108|[100|[32|[98|[101|[32|[97|[110|[32|[105|[110|[116|[101|[103|[101|[114|[32|[111|[114|[32|[39|[97|[108|[108|[39|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 145 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[100|[101|[102|[97|[117|[108|[116|[58|[32|[97|[108|[108|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 146 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[123|[114|[101|[112|[111|[114|[116|[95|[100|[105|[114|[44|[32|[68|[105|[114|[83|[116|[114|[105|[110|[103|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 147 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[68|[105|[114|[83|[116|[114|[105|[110|[103|[32|[115|[104|[111|[117|[108|[100|[32|[98|[101|[32|[97|[32|[115|[116|[114|[105|[110|[103|[32|[119|[105|[116|[104|[111|[117|[116|[32|[116|[114|[97|[105|[108|[105|[110|[103|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 148 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[100|[105|[114|[101|[99|[116|[111|[114|[121|[32|[100|[101|[108|[105|[109|[105|[116|[101|[114|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 149 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[100|[101|[102|[97|[117|[108|[116|[58|[32|[123|[115|[97|[115|[108|[44|[32|[101|[114|[114|[111|[114|[95|[108|[111|[103|[103|[101|[114|[95|[109|[102|[95|[100|[105|[114|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 150 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[123|[116|[121|[112|[101|[44|[32|[82|[101|[112|[111|[114|[116|[84|[121|[112|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 151 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[82|[101|[112|[111|[114|[116|[84|[121|[112|[101|[32|[115|[104|[111|[117|[108|[100|[32|[98|[101|[32|[97|[32|[115|[117|[112|[112|[111|[114|[116|[101|[100|[32|[116|[121|[112|[101|[44|[32|[39|[97|[108|[108|[39|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 152 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[111|[114|[32|[97|[32|[108|[105|[115|[116|[32|[111|[102|[32|[115|[117|[112|[112|[111|[114|[116|[101|[100|[32|[116|[121|[112|[101|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 153 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[100|[101|[102|[97|[117|[108|[116|[58|[32|[97|[108|[108|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 154 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[123|[97|[98|[111|[114|[116|[95|[111|[110|[95|[101|[114|[114|[111|[114|[44|[32|[66|[111|[111|[108|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 155 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[66|[111|[111|[108|[58|[32|[116|[114|[117|[101|[32|[124|[32|[102|[97|[108|[115|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 156 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[100|[101|[102|[97|[117|[108|[116|[58|[32|[102|[97|[108|[115|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) +'print_types'/0 = + %% Line 158 + fun () -> + do %% Line 159 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[99|[114|[97|[115|[104|[95|[114|[101|[112|[111|[114|[116|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 160 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[115|[117|[112|[101|[114|[118|[105|[115|[111|[114|[95|[114|[101|[112|[111|[114|[116|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 161 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[112|[114|[111|[103|[114|[101|[115|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]) + %% Line 162 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[32|[45|[32|[101|[114|[114|[111|[114|[126|[110]]]]]]]]]]]]]]]]]]) +'print_filters'/0 = + %% Line 164 + fun () -> + do %% Line 165 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[75|[101|[121|[44|[32|[86|[97|[108|[117|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 166 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[105|[110|[99|[108|[117|[100|[101|[115|[32|[114|[101|[112|[111|[114|[116|[32|[99|[111|[110|[116|[97|[105|[110|[105|[110|[103|[32|[123|[75|[101|[121|[44|[32|[86|[97|[108|[117|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 167 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[75|[101|[121|[44|[32|[86|[97|[108|[117|[101|[44|[32|[110|[111|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 168 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[101|[120|[99|[108|[117|[100|[101|[115|[32|[114|[101|[112|[111|[114|[116|[32|[99|[111|[110|[116|[97|[105|[110|[105|[110|[103|[32|[123|[75|[101|[121|[44|[32|[86|[97|[108|[117|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 169 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[75|[101|[121|[44|[32|[82|[101|[103|[69|[120|[112|[44|[32|[114|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 170 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[82|[101|[103|[69|[120|[112|[32|[109|[117|[115|[116|[32|[98|[101|[32|[97|[32|[118|[97|[108|[105|[100|[32|[97|[114|[103|[117|[109|[101|[110|[116|[32|[102|[111|[114|[32|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 171 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[116|[104|[101|[32|[102|[117|[110|[99|[116|[105|[111|[110|[32|[114|[101|[58|[114|[117|[110|[47|[50|[32|[111|[114|[32|[114|[101|[58|[114|[117|[110|[47|[51|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 172 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[75|[101|[121|[44|[32|[82|[101|[103|[69|[120|[112|[44|[32|[114|[101|[44|[32|[110|[111|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 173 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[101|[120|[99|[108|[117|[100|[101|[115|[32|[114|[101|[112|[111|[114|[116|[32|[99|[111|[110|[116|[97|[105|[110|[105|[110|[103|[32|[123|[75|[101|[121|[44|[32|[82|[101|[103|[69|[120|[112|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) +'print_dates'/0 = + %% Line 175 + fun () -> + do %% Line 176 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[83|[116|[97|[114|[116|[68|[97|[116|[101|[44|[32|[69|[110|[100|[68|[97|[116|[101|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 177 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[83|[116|[97|[114|[116|[68|[97|[116|[101|[32|[61|[32|[69|[110|[100|[68|[97|[116|[101|[32|[61|[32|[123|[123|[89|[44|[77|[44|[68|[125|[44|[123|[72|[44|[77|[44|[83|[125|[125|[32|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 178 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[112|[114|[105|[110|[116|[115|[32|[116|[104|[101|[32|[114|[101|[112|[111|[114|[116|[115|[32|[119|[105|[116|[104|[32|[100|[97|[116|[101|[32|[98|[101|[116|[119|[101|[101|[110|[32|[83|[116|[97|[114|[116|[68|[97|[116|[101|[32|[97|[110|[100|[32|[69|[110|[100|[68|[97|[116|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 179 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[83|[116|[97|[114|[116|[68|[97|[116|[101|[44|[32|[102|[114|[111|[109|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 180 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[112|[114|[105|[110|[116|[115|[32|[116|[104|[101|[32|[114|[101|[112|[111|[114|[116|[115|[32|[119|[105|[116|[104|[32|[100|[97|[116|[101|[32|[103|[114|[101|[97|[116|[101|[114|[32|[116|[104|[97|[110|[32|[83|[116|[97|[114|[116|[68|[97|[116|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 181 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[45|[32|[123|[69|[110|[100|[68|[97|[116|[101|[44|[32|[116|[111|[125|[126|[110]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 182 + call 'io':'format' + ([32|[32|[32|[32|[32|[32|[32|[32|[112|[114|[105|[110|[116|[115|[32|[116|[104|[101|[32|[114|[101|[112|[111|[114|[116|[115|[32|[119|[105|[116|[104|[32|[100|[97|[116|[101|[32|[108|[101|[115|[115|[101|[114|[32|[116|[104|[97|[110|[32|[83|[116|[97|[114|[116|[68|[97|[116|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) +'init'/1 = + %% Line 184 + fun (_0) -> + do %% Line 185 + call 'erlang':'process_flag' + ('priority', 'low') + do %% Line 186 + call 'erlang':'process_flag' + ('trap_exit', 'true') + let = + apply %% Line 187 + 'get_option'/3 + (_0, %% Line 187 + 'start_log', %% Line 187 + 'standard_io') + in let = + apply %% Line 188 + 'open_log_file'/1 + (%% Line 188 + Log) + in let

= + apply %% Line 189 + 'get_report_dir'/1 + (_0) + in let = + apply %% Line 190 + 'get_option'/3 + (_0, %% Line 190 + 'max', %% Line 190 + 'all') + in let = + apply %% Line 191 + 'get_option'/3 + (_0, %% Line 191 + 'type', %% Line 191 + 'all') + in let = + apply %% Line 192 + 'get_option'/3 + (_0, %% Line 192 + 'abort_on_error', %% Line 192 + 'false') + in let <_7> = + call %% Line 193 + 'erlang':%% Line 193 + '++' + (%% Line 193 + Dir, %% Line 193 + [47]) + in let = + apply %% Line 193 + 'scan_files'/3 + (_7, %% Line 193 + Max, %% Line 193 + Type) + in let <_9> = + call %% Line 194 + 'erlang':%% Line 194 + '++' + (%% Line 194 + Dir, %% Line 194 + [47]) + in %% Line 194 + {'ok',{'state',_9,Data,Device,%% Line 195 + Max,%% Line 195 + Type,%% Line 195 + Abort,%% Line 195 + Log}} +'handle_call'/3 = + %% Line 197 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <{'rescan',Options},_X_From,State> when 'true' -> + let <_224,_225> = + case %% Line 199 + apply 'get_option'/3 + (Options, 'start_log', {'undefined'}) of + %% Line 200 + <{'undefined'}> when 'true' -> + %% Line 201 + ( case State of + ( <( {'state',_78,_79,_rec0,_80,_81,_82,_83} + -| ['compiler_generated'] )> when 'true' -> + ( case State of + ( <( {'state',_85,_86,_87,_88,_89,_90,_rec1} + -| ['compiler_generated'] )> when 'true' -> + <_rec0,_rec1> + -| ['compiler_generated'] ) + ( <_91> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_84> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 202 + when 'true' -> + %% Line 203 + ( case State of + ( <( {'state',_92,_93,_rec2,_94,_95,_96,_97} + -| ['compiler_generated'] )> when 'true' -> + do apply 'close_device'/1 + (_rec2) + let <_9> = + apply %% Line 204 + 'open_log_file'/1 + (%% Line 204 + Log) + in <_9,%% Line 204 + Log> + -| ['compiler_generated'] ) + ( <_98> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + end + in %% Line 206 + ( case State of + ( <( {'state',_99,_100,_101,_rec3,_102,_103,_104} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'get_option'/3 + (Options, 'max', _rec3) + in %% Line 207 + ( case State of + ( <( {'state',_106,_107,_108,_109,_rec4,_110,_111} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'get_option'/3 + (Options, 'type', _rec4) + in let = + apply %% Line 208 + 'get_option'/3 + (%% Line 208 + Options, %% Line 208 + 'abort_on_error', %% Line 208 + 'false') + in %% Line 209 + ( case State of + ( <( {'state',_rec5,_113,_114,_115,_116,_117,_118} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'scan_files'/3 + (_rec5, Max, Type) + in %% Line 211 + case State of + <{'state',_rec7,_rec8,_rec9,_rec10,_rec11,_rec12,_rec13}> when 'true' -> + let <_25> = + {'state',_rec7,Data,( _224 + -| ['compiler_generated'] ),Max,Type,Abort,( _225 + -| ['compiler_generated'] )} + in %% Line 212 + {'reply','ok',_25} + ( <_120> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_119> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_112> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_105> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 213 + <_121,_X_From,{'state',_122,'undefined',_123,_124,_125,_126,_127}> when 'true' -> + %% Line 214 + {'reply',{'error','no_data'},{'state','undefined','undefined','undefined','undefined','undefined','undefined','undefined'}} + %% Line 215 + <{'list',Type},_X_From,State> when 'true' -> + %% Line 216 + ( case State of + ( <( {'state',_128,_rec14,_129,_130,_131,_132,_133} + -| ['compiler_generated'] )> when 'true' -> + do apply 'print_list'/3 + ('standard_io', _rec14, Type) + %% Line 217 + {'reply','ok',State} + -| ['compiler_generated'] ) + ( <_134> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 218 + <{'log_list',Type},_X_From,State> when 'true' -> + %% Line 219 + ( case State of + ( <( {'state',_135,_136,_rec15,_137,_138,_139,_140} + -| ['compiler_generated'] )> when 'true' -> + ( case State of + ( <( {'state',_142,_rec16,_143,_144,_145,_146,_147} + -| ['compiler_generated'] )> when 'true' -> + do apply 'print_list'/3 + (_rec15, _rec16, Type) + %% Line 220 + {'reply','ok',State} + -| ['compiler_generated'] ) + ( <_148> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_141> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 221 + <{'start_log',FileName},_X_From,State> when 'true' -> + let = + apply %% Line 222 + 'open_log_file'/1 + (%% Line 222 + FileName) + in %% Line 223 + case State of + <{'state',_149,_150,_151,_152,_153,_154,_155}> when 'true' -> + let <_36> = + call 'erlang':'setelement' + (4, State, NewDevice) + in {'reply','ok',_36} + ( <_156> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 224 + <'stop_log',_X_From,State> when 'true' -> + %% Line 225 + ( case State of + ( <( {'state',_157,_158,_rec18,_159,_160,_161,_162} + -| ['compiler_generated'] )> when 'true' -> + do apply 'close_device'/1 + (_rec18) + %% Line 226 + case State of + <{'state',_164,_165,_166,_167,_168,_169,_170}> when 'true' -> + let <_41> = + call 'erlang':'setelement' + (4, State, 'standard_io') + in {'reply','ok',_41} + ( <_171> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_163> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 227 + <{'show_number',Number},_X_From,State> when 'true' -> + %% Line 228 + case State of + <{'state',Dir,Data,Device,_172,_173,Abort,Log}> when 'true' -> + let = + apply %% Line 229 + 'print_report_by_num'/6 + (%% Line 229 + Dir, %% Line 229 + Data, %% Line 229 + Number, %% Line 229 + Device, %% Line 229 + Abort, %% Line 229 + Log) + in %% Line 230 + case State of + <{'state',_174,_175,_176,_177,_178,_179,_180}> when 'true' -> + let <_46> = + call 'erlang':'setelement' + (4, State, NewDevice) + in {'reply','ok',_46} + ( <_181> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + ( <_42> when 'true' -> + primop 'match_fail' + ({'badmatch',_42}) + -| ['compiler_generated'] ) + end + %% Line 231 + <{'show_type',Type},_X_From,State> when 'true' -> + %% Line 232 + case State of + <{'state',Dir,Data,Device,_182,_183,Abort,Log}> when 'true' -> + let = + apply %% Line 233 + 'print_typed_reports'/6 + (%% Line 233 + Dir, %% Line 233 + Data, %% Line 233 + Type, %% Line 233 + Device, %% Line 233 + Abort, %% Line 233 + Log) + in %% Line 234 + case State of + <{'state',_184,_185,_186,_187,_188,_189,_190}> when 'true' -> + let <_51> = + call 'erlang':'setelement' + (4, State, NewDevice) + in {'reply','ok',_51} + ( <_191> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + ( <_47> when 'true' -> + primop 'match_fail' + ({'badmatch',_47}) + -| ['compiler_generated'] ) + end + %% Line 235 + <'show',_X_From,State> when 'true' -> + %% Line 236 + case State of + <{'state',Dir,Data,Device,_192,_193,Abort,Log}> when 'true' -> + let = + apply %% Line 237 + 'print_all_reports'/5 + (%% Line 237 + Dir, %% Line 237 + Data, %% Line 237 + Device, %% Line 237 + Abort, %% Line 237 + Log) + in %% Line 238 + case State of + <{'state',_194,_195,_196,_197,_198,_199,_200}> when 'true' -> + let <_56> = + call 'erlang':'setelement' + (4, State, NewDevice) + in {'reply','ok',_56} + ( <_201> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + ( <_52> when 'true' -> + primop 'match_fail' + ({'badmatch',_52}) + -| ['compiler_generated'] ) + end + %% Line 239 + <{'grep',RegExp},_X_From,State> when 'true' -> + %% Line 240 + case State of + <{'state',Dir,Data,Device,_202,_203,Abort,Log}> when 'true' -> + %% Line 241 + try + apply 'print_grep_reports'/6 + (Dir, Data, RegExp, Device, Abort, Log) + of <_58> -> + %% Line 243 + case State of + <{'state',_204,_205,_206,_207,_208,_209,_210}> when 'true' -> + let <_61> = + call 'erlang':'setelement' + (4, State, _58) + in {'reply','ok',_61} + ( <_211> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + catch <_65,_64,_63> -> + %% Line 245 + case <_65,_64,_63> of + <( 'error' + -| ['compiler_generated'] ),Error,_212> when 'true' -> + %% Line 246 + {'reply',{'error',Error},State} + ( <_231,_232,_233> when 'true' -> + primop 'raise' + (_233, _232) + -| ['compiler_generated'] ) + end + ( <_57> when 'true' -> + primop 'match_fail' + ({'badmatch',_57}) + -| ['compiler_generated'] ) + end + %% Line 248 + <{'filter',Filters},_X_From,State> when 'true' -> + %% Line 249 + case State of + <{'state',Dir,Data,Device,_213,_214,Abort,Log}> when 'true' -> + %% Line 250 + try + apply 'filter_all_reports'/6 + (Dir, Data, Filters, Device, Abort, Log) + of <_67> -> + %% Line 252 + case State of + <{'state',_215,_216,_217,_218,_219,_220,_221}> when 'true' -> + let <_70> = + call 'erlang':'setelement' + (4, State, _67) + in {'reply','ok',_70} + ( <_222> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + catch <_74,_73,_72> -> + %% Line 254 + case <_74,_73,_72> of + <( 'error' + -| ['compiler_generated'] ),Error,_223> when 'true' -> + %% Line 255 + {'reply',{'error',Error},State} + ( <_235,_236,_237> when 'true' -> + primop 'raise' + (_237, _236) + -| ['compiler_generated'] ) + end + ( <_66> when 'true' -> + primop 'match_fail' + ({'badmatch',_66}) + -| ['compiler_generated'] ) + end + ( <_77,_76,_75> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_77,_76,_75}) + -| [{'function_name',{'handle_call',3}}] ) + -| ['compiler_generated'] ) + end +'terminate'/2 = + %% Line 258 + fun (_0,_1) -> + case <_0,_1> of + <_X_Reason,{'state',_4,_5,Device,_6,_7,_8,_9}> when 'true' -> + %% Line 259 + apply 'close_device'/1 + (Device) + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'terminate',2}}] ) + -| ['compiler_generated'] ) + end +'handle_cast'/2 = + %% Line 261 + fun (_0,_1) -> + %% Line 262 + {'noreply',_1} +'handle_info'/2 = + %% Line 263 + fun (_0,_1) -> + %% Line 264 + {'noreply',_1} +'code_change'/3 = + %% Line 265 + fun (_0,_1,_2) -> + %% Line 266 + {'ok',_1} +'open_log_file'/1 = + %% Line 273 + fun (_0) -> + case _0 of + <'standard_io'> when 'true' -> + 'standard_io' + %% Line 274 + + when let <_1> = + call 'erlang':'is_atom' + (_0) + in let <_2> = + call 'erlang':'=/=' + (_0, 'standard_error') + in call 'erlang':'and' + (_1, _2) -> + %% Line 275 + case call 'erlang':'whereis' + (Fd) of + %% Line 276 + <'undefined'> when 'true' -> + do call 'io':'format' + ([114|[98|[58|[32|[82|[101|[103|[105|[115|[116|[101|[114|[101|[100|[32|[110|[97|[109|[101|[32|[110|[111|[116|[32|[102|[111|[117|[110|[100|[32|[39|[126|[116|[115|[39|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 277 + [Fd|[]]) + do %% Line 278 + call 'io':'format' + ([114|[98|[58|[32|[85|[115|[105|[110|[103|[32|[115|[116|[97|[110|[100|[97|[114|[100|[95|[105|[111|[126|[110]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 279 + apply 'open_log_file'/1 + ('standard_io') + %% Line 280 + when 'true' -> + apply 'open_log_file'/1 + (Pid) + end + %% Line 282 + + when call 'erlang':'is_pid' + (_0) -> + Fd + %% Line 283 + + when call 'erlang':'is_list' + (_0) -> + %% Line 284 + case call 'file':'open' + (FileName, ['write'|['append'|[{'encoding','utf8'}]]]) of + %% Line 285 + <{'ok',Fd}> when 'true' -> + Fd + %% Line 286 + when 'true' -> + do %% Line 287 + call 'io':'format' + ([114|[98|[58|[32|[67|[97|[110|[110|[111|[116|[32|[111|[112|[101|[110|[32|[102|[105|[108|[101|[32|[39|[126|[116|[115|[39|[32|[40|[126|[119|[41|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 288 + [FileName|[Error|[]]]) + do %% Line 289 + call 'io':'format' + ([114|[98|[58|[32|[85|[115|[105|[110|[103|[32|[115|[116|[97|[110|[100|[97|[114|[100|[95|[105|[111|[126|[110]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 290 + 'standard_io' + end + %% Line 292 + <'standard_error'> when 'true' -> + do %% Line 293 + call 'io':'format' + ([114|[98|[58|[32|[85|[115|[105|[110|[103|[32|[115|[116|[97|[110|[100|[97|[114|[100|[95|[105|[111|[126|[110]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 294 + 'standard_io' + ( <_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5}) + -| [{'function_name',{'open_log_file',1}}] ) + -| ['compiler_generated'] ) + end +'close_device'/1 = + %% Line 296 + fun (_0) -> + case _0 of + + when call 'erlang':'is_pid' + (_0) -> + catch + %% Line 297 + call 'file':'close' + (Fd) + %% Line 298 + <_2> when 'true' -> + 'ok' + end +'get_option'/3 = + %% Line 300 + fun (_0,_1,_2) -> + %% Line 301 + case call 'lists':'keysearch' + (_1, 1, _0) of + %% Line 302 + <{'value',{_X_Key,Value}}> when 'true' -> + Value + %% Line 303 + <_7> when 'true' -> + _2 + end +'get_report_dir'/1 = + %% Line 306 + fun (_0) -> + %% Line 307 + case call 'lists':'keysearch' + ('report_dir', 1, _0) of + %% Line 308 + <{'value',{_X_Key,RptDir}}> when 'true' -> + RptDir + %% Line 309 + <_5> when 'true' -> + let <_1> = + catch + %% Line 310 + call 'application':'get_env' + ('sasl', 'error_logger_mf_dir') + in %% Line 310 + case _1 of + %% Line 311 + <{'ok',Dir}> when 'true' -> + Dir + %% Line 312 + <_6> when 'true' -> + %% Line 313 + call 'erlang':'exit' + ([99|[97|[110|[110|[111|[116|[32|[108|[111|[99|[97|[116|[101|[32|[114|[101|[112|[111|[114|[116|[32|[100|[105|[114|[101|[99|[116|[111|[114|[121]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + end + end +'scan_files'/3 = + %% Line 328 + fun (_0,_1,_2) -> + let <_3> = + call %% Line 329 + 'erlang':%% Line 329 + '++' + (_0, %% Line 329 + [47|[105|[110|[100|[101|[120]]]]]]) + in %% Line 329 + case call 'file':'open' + (_3, ['raw'|['read']]) of + %% Line 330 + <{'ok',Fd}> when 'true' -> + let <_4> = + catch + %% Line 331 + call 'file':'read' + (Fd, 1) + in %% Line 331 + case _4 of + %% Line 332 + <{'ok',[LastWritten|[]]}> when 'true' -> + %% Line 333 + case call 'file':'close' + (Fd) of + <'ok'> when 'true' -> + let = + apply %% Line 334 + 'make_file_list'/2 + (_0, %% Line 334 + LastWritten) + in %% Line 335 + apply 'scan_files'/4 + (_0, Files, _1, _2) + ( <_5> when 'true' -> + primop 'match_fail' + ({'badmatch',_5}) + -| ['compiler_generated'] ) + end + %% Line 336 + <_X_X> when 'true' -> + do %% Line 337 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'close' + -| ['result_not_wanted'] ) + (Fd) + -| ['result_not_wanted'] ) + %% Line 338 + call 'erlang':'exit' + ([99|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[116|[104|[101|[32|[105|[110|[100|[101|[120|[32|[102|[105|[108|[101]]]]]]]]]]]]]]]]]]]]]]]]]]) + end + %% Line 340 + <_X_X> when 'true' -> + call 'erlang':'exit' + ([99|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[116|[104|[101|[32|[105|[110|[100|[101|[120|[32|[102|[105|[108|[101]]]]]]]]]]]]]]]]]]]]]]]]]]) + end +'make_file_list'/2 = + %% Line 343 + fun (_0,_1) -> + %% Line 344 + case call 'file':'list_dir' + (_0) of + %% Line 345 + <{'ok',FileNames}> when 'true' -> + let <_6> = + fun (_4) -> + let <_2> = + catch + %% Line 347 + call 'erlang':'list_to_integer' + (_4) + in %% Line 347 + case _2 of + %% Line 348 + + when call 'erlang':'is_integer' + (_2) -> + %% Line 349 + {'true',Int} + %% Line 350 + <_12> when 'true' -> + %% Line 351 + 'false' + end + in let = + call %% Line 346 + 'lists':%% Line 346 + 'zf' + (_6, %% Line 354 + FileNames) + in let <_8> = + call %% Line 355 + 'lists':%% Line 355 + 'sort' + (%% Line 355 + FileNumbers) + in %% Line 355 + apply 'shift'/2 + (_8, _1) + %% Line 356 + <_13> when 'true' -> + call 'erlang':'exit' + ({'bad_directory',_0}) + end +'shift'/2 = + %% Line 359 + fun (_0,_1) -> + %% Line 360 + apply 'shift'/3 + (_0, _1, []) +'shift'/3 = + %% Line 362 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[H|T],_7,Res> + when call 'erlang':'=:=' + (_7, + H) -> + let <_3> = + call %% Line 363 + 'lists':%% Line 363 + 'reverse' + (%% Line 363 + T) + in %% Line 363 + [H|call 'erlang':'++' + (Res, _3)] + %% Line 364 + <[H|T],First,Res> when 'true' -> + %% Line 365 + apply 'shift'/3 + (T, First, [H|Res]) + %% Line 366 + <[],_8,Res> when 'true' -> + %% Line 367 + Res + ( <_6,_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5,_4}) + -| [{'function_name',{'shift',3}}] ) + -| ['compiler_generated'] ) + end +'scan_files'/4 = + %% Line 375 + fun (_0,_1,_2,_3) -> + %% Line 376 + apply 'scan_files'/6 + (_0, 1, _1, [], _2, _3) +'scan_files'/6 = + %% Line 377 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + <_X_Dir,_17,[],Res,_X_Max,_X_Type> when 'true' -> + Res + %% Line 378 + <_X_Dir,_18,_X_Files,Res,Max,_X_Type> + when call 'erlang':'=<' + (Max, + 0) -> + Res + %% Line 379 + when 'true' -> + let = + apply %% Line 380 + 'get_report_data_from_file'/5 + (%% Line 380 + Dir, %% Line 380 + No, %% Line 380 + H, %% Line 380 + Max, %% Line 380 + Type) + in let = + call %% Line 381 + 'erlang':%% Line 381 + 'length' + (%% Line 381 + Data) + in let = + apply %% Line 382 + 'dec_max'/2 + (%% Line 382 + Max, %% Line 382 + Len) + in let = + call %% Line 383 + 'erlang':%% Line 383 + '+' + (%% Line 383 + No, %% Line 383 + Len) + in let = + call %% Line 384 + 'erlang':%% Line 384 + '++' + (%% Line 384 + Data, %% Line 384 + Res) + in %% Line 385 + apply 'scan_files'/6 + (Dir, NewNo, T, NewData, NewMax, Type) + ( <_16,_15,_14,_13,_12,_11> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_16,_15,_14,_13,_12,_11}) + -| [{'function_name',{'scan_files',6}}] ) + -| ['compiler_generated'] ) + end +'dec_max'/2 = + %% Line 387 + fun (_0,_1) -> + case <_0,_1> of + <'all',_4> when 'true' -> + 'all' + %% Line 388 + when 'true' -> + call 'erlang':'-' + (X, Y) + end +'get_report_data_from_file'/5 = + %% Line 390 + fun (_0,_1,_2,_3,_4) -> + let = + call %% Line 391 + 'erlang':%% Line 391 + 'integer_to_list' + (_2) + in let = + call %% Line 392 + 'lists':%% Line 392 + 'concat' + (%% Line 392 + [_0|[Fname|[]]]) + in %% Line 393 + case call 'file':'open' + (FileName, ['read']) of + %% Line 394 + <{'ok',Fd}> + when call 'erlang':'is_pid' + (Fd) -> + apply 'read_reports'/5 + (_1, Fd, Fname, _3, _4) + %% Line 395 + <_14> when 'true' -> + let <_7> = + call 'erlang':'++' + ([67|[97|[110|[39|[116|[32|[111|[112|[101|[110|[32|[102|[105|[108|[101|[32]]]]]]]]]]]]]]]], Fname) + in [{_1,'unknown',_7,[63|[63|[63]]],Fname,0}|[]] + end +'read_reports'/5 = + %% Line 406 + fun (_0,_1,_2,_3,_4) -> + do %% Line 407 + call 'io':'format' + ([114|[98|[58|[32|[114|[101|[97|[100|[105|[110|[103|[32|[114|[101|[112|[111|[114|[116|[46|[46|[46]]]]]]]]]]]]]]]]]]]]]) + let <_5> = + catch + %% Line 408 + apply 'read_reports'/3 + (_1, [], _4) + in %% Line 408 + case _5 of + %% Line 409 + <{'ok',Res}> when 'true' -> + %% Line 410 + case call 'file':'close' + (_1) of + <'ok'> when 'true' -> + do %% Line 411 + call 'io':'format' + ([100|[111|[110|[101|[46|[126|[110]]]]]]]) + let <_8> = + case <> of + %% Line 414 + <> + when try + let <_7> = + call 'erlang':'length' + (Res) + in call 'erlang':'>' + (_7, _3) + of -> + Try + catch -> + 'false' -> + %% Line 415 + call 'lists':'sublist' + (Res, 1, _3) + %% Line 416 + <> when 'true' -> + %% Line 417 + Res + end + in %% Line 419 + apply 'add_report_data'/3 + (_8, _0, _2) + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end + %% Line 420 + <{'error',_@r0 = [Problem|Res]}> when 'true' -> + do %% Line 421 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'close' + -| ['result_not_wanted'] ) + (_1) + -| ['result_not_wanted'] ) + do %% Line 422 + call 'io':'format' + ([69|[114|[114|[111|[114|[58|[32|[126|[116|[112|[126|[110]]]]]]]]]]]], [Problem|[]]) + let <_11> = + call %% Line 424 + 'erlang':%% Line 424 + 'length' + (%% Line 424 + Res) + in do %% Line 423 + call 'io':'format' + ([83|[97|[108|[118|[97|[103|[101|[100|[32|[126|[112|[32|[101|[110|[116|[114|[105|[101|[115|[32|[102|[114|[111|[109|[32|[99|[111|[114|[114|[117|[112|[116|[32|[114|[101|[112|[111|[114|[116|[32|[102|[105|[108|[101|[32|[126|[116|[115|[46|[46|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 424 + [_11|[_2|[]]]) + let <_13> = + case <> of + %% Line 427 + <> + when try + let <_12> = + call 'erlang':'+' + (1, call 'erlang':'length' + (Res)) + in call 'erlang':'>' + (_12, _3) + of -> + Try + catch -> + 'false' -> + %% Line 428 + call 'lists':'sublist' + (_@r0, 1, _3) + %% Line 429 + <> when 'true' -> + %% Line 430 + _@r0 + end + in %% Line 432 + apply 'add_report_data'/3 + (_13, _0, _2) + %% Line 433 + when 'true' -> + do %% Line 434 + call 'io':'format' + ([101|[114|[114|[32|[126|[116|[112|[126|[110]]]]]]]]], [Else|[]]) + let <_15> = + call %% Line 435 + 'erlang':%% Line 435 + '++' + (%% Line 435 + [67|[97|[110|[39|[116|[32|[114|[101|[97|[100|[32|[114|[101|[112|[111|[114|[116|[115|[32|[102|[114|[111|[109|[32|[102|[105|[108|[101|[32]]]]]]]]]]]]]]]]]]]]]]]]]]]]], _2) + in %% Line 435 + [{_0,'unknown',_15,%% Line 436 + [63|[63|[63]]],_2,%% Line 436 + 0}|%% Line 436 + []] + end +'add_report_data'/3 = + %% Line 446 + fun (_0,_1,_2) -> + %% Line 447 + apply 'add_report_data'/4 + (_0, _1, _2, []) +'add_report_data'/4 = + %% Line 448 + fun (_0,_1,_2,_3) -> + case <_0,_1,_2,_3> of + <[{Type,ShortDescr,Date,FilePos}|T],No,FName,Res> when 'true' -> + let <_4> = + call %% Line 449 + 'erlang':%% Line 449 + '+' + (%% Line 449 + No, %% Line 449 + 1) + in %% Line 449 + apply 'add_report_data'/4 + (T, _4, FName, %% Line 450 + [{No,Type,ShortDescr,Date,FName,FilePos}|Res]) + %% Line 451 + <[],_X_No,_X_FName,Res> when 'true' -> + Res + ( <_8,_7,_6,_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_8,_7,_6,_5}) + -| [{'function_name',{'add_report_data',4}}] ) + -| ['compiler_generated'] ) + end +'read_reports'/3 = + %% Line 453 + fun (_0,_1,_2) -> + %% Line 454 + case call 'file':'position' + (_0, 'cur') of + <{'ok',FilePos}> when 'true' -> + let <_4> = + catch + %% Line 455 + apply 'read_report'/1 + (_0) + in %% Line 455 + case _4 of + %% Line 456 + <{'ok',Report}> when 'true' -> + let = + apply %% Line 457 + 'get_type'/1 + (%% Line 457 + Report) + in %% Line 458 + case apply 'get_short_descr'/1 + (Report) of + <{ShortDescr,Date}> when 'true' -> + let = + {%% Line 459 + RealType,%% Line 459 + ShortDescr,%% Line 459 + Date,%% Line 459 + FilePos} + in %% Line 460 + case <> of + %% Line 461 + <> + when call 'erlang':'=:=' + (_2, + 'all') -> + %% Line 462 + apply 'read_reports'/3 + (_0, [Rep|_1], _2) + %% Line 463 + <> + when call 'erlang':'==' + (RealType, + _2) -> + %% Line 464 + apply 'read_reports'/3 + (_0, [Rep|_1], _2) + %% Line 465 + <> + when call 'erlang':'is_list' + (_2) -> + %% Line 466 + case call 'lists':'member' + (RealType, _2) of + %% Line 467 + <'true'> when 'true' -> + %% Line 468 + apply 'read_reports'/3 + (_0, [Rep|_1], _2) + %% Line 469 + <_13> when 'true' -> + %% Line 470 + apply 'read_reports'/3 + (_0, _1, _2) + end + %% Line 472 + <> when 'true' -> + %% Line 473 + apply 'read_reports'/3 + (_0, _1, _2) + end + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end + %% Line 475 + <{'error',Error}> when 'true' -> + %% Line 476 + {'error',[{'unknown',Error,[],FilePos}|_1]} + %% Line 477 + <'eof'> when 'true' -> + %% Line 478 + {'ok',_1} + %% Line 479 + <{'EXIT',Reason}> when 'true' -> + %% Line 480 + [{'unknown',Reason,[],FilePos}|_1] + ( <_9> when 'true' -> + primop 'match_fail' + ({'case_clause',_9}) + -| ['compiler_generated'] ) + end + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end +'read_report'/1 = + %% Line 483 + fun (_0) -> + %% Line 484 + case call 'io':'get_chars' + (_0, '', 2) of + %% Line 485 + <[Hi|[Lo|[]]]> when 'true' -> + let = + apply %% Line 486 + 'get_int16'/2 + (%% Line 486 + Hi, %% Line 486 + Lo) + in %% Line 487 + case call 'io':'get_chars' + (_0, '', Size) of + %% Line 488 + <'eof'> when 'true' -> + %% Line 489 + {'error',[80|[114|[101|[109|[97|[116|[117|[114|[101|[32|[101|[110|[100|[32|[111|[102|[32|[102|[105|[108|[101]]]]]]]]]]]]]]]]]]]]]} + %% Line 490 + when 'true' -> + let = + call %% Line 491 + 'erlang':%% Line 491 + 'list_to_binary' + (%% Line 491 + List) + in let = + call %% Line 492 + 'erlang':%% Line 492 + 'make_ref' + () + in let <_5> = + catch + let <_4> = + call %% Line 493 + 'erlang':%% Line 493 + 'binary_to_term' + (%% Line 493 + Bin) + in %% Line 493 + {Ref,_4} + in %% Line 493 + case _5 of + %% Line 494 + <{'EXIT',_10}> when 'true' -> + %% Line 495 + {'error',[73|[110|[99|[111|[109|[112|[108|[101|[116|[101|[32|[101|[114|[108|[97|[110|[103|[32|[116|[101|[114|[109|[32|[105|[110|[32|[108|[111|[103]]]]]]]]]]]]]]]]]]]]]]]]]]]]]} + %% Line 496 + <{_11,Term}> + when call 'erlang':'=:=' + (_11, + Ref) -> + %% Line 497 + {'ok',Term} + ( <_6> when 'true' -> + primop 'match_fail' + ({'case_clause',_6}) + -| ['compiler_generated'] ) + end + end + %% Line 500 + <'eof'> when 'true' -> + %% Line 501 + 'eof' + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end +'get_int16'/2 = + %% Line 504 + fun (_0,_1) -> + let <_3> = + call %% Line 505 + 'erlang':%% Line 505 + 'bsl' + (_0, %% Line 505 + 8) + in let <_4> = + call %% Line 505 + 'erlang':%% Line 505 + 'band' + (_3, %% Line 505 + 65280) + in let <_2> = + call %% Line 505 + 'erlang':%% Line 505 + 'band' + (_1, %% Line 505 + 255) + in %% Line 505 + call 'erlang':'bor' + (_4, _2) +'get_type'/1 = + %% Line 512 + fun (_0) -> + case _0 of + <{_X_Time,{'error_report',_X_Pid,{_2,'crash_report',_3}}}> when 'true' -> + %% Line 513 + 'crash_report' + %% Line 514 + <{_X_Time,{'error_report',_X_Pid,{_4,'supervisor_report',_5}}}> when 'true' -> + %% Line 515 + 'supervisor_report' + %% Line 516 + <{_X_Time,{'info_report',_X_Pid,{_6,'progress',_7}}}> when 'true' -> + %% Line 517 + 'progress' + %% Line 518 + <{_X_Time,{Type,_8,_9}}> when 'true' -> + Type + %% Line 519 + <_10> when 'true' -> + 'unknown' + end +'get_short_descr'/1 = + %% Line 521 + fun (_0) -> + case _0 of + <{{Date,Time},{'error_report',Pid,{_13,'crash_report',Rep}}}> when 'true' -> + %% Line 522 + case Rep of + <[OwnRep|_14]> when 'true' -> + let <_4> = + case %% Line 524 + call 'lists':'keysearch' + ('registered_name', 1, OwnRep) of + %% Line 525 + <{'value',{_X_Key,[]}}> when 'true' -> + %% Line 526 + case call 'lists':'keysearch' + ('initial_call', 1, OwnRep) of + %% Line 527 + <{'value',{_X_K,{M,_X_F,_X_A}}}> when 'true' -> + M + %% Line 528 + <_15> when 'true' -> + Pid + end + %% Line 530 + <{'value',{_X_Key,N}}> when 'true' -> + N + %% Line 531 + <_16> when 'true' -> + Pid + end + in let <_6> = + apply %% Line 533 + 'date_str'/2 + (%% Line 533 + Date, %% Line 533 + Time) + in %% Line 533 + {_4,_6} + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end + %% Line 534 + <{{Date,Time},{'error_report',Pid,{_17,'supervisor_report',Rep}}}> when 'true' -> + let <_8> = + case %% Line 536 + call 'lists':'keysearch' + ('supervisor', 1, Rep) of + %% Line 537 + <{'value',{_X_Key,N}}> + when call 'erlang':'is_atom' + (N) -> + N + %% Line 538 + <_18> when 'true' -> + Pid + end + in let <_10> = + apply %% Line 540 + 'date_str'/2 + (%% Line 540 + Date, %% Line 540 + Time) + in %% Line 540 + {_8,_10} + %% Line 541 + <{{Date,Time},{_X_Type,Pid,_19}}> when 'true' -> + let <_11> = + apply %% Line 542 + 'date_str'/2 + (%% Line 542 + Date, %% Line 542 + Time) + in %% Line 542 + {Pid,_11} + %% Line 543 + <_20> when 'true' -> + %% Line 544 + {'???',[63|[63|[63]]]} + end +'date_str'/2 = + %% Line 546 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 547 + case call 'application':'get_env' + ('sasl', 'utc_log') of + %% Line 548 + <{'ok','true'}> when 'true' -> + %% Line 549 + case %% Line 550 + apply 'local_time_to_universal_time'/1 + ({Date,Time}) of + <{{YY,MoMo,DD},{HH,MiMi,SS}}> when 'true' -> + let <_3> = + call %% Line 551 + 'io_lib':%% Line 551 + 'format' + (%% Line 551 + [126|[119|[45|[126|[50|[46|[50|[46|[48|[119|[45|[126|[50|[46|[50|[46|[48|[119|[32|[126|[50|[46|[50|[46|[48|[119|[58|[126|[50|[46|[50|[46|[48|[119|[58|[126|[50|[46|[50|[46|[48|[119|[32|[85|[84|[67]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 553 + [YY|[MoMo|[DD|[HH|[MiMi|[SS|[]]]]]]]) + in %% Line 551 + call 'lists':'flatten' + (_3) + ( <_2> when 'true' -> + primop 'match_fail' + ({'badmatch',_2}) + -| ['compiler_generated'] ) + end + %% Line 554 + <_8> when 'true' -> + let <_4> = + call %% Line 555 + 'io_lib':%% Line 555 + 'format' + (%% Line 555 + [126|[119|[45|[126|[50|[46|[50|[46|[48|[119|[45|[126|[50|[46|[50|[46|[48|[119|[32|[126|[50|[46|[50|[46|[48|[119|[58|[126|[50|[46|[50|[46|[48|[119|[58|[126|[50|[46|[50|[46|[48|[119]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 557 + [Y|[Mo|[D|[H|[Mi|[S|[]]]]]]]) + in %% Line 555 + call 'lists':'flatten' + (_4) + end + ( <_7,_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_7,_6}) + -| [{'function_name',{'date_str',2}}] ) + -| ['compiler_generated'] ) + end +'local_time_to_universal_time'/1 = + %% Line 560 + fun (_0) -> + case _0 of + <_@r0 = {Date,Time}> when 'true' -> + %% Line 561 + case call 'calendar':'local_time_to_universal_time_dst' + (_@r0) of + %% Line 562 + <[UCT|[]]> when 'true' -> + %% Line 563 + UCT + %% Line 564 + <[UCT1|[_X_UCT2|[]]]> when 'true' -> + %% Line 565 + UCT1 + %% Line 566 + <[]> when 'true' -> + %% Line 567 + _@r0 + ( <_1> when 'true' -> + primop 'match_fail' + ({'case_clause',_1}) + -| ['compiler_generated'] ) + end + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'local_time_to_universal_time',1}}] ) + -| ['compiler_generated'] ) + end +'print_list'/3 = + %% Line 571 + fun (_0,_1,_2) -> + let = + call %% Line 572 + 'misc_supp':%% Line 572 + 'modifier' + (_0) + in %% Line 574 + case apply 'find_widths'/5 + (_1, Modifier, 7, 13, []) of + <{DescrWidth,DateWidth,Data}> when 'true' -> + let = + call %% Line 575 + 'lists':%% Line 575 + 'concat' + (%% Line 575 + [[126|[52|[115|[126|[50|[48|[115|[32|[126]]]]]]]]]|[DescrWidth|[[115|[126|[50|[48|[115|[126|[110]]]]]]]]]]) + in do %% Line 576 + call 'io':'format' + (_0, Format, [[78|[111]]|[[84|[121|[112|[101]]]]|[[80|[114|[111|[99|[101|[115|[115]]]]]]]|[[68|[97|[116|[101|[32|[32|[32|[32|[32|[84|[105|[109|[101]]]]]]]]]]]]]]]]]) + do %% Line 577 + call 'io':'format' + (_0, Format, [[61|[61]]|[[61|[61|[61|[61]]]]|[[61|[61|[61|[61|[61|[61|[61]]]]]]]|[[61|[61|[61|[61|[32|[32|[32|[32|[32|[61|[61|[61|[61]]]]]]]]]]]]]]]]]) + %% Line 578 + apply 'print_list'/6 + (_0, Data, _2, DescrWidth, DateWidth, Modifier) + ( <_5> when 'true' -> + primop 'match_fail' + ({'badmatch',_5}) + -| ['compiler_generated'] ) + end +'print_list'/6 = + %% Line 579 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + <_12,[],_13,_14,_15,_16> when 'true' -> + 'true' + %% Line 580 + when 'true' -> + do %% Line 581 + apply 'print_one_report'/6 + (Fd, H, Type, Width, DateWidth, Modifier) + %% Line 582 + apply 'print_list'/6 + (Fd, T, Type, Width, DateWidth, Modifier) + ( <_11,_10,_9,_8,_7,_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_11,_10,_9,_8,_7,_6}) + -| [{'function_name',{'print_list',6}}] ) + -| ['compiler_generated'] ) + end +'find_widths'/5 = + %% Line 585 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + <[],_X_Modifier,DescrWidth,DateWidth,Data> when 'true' -> + let <_7> = + call %% Line 586 + 'erlang':%% Line 586 + '+' + (%% Line 586 + DescrWidth, %% Line 586 + 1) + in let <_6> = + call %% Line 586 + 'erlang':%% Line 586 + '+' + (%% Line 586 + DateWidth, %% Line 586 + 1) + in let <_5> = + call %% Line 586 + 'lists':%% Line 586 + 'reverse' + (%% Line 586 + Data) + in %% Line 586 + {_7,_6,_5} + %% Line 587 + <[H|T],Modifier,DescrWidth,DateWidth,Data> when 'true' -> + let = + call %% Line 588 + 'erlang':%% Line 588 + 'element' + (%% Line 588 + 3, %% Line 588 + H) + in let <_9> = + call %% Line 589 + 'erlang':%% Line 589 + '++' + (%% Line 589 + Modifier, %% Line 589 + [119]) + in let <_10> = + [126|_9] + in let = + call %% Line 589 + 'io_lib':%% Line 589 + 'format' + (_10, %% Line 589 + [DescrTerm|[]]) + in let = + call %% Line 590 + 'string':%% Line 590 + 'length' + (%% Line 590 + Descr) + in let <_13> = + case <> of + %% Line 593 + <> + when call 'erlang':'>' + (DescrTry, + DescrWidth) -> + DescrTry + %% Line 594 + <> when 'true' -> + DescrWidth + end + in let <_15> = + call %% Line 596 + 'erlang':%% Line 596 + 'element' + (%% Line 596 + 4, %% Line 596 + H) + in let = + call %% Line 596 + 'string':%% Line 596 + 'length' + (_15) + in let <_17> = + case <> of + %% Line 599 + <> + when call 'erlang':'>' + (DateTry, + DateWidth) -> + DateTry + %% Line 600 + <> when 'true' -> + DateWidth + end + in let = + call %% Line 602 + 'erlang':%% Line 602 + 'setelement' + (%% Line 602 + 3, %% Line 602 + H, %% Line 602 + Descr) + in %% Line 603 + apply 'find_widths'/5 + (T, Modifier, _13, _17, [NewH|Data]) + ( <_24,_23,_22,_21,_20> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_24,_23,_22,_21,_20}) + -| [{'function_name',{'find_widths',5}}] ) + -| ['compiler_generated'] ) + end +'print_one_report'/6 = + %% Line 605 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + when 'true' -> + %% Line 608 + case <> of + %% Line 609 + <> + when call 'erlang':'=:=' + (WantedType, + 'all') -> + %% Line 610 + apply 'print_short_descr'/8 + (Fd, No, RealType, ShortDescr, Date, Width, %% Line 611 + DateWidth, %% Line 611 + Modifier) + %% Line 612 + <> + when call 'erlang':'==' + (WantedType, + RealType) -> + %% Line 613 + apply 'print_short_descr'/8 + (Fd, No, RealType, ShortDescr, Date, Width, %% Line 614 + DateWidth, %% Line 614 + Modifier) + %% Line 615 + <> when 'true' -> + 'ok' + end + ( <_11,_10,_9,_8,_7,_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_11,_10,_9,_8,_7,_6}) + -| [{'function_name',{'print_one_report',6}}] ) + -| ['compiler_generated'] ) + end +'print_short_descr'/8 = + %% Line 618 + fun (_0,_1,_2,_3,_4,_5,_6,_7) -> + let = + call %% Line 619 + 'lists':%% Line 619 + 'concat' + (%% Line 619 + [[126|[52|[119|[126|[50|[48]]]]]]|[_7|[[119|[32|[126]]]|[_5|[_7|[[115|[126]]|%% Line 620 + [_6|[[115|[126|[110]]]]]]]]]]]) + in %% Line 621 + call 'io':'format' + (_0, Format, [_1|[_2|[_3|[_4|[]]]]]) +'print_report_by_num'/6 = + %% Line 623 + fun (_0,_1,_2,_3,_4,_5) -> + %% Line 624 + case apply 'print_report'/6 + (_0, _1, _2, _3, _4, _5) of + <{_13,Device1}> when 'true' -> + %% Line 625 + Device1 + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end +'print_typed_reports'/6 = + %% Line 627 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + <_X_Dir,[],_X_Type,Device,_X_Abort,_X_Log> when 'true' -> + %% Line 628 + Device + %% Line 629 + when 'true' -> + let <_6> = + call %% Line 631 + 'erlang':%% Line 631 + 'hd' + (%% Line 631 + Data) + in let <_10> = + case %% Line 631 + call 'erlang':'element' + (2, _6) of + %% Line 632 + <_19> + when call 'erlang':'=:=' + (_19, + Type) -> + let <_7> = + call %% Line 633 + 'erlang':%% Line 633 + 'hd' + (%% Line 633 + Data) + in let <_8> = + call %% Line 633 + 'erlang':%% Line 633 + 'element' + (%% Line 633 + 1, _7) + in %% Line 633 + apply 'print_report'/6 + (Dir, Data, _8, Device, Abort, Log) + %% Line 634 + <_20> when 'true' -> + %% Line 635 + {'proceed',Device} + end + in %% Line 630 + case _10 of + <{Next,Device1}> when 'true' -> + %% Line 637 + case <> of + <> + when call 'erlang':'=:=' + (Next, + 'abort') -> + %% Line 638 + Device1 + %% Line 639 + <> when 'true' -> + let <_12> = + call %% Line 640 + 'erlang':%% Line 640 + 'tl' + (%% Line 640 + Data) + in %% Line 640 + apply 'print_typed_reports'/6 + (Dir, _12, Type, Device1, Abort, Log) + end + ( <_11> when 'true' -> + primop 'match_fail' + ({'badmatch',_11}) + -| ['compiler_generated'] ) + end + end +'print_all_reports'/5 = + %% Line 643 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + <_X_Dir,[],Device,_X_Abort,_X_Log> when 'true' -> + %% Line 644 + Device + %% Line 645 + when 'true' -> + let <_5> = + call %% Line 646 + 'erlang':%% Line 646 + 'hd' + (%% Line 646 + Data) + in let <_6> = + call %% Line 646 + 'erlang':%% Line 646 + 'element' + (%% Line 646 + 1, _5) + in %% Line 646 + case apply 'print_report'/6 + (Dir, Data, _6, %% Line 647 + Device, %% Line 647 + Abort, %% Line 647 + Log) of + <{Next,Device1}> when 'true' -> + %% Line 648 + case <> of + <> + when call 'erlang':'=:=' + (Next, + 'abort') -> + %% Line 649 + Device1 + %% Line 650 + <> when 'true' -> + let <_8> = + call %% Line 651 + 'erlang':%% Line 651 + 'tl' + (%% Line 651 + Data) + in %% Line 651 + apply 'print_all_reports'/5 + (Dir, _8, Device1, Abort, Log) + end + ( <_7> when 'true' -> + primop 'match_fail' + ({'badmatch',_7}) + -| ['compiler_generated'] ) + end + end +'print_report'/6 = + %% Line 654 + fun (_0,_1,_2,_3,_4,_5) -> + %% Line 655 + case apply 'find_report'/2 + (_1, _2) of + %% Line 656 + <{Fname,FilePosition}> when 'true' -> + let = + call %% Line 657 + 'lists':%% Line 657 + 'concat' + (%% Line 657 + [_0|[Fname|[]]]) + in %% Line 658 + case call 'file':'open' + (FileName, ['read']) of + %% Line 659 + <{'ok',Fd}> when 'true' -> + %% Line 660 + apply 'read_rep'/5 + (Fd, FilePosition, _3, _4, _5) + %% Line 661 + <_15> when 'true' -> + do %% Line 662 + call 'io':'format' + ([114|[98|[58|[32|[99|[97|[110|[39|[116|[32|[111|[112|[101|[110|[32|[102|[105|[108|[101|[32|[126|[116|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]], [Fname|[]]) + %% Line 663 + {'proceed',_3} + end + %% Line 665 + <'no_report'> when 'true' -> + %% Line 666 + {'proceed',_3} + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end +'find_report'/2 = + %% Line 669 + fun (_0,_1) -> + case <_0,_1> of + <[{No,_X_Type,_X_Descr,_X_Date,Fname,FilePosition}|_X_T],_4> + when call 'erlang':'=:=' + (_4, + No) -> + %% Line 670 + {Fname,FilePosition} + %% Line 671 + <[_X_H|T],No> when 'true' -> + %% Line 672 + apply 'find_report'/2 + (T, No) + %% Line 673 + <[],No> when 'true' -> + do %% Line 674 + call 'io':'format' + ([84|[104|[101|[114|[101|[32|[105|[115|[32|[110|[111|[32|[114|[101|[112|[111|[114|[116|[32|[119|[105|[116|[104|[32|[110|[117|[109|[98|[101|[114|[32|[126|[112|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [No|[]]) + %% Line 675 + 'no_report' + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'find_report',2}}] ) + -| ['compiler_generated'] ) + end +'print_grep_reports'/6 = + %% Line 677 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + <_X_Dir,[],_X_RegExp,Device,_X_Abort,_X_Log> when 'true' -> + %% Line 678 + Device + %% Line 679 + when 'true' -> + let <_6> = + call %% Line 680 + 'erlang':%% Line 680 + 'hd' + (%% Line 680 + Data) + in let <_7> = + call %% Line 680 + 'erlang':%% Line 680 + 'element' + (%% Line 680 + 1, _6) + in %% Line 680 + case apply 'print_grep_report'/7 + (Dir, Data, _7, %% Line 681 + Device, %% Line 681 + RegExp, %% Line 681 + Abort, %% Line 681 + Log) of + <{Next,Device1}> when 'true' -> + %% Line 682 + case <> of + <> + when call 'erlang':'=:=' + (Next, + 'abort') -> + %% Line 683 + Device1 + %% Line 684 + <> when 'true' -> + let <_9> = + call %% Line 685 + 'erlang':%% Line 685 + 'tl' + (%% Line 685 + Data) + in %% Line 685 + apply 'print_grep_reports'/6 + (Dir, _9, RegExp, Device1, Abort, Log) + end + ( <_8> when 'true' -> + primop 'match_fail' + ({'badmatch',_8}) + -| ['compiler_generated'] ) + end + end +'print_grep_report'/7 = + %% Line 688 + fun (_0,_1,_2,_3,_4,_5,_6) -> + %% Line 689 + case apply 'find_report'/2 + (_1, _2) of + <{Fname,FilePosition}> when 'true' -> + let = + call %% Line 690 + 'lists':%% Line 690 + 'concat' + (%% Line 690 + [_0|[Fname|[]]]) + in %% Line 691 + case call 'file':'open' + (FileName, ['read']) of + %% Line 692 + <{'ok',Fd}> + when call 'erlang':'is_pid' + (Fd) -> + %% Line 693 + apply 'check_rep'/7 + (Fd, FilePosition, _3, _4, _2, _5, _6) + %% Line 694 + <_17> when 'true' -> + do %% Line 695 + call 'io':'format' + ([114|[98|[58|[32|[99|[97|[110|[39|[116|[32|[111|[112|[101|[110|[32|[102|[105|[108|[101|[32|[126|[116|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]], [Fname|[]]) + %% Line 696 + {'proceed',_3} + end + ( <_7> when 'true' -> + primop 'match_fail' + ({'badmatch',_7}) + -| ['compiler_generated'] ) + end +'check_rep'/7 = + %% Line 699 + fun (_0,_1,_2,_3,_4,_5,_6) -> + %% Line 700 + case apply 'read_rep_msg'/2 + (_0, _1) of + %% Line 701 + <{Date,Msg}> when 'true' -> + let <_7> = + call %% Line 702 + 'io_lib':%% Line 702 + 'format' + (%% Line 702 + [126|[116|[112]]], %% Line 702 + [Msg|[]]) + in let = + call %% Line 702 + 'lists':%% Line 702 + 'flatten' + (_7) + in %% Line 703 + case apply 'run_re'/2 + (MsgStr, _3) of + %% Line 704 + <'match'> when 'true' -> + do %% Line 705 + call 'io':'format' + ([70|[111|[117|[110|[100|[32|[109|[97|[116|[99|[104|[32|[105|[110|[32|[114|[101|[112|[111|[114|[116|[32|[110|[117|[109|[98|[101|[114|[32|[126|[119|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [_4|[]]) + let <_9> = + catch + %% Line 706 + call 'rb_format_supp':'print' + (Date, Msg, _2) + in %% Line 706 + case _9 of + %% Line 707 + <{'EXIT',_20}> when 'true' -> + %% Line 708 + apply 'handle_bad_form'/5 + (Date, Msg, _2, _5, _6) + %% Line 709 + <_21> when 'true' -> + %% Line 710 + {'proceed',_2} + end + %% Line 712 + <_22> when 'true' -> + %% Line 713 + {'proceed',_2} + end + %% Line 715 + <_23> when 'true' -> + do %% Line 716 + call 'io':'format' + ([114|[98|[58|[32|[67|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[102|[114|[111|[109|[32|[102|[105|[108|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 717 + {'proceed',_2} + end +'run_re'/2 = + %% Line 720 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 721 + apply 'run_re'/3 + (Subject, Regexp, Options) + %% Line 722 + when 'true' -> + %% Line 723 + apply 'run_re'/3 + (Subject, Regexp, []) + end +'run_re'/3 = + %% Line 725 + fun (_0,_1,_2) -> + let <_3> = + call %% Line 726 + 'erlang':%% Line 726 + '--' + (_2, %% Line 726 + ['unicode']) + in %% Line 726 + case call 're':'run' + (_0, _1, ['unicode'|_3]) of + %% Line 727 + <'nomatch'> when 'true' -> + %% Line 728 + 'nomatch' + %% Line 729 + <_8> when 'true' -> + %% Line 730 + 'match' + end +'filter_all_reports'/6 = + %% Line 733 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + <_X_Dir,[],_X_Filters,Device,_X_Abort,_X_Log> when 'true' -> + %% Line 734 + Device + %% Line 735 + when 'true' -> + let <_6> = + call %% Line 736 + 'erlang':%% Line 736 + 'hd' + (%% Line 736 + Data) + in let <_7> = + call %% Line 736 + 'erlang':%% Line 736 + 'element' + (%% Line 736 + 1, _6) + in %% Line 736 + case apply 'filter_report'/7 + (Dir, Data, Filters, _7, %% Line 737 + Device, %% Line 737 + Abort, %% Line 737 + Log) of + <{Next,Device1}> when 'true' -> + %% Line 738 + case <> of + <> + when call 'erlang':'=:=' + (Next, + 'abort') -> + %% Line 739 + Device1 + %% Line 740 + <> when 'true' -> + let <_9> = + call %% Line 741 + 'erlang':%% Line 741 + 'tl' + (%% Line 741 + Data) + in %% Line 741 + apply 'filter_all_reports'/6 + (Dir, _9, Filters, Device1, Abort, Log) + end + ( <_8> when 'true' -> + primop 'match_fail' + ({'badmatch',_8}) + -| ['compiler_generated'] ) + end + end +'filter_report'/7 = + %% Line 744 + fun (_0,_1,_2,_3,_4,_5,_6) -> + %% Line 745 + case apply 'find_report'/2 + (_1, _3) of + %% Line 746 + <{Fname,FilePosition}> when 'true' -> + let = + call %% Line 747 + 'lists':%% Line 747 + 'concat' + (%% Line 747 + [_0|[Fname|[]]]) + in %% Line 748 + case call 'file':'open' + (FileName, ['read']) of + %% Line 749 + <{'ok',Fd}> when 'true' -> + %% Line 750 + apply 'filter_rep'/6 + (_2, Fd, FilePosition, _4, _5, _6) + %% Line 751 + <_17> when 'true' -> + do %% Line 752 + call 'io':'format' + ([114|[98|[58|[32|[99|[97|[110|[39|[116|[32|[111|[112|[101|[110|[32|[102|[105|[108|[101|[32|[126|[116|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]], [Fname|[]]) + %% Line 753 + {'proceed',_4} + end + %% Line 755 + <'no_report'> when 'true' -> + %% Line 756 + {'proceed',_4} + ( <_9> when 'true' -> + primop 'match_fail' + ({'case_clause',_9}) + -| ['compiler_generated'] ) + end +'filter_rep'/6 = + %% Line 759 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + <{Filters,FDates},Fd,FilePosition,Device,Abort,Log> when 'true' -> + let = + apply %% Line 760 + 'read_rep_msg'/2 + (%% Line 760 + Fd, %% Line 760 + FilePosition) + in %% Line 761 + case RepMsg of + %% Line 762 + <{_X_DateStr,{Date,_X_Msg}}> when 'true' -> + %% Line 763 + case apply 'compare_dates'/2 + (Date, FDates) of + %% Line 764 + <'true'> when 'true' -> + %% Line 765 + apply 'print_filter_report'/5 + (RepMsg, Filters, Device, Abort, Log) + %% Line 766 + <_17> when 'true' -> + %% Line 767 + {'proceed',Device} + end + %% Line 769 + <_18> when 'true' -> + do %% Line 770 + call 'io':'format' + ([114|[98|[58|[32|[67|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[102|[114|[111|[109|[32|[102|[105|[108|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 771 + {'proceed',Device} + end + %% Line 773 + when 'true' -> + %% Line 775 + case apply 'read_rep_msg'/2 + (Fd, FilePosition) of + %% Line 776 + <_@r0 = {Date,Msg}> when 'true' -> + %% Line 777 + apply 'print_filter_report'/5 + (_@r0, Filters, Device, Abort, Log) + %% Line 778 + <_19> when 'true' -> + do %% Line 779 + call 'io':'format' + ([114|[98|[58|[32|[67|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[102|[114|[111|[109|[32|[102|[105|[108|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 780 + {'proceed',Device} + end + end +'filter_report'/2 = + %% Line 783 + fun (_0,_1) -> + case <_0,_1> of + <[],_X_Msg> when 'true' -> + %% Line 784 + 'true' + %% Line 785 + <[{Key,Value}|T],Msg> when 'true' -> + %% Line 786 + case call 'proplists':'get_value' + (Key, Msg) of + %% Line 787 + <_14> + when call 'erlang':'=:=' + (_14, + Value) -> + %% Line 788 + apply 'filter_report'/2 + (T, Msg) + %% Line 789 + <_15> when 'true' -> + %% Line 790 + 'false' + end + %% Line 792 + <[{Key,Value,'no'}|T],Msg> when 'true' -> + %% Line 793 + case call 'proplists':'get_value' + (Key, Msg) of + %% Line 794 + <_16> + when call 'erlang':'=:=' + (_16, + Value) -> + %% Line 795 + 'false' + %% Line 796 + <_17> when 'true' -> + %% Line 797 + apply 'filter_report'/2 + (T, Msg) + end + %% Line 799 + <[{Key,RegExp,'re'}|T],Msg> when 'true' -> + %% Line 800 + case call 'proplists':'get_value' + (Key, Msg) of + %% Line 801 + <'undefined'> when 'true' -> + %% Line 802 + 'false' + %% Line 803 + when 'true' -> + let <_4> = + call %% Line 804 + 'io_lib':%% Line 804 + 'format' + (%% Line 804 + [126|[116|[112]]], %% Line 804 + [Value|[]]) + in let = + call %% Line 804 + 'lists':%% Line 804 + 'flatten' + (_4) + in %% Line 805 + case apply 'run_re'/2 + (Subject, RegExp) of + %% Line 806 + <'match'> when 'true' -> + %% Line 807 + apply 'filter_report'/2 + (T, Msg) + %% Line 808 + <_18> when 'true' -> + 'false' + end + end + %% Line 811 + <[{Key,RegExp,'re','no'}|T],Msg> when 'true' -> + %% Line 812 + case call 'proplists':'get_value' + (Key, Msg) of + %% Line 813 + <'undefined'> when 'true' -> + %% Line 814 + 'true' + %% Line 815 + when 'true' -> + let <_8> = + call %% Line 816 + 'io_lib':%% Line 816 + 'format' + (%% Line 816 + [126|[116|[112]]], %% Line 816 + [Value|[]]) + in let = + call %% Line 816 + 'lists':%% Line 816 + 'flatten' + (_8) + in %% Line 817 + case apply 'run_re'/2 + (Subject, RegExp) of + %% Line 818 + <'match'> when 'true' -> + 'false' + %% Line 819 + <_19> when 'true' -> + apply 'filter_report'/2 + (T, Msg) + end + end + ( <_13,_12> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_13,_12}) + -| [{'function_name',{'filter_report',2}}] ) + -| ['compiler_generated'] ) + end +'get_compare_dates'/2 = + %% Line 823 + fun (_0,_1) -> + %% Line 824 + case call 'application':'get_env' + ('sasl', 'utc_log') of + %% Line 825 + <{'ok','true'}> when 'true' -> + let <_3> = + apply %% Line 826 + 'local_time_to_universal_time'/1 + (_0) + in let <_2> = + apply %% Line 827 + 'local_time_to_universal_time'/1 + (_1) + in %% Line 826 + {_3,_2} + %% Line 828 + <_7> when 'true' -> + %% Line 829 + {_0,_1} + end +'get_compare_dates'/3 = + %% Line 831 + fun (_0,_1,_2) -> + %% Line 832 + case call 'application':'get_env' + ('sasl', 'utc_log') of + %% Line 833 + <{'ok','true'}> when 'true' -> + let <_5> = + apply %% Line 834 + 'local_time_to_universal_time'/1 + (_0) + in let <_4> = + apply %% Line 835 + 'local_time_to_universal_time'/1 + (_1) + in let <_3> = + apply %% Line 836 + 'local_time_to_universal_time'/1 + (_2) + in %% Line 834 + {_5,_4,_3} + %% Line 837 + <_10> when 'true' -> + %% Line 838 + {_0,_1,_2} + end +'compare_dates'/2 = + %% Line 841 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 842 + case apply 'get_compare_dates'/2 + (Date, CompareDate) of + <{Date2,DateFrom}> when 'true' -> + let <_4> = + call %% Line 843 + 'calendar':%% Line 843 + 'datetime_to_gregorian_seconds' + (%% Line 843 + Date2) + in let <_3> = + call %% Line 844 + 'calendar':%% Line 844 + 'datetime_to_gregorian_seconds' + (%% Line 844 + DateFrom) + in %% Line 843 + call 'erlang':'>=' + (_4, _3) + ( <_2> when 'true' -> + primop 'match_fail' + ({'badmatch',_2}) + -| ['compiler_generated'] ) + end + %% Line 845 + when 'true' -> + %% Line 846 + case apply 'get_compare_dates'/2 + (Date, CompareDate) of + <{Date2,DateTo}> when 'true' -> + let <_7> = + call %% Line 847 + 'calendar':%% Line 847 + 'datetime_to_gregorian_seconds' + (%% Line 847 + Date2) + in let <_6> = + call %% Line 848 + 'calendar':%% Line 848 + 'datetime_to_gregorian_seconds' + (%% Line 848 + DateTo) + in %% Line 847 + call 'erlang':'=<' + (_7, _6) + ( <_5> when 'true' -> + primop 'match_fail' + ({'badmatch',_5}) + -| ['compiler_generated'] ) + end + %% Line 849 + when 'true' -> + %% Line 850 + case apply 'get_compare_dates'/3 + (Date, From, To) of + <{Date2,DateFrom,DateTo}> when 'true' -> + let <_11> = + call %% Line 851 + 'calendar':%% Line 851 + 'datetime_to_gregorian_seconds' + (%% Line 851 + Date2) + in let <_10> = + call %% Line 852 + 'calendar':%% Line 852 + 'datetime_to_gregorian_seconds' + (%% Line 852 + DateFrom) + in %% Line 853 + ( case <> of + ( <> + when call 'erlang':'>=' + (_11, + _10) -> + let <_13> = + call %% Line 854 + 'calendar':%% Line 854 + 'datetime_to_gregorian_seconds' + (%% Line 854 + Date2) + in let <_12> = + call %% Line 855 + 'calendar':%% Line 855 + 'datetime_to_gregorian_seconds' + (%% Line 855 + DateTo) + in %% Line 854 + call 'erlang':'=<' + (_13, _12) + -| ['compiler_generated'] ) + ( <> when 'true' -> + 'false' + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_8> when 'true' -> + primop 'match_fail' + ({'badmatch',_8}) + -| ['compiler_generated'] ) + end + ( <_16,_15> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_16,_15}) + -| [{'function_name',{'compare_dates',2}}] ) + -| ['compiler_generated'] ) + end +'print_filter_report'/5 = + %% Line 857 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + <{Date,Msg},Filters,Device,Abort,Log> when 'true' -> + %% Line 858 + case Msg of + <{_X_D,M}> when 'true' -> + %% Line 859 + case M of + <{_16,_17,M2}> when 'true' -> + %% Line 860 + case M2 of + %% Line 861 + <{_18,_19,Report}> when 'true' -> + %% Line 862 + case apply 'filter_report'/2 + (Filters, Report) of + %% Line 863 + <'true'> when 'true' -> + let <_7> = + catch + %% Line 864 + call 'rb_format_supp':'print' + (Date, Msg, Device) + in %% Line 864 + case _7 of + %% Line 865 + <{'EXIT',_20}> when 'true' -> + %% Line 866 + apply 'handle_bad_form'/5 + (Date, Msg, Device, Abort, Log) + %% Line 867 + <_21> when 'true' -> + %% Line 868 + {'proceed',Device} + end + %% Line 870 + <_22> when 'true' -> + %% Line 871 + {'proceed',Device} + end + %% Line 873 + <_23> when 'true' -> + %% Line 874 + {'proceed',Device} + end + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end + ( <_5> when 'true' -> + primop 'match_fail' + ({'badmatch',_5}) + -| ['compiler_generated'] ) + end + ( <_15,_14,_13,_12,_11> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_15,_14,_13,_12,_11}) + -| [{'function_name',{'print_filter_report',5}}] ) + -| ['compiler_generated'] ) + end +'read_rep'/5 = + %% Line 877 + fun (_0,_1,_2,_3,_4) -> + %% Line 878 + case apply 'read_rep_msg'/2 + (_0, _1) of + %% Line 879 + <{Date,Msg}> when 'true' -> + let <_5> = + catch + %% Line 880 + call 'rb_format_supp':'print' + (Date, Msg, _2) + in %% Line 880 + case _5 of + %% Line 881 + <{'EXIT',_13}> when 'true' -> + %% Line 882 + apply 'handle_bad_form'/5 + (Date, Msg, _2, _3, _4) + %% Line 883 + <_14> when 'true' -> + %% Line 884 + {'proceed',_2} + end + %% Line 886 + <_15> when 'true' -> + do %% Line 887 + call 'io':'format' + ([114|[98|[58|[32|[67|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[102|[114|[111|[109|[32|[102|[105|[108|[101|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 888 + {'proceed',_2} + end +'handle_bad_form'/5 = + %% Line 891 + fun (_0,_1,_2,_3,_4) -> + do %% Line 892 + call 'io':'format' + ([114|[98|[58|[32|[69|[82|[82|[79|[82|[33|[32|[65|[32|[114|[101|[112|[111|[114|[116|[32|[111|[110|[32|[98|[97|[100|[32|[102|[111|[114|[109|[32|[119|[97|[115|[32|[101|[110|[99|[111|[117|[110|[116|[101|[114|[101|[100|[46|[32|[73|[116|[32|[99|[97|[110|[110|[111|[116|[32|[98|[101|[32|[112|[114|[105|[110|[116|[101|[100|[32|[116|[111|[32|[116|[104|[101|[32|[108|[111|[103|[46|[126|[110|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + do %% Line 894 + call 'io':'format' + ([68|[101|[116|[97|[105|[108|[115|[58|[126|[110|[126|[112|[32|[126|[116|[112|[126|[110|[126|[110]]]]]]]]]]]]]]]]]]]], [_0|[_1|[]]]) + let <_6> = + apply %% Line 895 + 'open_log_file'/1 + (_4) + in %% Line 895 + case <_3,_2,_6> of + %% Line 896 + <'true','standard_io','standard_io'> when 'true' -> + do %% Line 897 + call 'io':'format' + ([114|[98|[58|[32|[76|[111|[103|[103|[105|[110|[103|[32|[97|[98|[111|[114|[116|[101|[100|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]) + %% Line 898 + {'abort',_2} + %% Line 899 + <'false','standard_io','standard_io'> when 'true' -> + do %% Line 900 + call 'io':'format' + ([114|[98|[58|[32|[76|[111|[103|[103|[105|[110|[103|[32|[114|[101|[115|[117|[109|[101|[100|[46|[46|[46|[126|[110|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 901 + {'proceed',_2} + %% Line 902 + <_18,_19,( 'standard_io' + -| ['compiler_generated'] )> when 'true' -> + do %% Line 903 + call 'io':'format' + ([114|[98|[58|[32|[67|[97|[110|[32|[110|[111|[116|[32|[114|[101|[111|[112|[101|[110|[32|[126|[116|[112|[46|[32|[76|[111|[103|[103|[105|[110|[103|[32|[97|[98|[111|[114|[116|[101|[100|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [_4|[]]) + %% Line 904 + {'abort',_2} + %% Line 905 + <( 'true' + -| ['compiler_generated'] ),_20,NewDevice> when 'true' -> + do %% Line 906 + call 'io':'format' + (NewDevice, %% Line 907 + [126|[110|[126|[110|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[32|[82|[66|[32|[69|[82|[82|[79|[82|[32|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[126|[110|[65|[32|[114|[101|[112|[111|[114|[116|[32|[111|[110|[32|[98|[97|[100|[32|[102|[111|[114|[109|[32|[119|[97|[115|[32|[101|[110|[99|[111|[117|[110|[116|[101|[114|[101|[100|[32|[104|[101|[114|[101|[32|[97|[110|[100|[32|[116|[104|[101|[32|[108|[111|[103|[103|[105|[110|[103|[126|[110|[112|[114|[111|[99|[101|[115|[115|[32|[119|[97|[115|[32|[97|[98|[111|[114|[116|[101|[100|[46|[32|[78|[111|[116|[101|[32|[116|[104|[97|[116|[32|[116|[104|[101|[114|[101|[32|[109|[97|[121|[32|[119|[101|[108|[108|[32|[98|[101|[32|[114|[101|[109|[97|[105|[110|[105|[110|[103|[126|[110|[114|[101|[112|[111|[114|[116|[115|[32|[116|[104|[97|[116|[32|[104|[97|[118|[101|[110|[39|[116|[32|[121|[101|[116|[32|[98|[101|[101|[110|[32|[108|[111|[103|[103|[101|[100|[46|[32|[80|[108|[101|[97|[115|[101|[32|[115|[101|[101|[32|[116|[104|[101|[32|[114|[98|[126|[110|[109|[97|[110|[117|[97|[108|[32|[102|[111|[114|[32|[109|[111|[114|[101|[32|[105|[110|[102|[111|[46|[126|[110|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[42|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 912 + []) + do %% Line 913 + call 'io':'format' + ([114|[98|[58|[32|[76|[111|[103|[103|[105|[110|[103|[32|[97|[98|[111|[114|[116|[101|[100|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]) + %% Line 914 + {'abort',NewDevice} + %% Line 915 + <( 'false' + -| ['compiler_generated'] ),_21,NewDevice> when 'true' -> + do %% Line 916 + call 'io':'format' + (NewDevice, %% Line 917 + [126|[110|[32|[32|[32|[42|[42|[42|[42|[42|[42|[42|[42|[42|[32|[82|[66|[58|[32|[85|[78|[80|[82|[73|[78|[84|[65|[66|[76|[69|[32|[82|[69|[80|[79|[82|[84|[32|[42|[42|[42|[42|[42|[42|[42|[42|[126|[110|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 917 + []) + do %% Line 918 + call 'io':'format' + ([114|[98|[58|[32|[76|[111|[103|[103|[105|[110|[103|[32|[114|[101|[115|[117|[109|[101|[100|[46|[46|[46|[126|[110|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]) + %% Line 919 + {'proceed',NewDevice} + ( <( _22 + -| ['compiler_generated'] ),( _23 + -| ['compiler_generated'] ),( _24 + -| ['compiler_generated'] )> when 'true' -> + let <_12> = {( _22 + -| ['compiler_generated'] ),( _23 + -| ['compiler_generated'] ),( _24 + -| ['compiler_generated'] )} + in primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end +'read_rep_msg'/2 = + %% Line 922 + fun (_0,_1) -> + %% Line 923 + case call 'file':'position' + (_0, {'bof',_1}) of + <{'ok',_11}> when 'true' -> + let <_3> = + catch + %% Line 925 + apply 'read_report'/1 + (_0) + in let <_6> = + case _3 of + %% Line 926 + <{'ok',Report}> when 'true' -> + %% Line 927 + case apply 'get_short_descr'/1 + (Report) of + <{_X_ShortDescr,Date}> when 'true' -> + %% Line 928 + {Date,Report} + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end + %% Line 929 + <_12> when 'true' -> + 'error' + end + in %% Line 931 + case call 'file':'close' + (_0) of + <'ok'> when 'true' -> + _6 + ( <_8> when 'true' -> + primop 'match_fail' + ({'badmatch',_8}) + -| ['compiler_generated'] ) + end + ( <_2> when 'true' -> + primop 'match_fail' + ({'badmatch',_2}) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('rb') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('rb', _0) +end \ No newline at end of file diff --git a/test/data/sasl/rb_format_supp.core b/test/data/sasl/rb_format_supp.core new file mode 100644 index 0000000..37d3cd2 --- /dev/null +++ b/test/data/sasl/rb_format_supp.core @@ -0,0 +1,379 @@ +module 'rb_format_supp' ['module_info'/0, + 'module_info'/1, + 'print'/3] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[114|[98|[95|[102|[111|[114|[109|[97|[116|[95|[115|[117|[112|[112|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]],1}]] +'print'/3 = + %% Line 29 + fun (_0,_1,_2) -> + %% Line 35 + case _1 of + <{_X_Time,Rep}> when 'true' -> + %% Line 36 + case Rep of + %% Line 37 + <{'error_report',_X_GL,{Pid,'crash_report',CrashReport}}> when 'true' -> + let
= + apply %% Line 38 + 'format_h'/4 + (79, %% Line 38 + [67|[82|[65|[83|[72|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]], %% Line 38 + Pid, _0) + in let <_6> = + apply %% Line 42 + 'format_c'/1 + (%% Line 42 + CrashReport) + in do %% Line 39 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 41 + [{'header',Header}|_6]) + %% Line 43 + 'true' + %% Line 44 + <{'error_report',_X_GL,{Pid,'supervisor_report',SupReport}}> when 'true' -> + let
= + apply %% Line 45 + 'format_h'/4 + (79, %% Line 45 + [83|[85|[80|[69|[82|[86|[73|[83|[79|[82|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]]]]]]], %% Line 45 + Pid, _0) + in let <_8> = + apply %% Line 49 + 'format_s'/1 + (%% Line 49 + SupReport) + in do %% Line 46 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 48 + [{'header',Header}|_8]) + %% Line 50 + 'true' + %% Line 51 + <{'error_report',_X_GL,{Pid,_X_Type,Report1}}> when 'true' -> + let
= + apply %% Line 52 + 'format_h'/4 + (79, %% Line 52 + [69|[82|[82|[79|[82|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]], %% Line 52 + Pid, _0) + in do %% Line 53 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 55 + [{'header',Header}|%% Line 56 + [{'data',Report1}|[]]]) + %% Line 57 + 'true' + %% Line 58 + <{'info_report',_X_GL,{Pid,'progress',SupProgress}}> when 'true' -> + let
= + apply %% Line 59 + 'format_h'/4 + (79, %% Line 59 + [80|[82|[79|[71|[82|[69|[83|[83|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]]]]], %% Line 59 + Pid, _0) + in let <_11> = + apply %% Line 63 + 'format_p'/1 + (%% Line 63 + SupProgress) + in %% Line 60 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 62 + [{'header',Header}|_11]) + %% Line 64 + <{'info_report',_X_GL,{Pid,_X_Type,Report1}}> when 'true' -> + let
= + apply %% Line 65 + 'format_h'/4 + (79, %% Line 65 + [73|[78|[70|[79|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]], %% Line 65 + Pid, _0) + in do %% Line 66 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 68 + [{'header',Header}|%% Line 69 + [{'data',Report1}|[]]]) + %% Line 70 + 'true' + %% Line 71 + <{'warning_report',_X_GL,{Pid,_X_Type,Report1}}> when 'true' -> + let
= + apply %% Line 72 + 'format_h'/4 + (79, %% Line 72 + [87|[65|[82|[78|[73|[78|[71|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]]]], %% Line 72 + Pid, _0) + in do %% Line 73 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 75 + [{'header',Header}|%% Line 76 + [{'data',Report1}|[]]]) + %% Line 77 + 'true' + %% Line 78 + <{'error',_X_GL,{Pid,Format,Args}}> when 'true' -> + let
= + apply %% Line 79 + 'format_h'/4 + (79, %% Line 79 + [69|[82|[82|[79|[82|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]], %% Line 79 + Pid, _0) + in do %% Line 80 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 82 + [{'header',Header}|[]]) + %% Line 83 + call 'io':'format' + (_2, Format, Args) + %% Line 84 + <{'info_msg',_X_GL,{Pid,Format,Args}}> when 'true' -> + let
= + apply %% Line 85 + 'format_h'/4 + (79, %% Line 85 + [73|[78|[70|[79|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]], %% Line 85 + Pid, _0) + in do %% Line 86 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 88 + [{'header',Header}|[]]) + %% Line 89 + call 'io':'format' + (_2, Format, Args) + %% Line 90 + <{'warning_msg',_X_GL,{Pid,Format,Args}}> when 'true' -> + let
= + apply %% Line 91 + 'format_h'/4 + (79, %% Line 91 + [87|[65|[82|[78|[73|[78|[71|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]]]], %% Line 91 + Pid, _0) + in do %% Line 92 + call 'format_lib_supp':'print_info' + (_2, 79, %% Line 94 + [{'header',Header}|[]]) + %% Line 95 + call 'io':'format' + (_2, Format, Args) + %% Line 96 + <{Type,_X_GL,TypeReport}> when 'true' -> + let = + call %% Line 97 + 'misc_supp':%% Line 97 + 'modifier' + (_2) + in let <_18> = + call %% Line 98 + 'erlang':%% Line 98 + '++' + (%% Line 98 + Modifier, %% Line 98 + [119|[62|[32|[126|[115|[126|[110]]]]]]]) + in let <_19> = + call %% Line 98 + 'erlang':%% Line 98 + '++' + (%% Line 98 + [126|[110|[73|[110|[102|[111|[32|[116|[121|[112|[101|[32|[60|[126]]]]]]]]]]]]]], _18) + in do %% Line 98 + call 'io':'format' + (_2, _19, %% Line 99 + [Type|[_0|[]]]) + let <_20> = + call %% Line 100 + 'erlang':%% Line 100 + '++' + (%% Line 100 + Modifier, %% Line 100 + [112]) + in let <_21> = + [126|_20] + in %% Line 100 + call 'io':'format' + (_2, _21, [TypeReport|[]]) + %% Line 101 + <_29> when 'true' -> + let = + call %% Line 102 + 'misc_supp':%% Line 102 + 'modifier' + (_2) + in do %% Line 103 + call 'io':'format' + ([126|[110|[80|[114|[105|[110|[116|[105|[110|[103|[32|[105|[110|[102|[111|[32|[111|[102|[32|[117|[110|[107|[110|[111|[119|[110|[32|[116|[121|[112|[101|[46|[46|[46|[32|[126|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 104 + [_0|[]]) + let <_23> = + call %% Line 105 + 'erlang':%% Line 105 + '++' + (%% Line 105 + Modifier, %% Line 105 + [112]) + in let <_24> = + [126|_23] + in %% Line 105 + call 'io':'format' + (_2, _24, [_1|[]]) + end + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end +'format_h'/4 = + %% Line 109 + fun (_0,_1,_2,_3) -> + let <_4> = + call %% Line 110 + 'io_lib':%% Line 110 + 'format' + (%% Line 110 + [126|[115|[32|[32|[126|[119]]]]]], %% Line 110 + [_1|[_2|[]]]) + in let = + call %% Line 110 + 'lists':%% Line 110 + 'flatten' + (_4) + in let = + call %% Line 111 + 'string':%% Line 111 + 'length' + (_3) + in let = + call %% Line 112 + 'erlang':%% Line 112 + '-' + (_0, %% Line 112 + DateLen) + in let = + call %% Line 113 + 'lists':%% Line 113 + 'concat' + (%% Line 113 + [[126|[45]]|[HeaderLen|[[115|[126]]|[DateLen|[[115]]]]]]) + in %% Line 114 + call 'io_lib':'format' + (Format, [NHeader|[_3|[]]]) +'format_c'/1 = + %% Line 120 + fun (_0) -> + case _0 of + <[OwnReport|[LinkReport|[]]]> when 'true' -> + let <_1> = + apply %% Line 122 + 'format_neighbours'/1 + (%% Line 122 + LinkReport) + in %% Line 121 + [{'items',{[67|[114|[97|[115|[104|[105|[110|[103|[32|[112|[114|[111|[99|[101|[115|[115]]]]]]]]]]]]]]]],OwnReport}}|%% Line 122 + [_1|[]]] + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'format_c',1}}] ) + -| ['compiler_generated'] ) + end +'format_neighbours'/1 = + %% Line 124 + fun (_0) -> + case _0 of + <[Data|Rest]> when 'true' -> + let <_1> = + apply %% Line 127 + 'format_neighbours'/1 + (%% Line 127 + Rest) + in %% Line 125 + [{'newline',1}|%% Line 126 + [{'items',{[78|[101|[105|[103|[104|[98|[111|[117|[114|[32|[112|[114|[111|[99|[101|[115|[115]]]]]]]]]]]]]]]]],Data}}|_1]] + %% Line 128 + <[]> when 'true' -> + [] + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'format_neighbours',1}}] ) + -| ['compiler_generated'] ) + end +'format_s'/1 = + %% Line 133 + fun (_0) -> + let = + apply %% Line 134 + 'get_opt'/2 + (%% Line 134 + 'supervisor', _0) + in let = + apply %% Line 135 + 'get_opt'/2 + (%% Line 135 + 'errorContext', _0) + in let = + apply %% Line 136 + 'get_opt'/2 + (%% Line 136 + 'reason', _0) + in let = + apply %% Line 137 + 'get_opt'/2 + (%% Line 137 + 'offender', _0) + in let <_7> = + fun (_5) -> + %% Line 143 + apply 'transform_mfa'/1 + (_5) + in let <_8> = + call %% Line 143 + 'lists':%% Line 143 + 'map' + (_7, %% Line 143 + ChildInfo) + in %% Line 138 + [{'data',[{[82|[101|[112|[111|[114|[116|[105|[110|[103|[32|[115|[117|[112|[101|[114|[118|[105|[115|[111|[114]]]]]]]]]]]]]]]]]]]],SuperName}|[]]}|%% Line 139 + [{'newline',1}|%% Line 140 + [{'items',{[67|[104|[105|[108|[100|[32|[112|[114|[111|[99|[101|[115|[115]]]]]]]]]]]]],%% Line 141 + [{'errorContext',ErrorContext}|%% Line 142 + [{'reason',Reason}|_8]]}}|%% Line 143 + []]]] +'transform_mfa'/1 = + %% Line 145 + fun (_0) -> + case _0 of + <{'mfa',Value}> when 'true' -> + {'start_function',Value} + %% Line 146 + when 'true' -> + X + end +'format_p'/1 = + %% Line 151 + fun (_0) -> + %% Line 152 + [{'data',_0}|[]] +'get_opt'/2 = + %% Line 154 + fun (_0,_1) -> + %% Line 155 + case call 'lists':'keysearch' + (_0, 1, _1) of + %% Line 156 + <{'value',{_X_Key,Val}}> when 'true' -> + Val + %% Line 157 + <_5> when 'true' -> + 'undefined' + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('rb_format_supp') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('rb_format_supp', _0) +end \ No newline at end of file diff --git a/test/data/sasl/release_handler.core b/test/data/sasl/release_handler.core new file mode 100644 index 0000000..c288aa6 --- /dev/null +++ b/test/data/sasl/release_handler.core @@ -0,0 +1,6761 @@ +module 'release_handler' ['check_install_release'/1, + 'check_install_release'/2, + 'code_change'/3, + 'create_RELEASES'/1, + 'create_RELEASES'/2, + 'create_RELEASES'/4, + 'do_copy_file'/2, + 'do_copy_files'/1, + 'do_copy_files'/2, + 'do_ensure_RELEASES'/1, + 'do_remove_files'/1, + 'do_rename_files'/1, + 'do_write_file'/2, + 'do_write_file'/3, + 'do_write_release'/3, + 'downgrade_app'/2, + 'downgrade_app'/3, + 'downgrade_script'/3, + 'eval_appup_script'/4, + 'handle_call'/3, + 'handle_cast'/2, + 'handle_info'/2, + 'init'/1, + 'install_file'/2, + 'install_release'/1, + 'install_release'/2, + 'make_permanent'/1, + 'module_info'/0, + 'module_info'/1, + 'new_emulator_upgrade'/2, + 'reboot_old_release'/1, + 'remove_file'/1, + 'remove_release'/1, + 'set_removed'/1, + 'set_unpacked'/2, + 'start_link'/0, + 'terminate'/2, + 'unpack_release'/1, + 'upgrade_app'/2, + 'upgrade_script'/2, + 'which_releases'/0, + 'which_releases'/1] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 21 + 'behaviour' = + %% Line 21 + ['gen_server'], + %% Line 1 + 'file' = + %% Line 1 + [{[47|[117|[115|[114|[47|[108|[111|[99|[97|[108|[47|[67|[101|[108|[108|[97|[114|[47|[101|[114|[108|[97|[110|[103|[47|[50|[50|[46|[50|[47|[108|[105|[98|[47|[101|[114|[108|[97|[110|[103|[47|[108|[105|[98|[47|[107|[101|[114|[110|[101|[108|[45|[54|[46|[53|[46|[49|[47|[105|[110|[99|[108|[117|[100|[101|[47|[102|[105|[108|[101|[46|[104|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 25 + 'record' = + %% Line 25 + [{'file_info',[{'typed_record_field',{'record_field',26,{'atom',26,'size'}},{'type',26,'union',[{'type',26,'non_neg_integer',[]}|[{'atom',26,'undefined'}]]}}|[{'typed_record_field',{'record_field',27,{'atom',27,'type'}},{'type',27,'union',[{'atom',27,'device'}|[{'atom',27,'directory'}|[{'atom',27,'other'}|[{'atom',27,'regular'}|[{'atom',27,'symlink'}|[{'atom',28,'undefined'}]]]]]]}}|[{'typed_record_field',{'record_field',29,{'atom',29,'access'}},{'type',29,'union',[{'atom',29,'read'}|[{'atom',29,'write'}|[{'atom',29,'read_write'}|[{'atom',29,'none'}|[{'atom',29,'undefined'}]]]]]}}|[{'typed_record_field',{'record_field',30,{'atom',30,'atime'}},{'type',30,'union',[{'remote_type',30,[{'atom',30,'file'}|[{'atom',30,'date_time'}|[[]]]]}|[{'type',30,'non_neg_integer',[]}|[{'atom',30,'undefined'}]]]}}|[{'typed_record_field',{'record_field',34,{'atom',34,'mtime'}},{'type',34,'union',[{'remote_type',34,[{'atom',34,'file'}|[{'atom',34,'date_time'}|[[]]]]}|[{'type',34,'non_neg_integer',[]}|[{'atom',34,'undefined'}]]]}}|[{'typed_record_field',{'record_field',36,{'atom',36,'ctime'}},{'type',36,'union',[{'remote_type',36,[{'atom',36,'file'}|[{'atom',36,'date_time'}|[[]]]]}|[{'type',36,'non_neg_integer',[]}|[{'atom',36,'undefined'}]]]}}|[{'typed_record_field',{'record_field',42,{'atom',42,'mode'}},{'type',42,'union',[{'type',42,'non_neg_integer',[]}|[{'atom',42,'undefined'}]]}}|[{'typed_record_field',{'record_field',46,{'atom',46,'links'}},{'type',46,'union',[{'type',46,'non_neg_integer',[]}|[{'atom',46,'undefined'}]]}}|[{'typed_record_field',{'record_field',49,{'atom',49,'major_device'}},{'type',49,'union',[{'type',49,'non_neg_integer',[]}|[{'atom',49,'undefined'}]]}}|[{'typed_record_field',{'record_field',55,{'atom',55,'minor_device'}},{'type',55,'union',[{'type',55,'non_neg_integer',[]}|[{'atom',55,'undefined'}]]}}|[{'typed_record_field',{'record_field',57,{'atom',57,'inode'}},{'type',57,'union',[{'type',57,'non_neg_integer',[]}|[{'atom',57,'undefined'}]]}}|[{'typed_record_field',{'record_field',58,{'atom',58,'uid'}},{'type',58,'union',[{'type',58,'non_neg_integer',[]}|[{'atom',58,'undefined'}]]}}|[{'typed_record_field',{'record_field',59,{'atom',59,'gid'}},{'type',59,'union',[{'type',59,'non_neg_integer',[]}|[{'atom',59,'undefined'}]]}}]]]]]]]]]]]]]}], + %% Line 62 + 'record' = + %% Line 62 + [{'file_descriptor',[{'typed_record_field',{'record_field',63,{'atom',63,'module'}},{'type',63,'module',[]}}|[{'typed_record_field',{'record_field',64,{'atom',64,'data'}},{'type',64,'term',[]}}]]}], + %% Line 24 + 'file' = + %% Line 24 + [{[115|[114|[99|[47|[114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]]],24}], + %% Line 48 + 'record' = + %% Line 48 + [{'state',[{'record_field',48,{'atom',48,'unpurged'},{'nil',48}}|[{'record_field',49,{'atom',49,'root'}}|[{'record_field',50,{'atom',50,'rel_dir'}}|[{'record_field',51,{'atom',51,'releases'}}|[{'record_field',52,{'atom',52,'timer'}}|[{'record_field',53,{'atom',53,'start_prg'}}|[{'record_field',54,{'atom',54,'masters'},{'atom',54,'false'}}|[{'record_field',55,{'atom',55,'client_dir'},{'atom',55,'false'}}|[{'record_field',56,{'atom',56,'static_emulator'},{'atom',56,'false'}}|[{'record_field',57,{'atom',57,'pre_sync_nodes'},{'nil',57}}]]]]]]]]]]}], + %% Line 76 + 'record' = + %% Line 76 + [{'release',[{'record_field',76,{'atom',76,'name'}}|[{'record_field',76,{'atom',76,'vsn'}}|[{'record_field',76,{'atom',76,'erts_vsn'}}|[{'record_field',76,{'atom',76,'libs'},{'nil',76}}|[{'record_field',76,{'atom',76,'status'}}]]]]]}]] +'start_link'/0 = + %% Line 142 + fun () -> + %% Line 143 + call 'gen_server':'start_link' + ({'local','release_handler'}, 'release_handler', [], []) +'unpack_release'/1 = + %% Line 158 + fun (_0) -> + %% Line 159 + apply 'call'/1 + ({'unpack_release',_0}) +'check_install_release'/1 = + %% Line 176 + fun (_0) -> + %% Line 177 + apply 'check_install_release'/2 + (_0, []) +'check_install_release'/2 = + %% Line 179 + fun (_0,_1) -> + %% Line 180 + case apply 'check_check_install_options'/2 + (_1, 'false') of + %% Line 181 + <{'ok',Purge}> when 'true' -> + %% Line 182 + apply 'call'/1 + ({'check_install_release',_0,Purge}) + %% Line 183 + when 'true' -> + %% Line 184 + Error + end +'check_check_install_options'/2 = + %% Line 187 + fun (_0,_1) -> + case <_0,_1> of + <['purge'|Opts],_4> when 'true' -> + %% Line 188 + apply 'check_check_install_options'/2 + (Opts, 'true') + %% Line 189 + <[Illegal|_5],_X_Purge> when 'true' -> + %% Line 190 + {'error',{'illegal_option',Illegal}} + %% Line 191 + <[],Purge> when 'true' -> + %% Line 192 + {'ok',Purge} + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'check_check_install_options',2}}] ) + -| ['compiler_generated'] ) + end +'install_release'/1 = + %% Line 210 + fun (_0) -> + %% Line 211 + apply 'call'/1 + ({'install_release',_0,'restart',[]}) +'install_release'/2 = + %% Line 214 + fun (_0,_1) -> + %% Line 215 + case apply 'check_install_options'/3 + (_1, 'restart', []) of + %% Line 216 + <{'ok',ErrorAction,InstallOpt}> when 'true' -> + %% Line 217 + apply 'call'/1 + ({'install_release',_0,ErrorAction,InstallOpt}) + %% Line 218 + when 'true' -> + %% Line 219 + Error + end +'check_install_options'/3 = + %% Line 222 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[Opt|Opts],ErrAct,InstOpts> when 'true' -> + %% Line 223 + case apply 'install_option'/1 + (Opt) of + %% Line 224 + <{'error_action',EAct}> when 'true' -> + %% Line 225 + apply 'check_install_options'/3 + (Opts, EAct, InstOpts) + %% Line 226 + <'true'> when 'true' -> + %% Line 227 + apply 'check_install_options'/3 + (Opts, ErrAct, [Opt|InstOpts]) + %% Line 228 + <'false'> when 'true' -> + %% Line 229 + {'error',{'illegal_option',Opt}} + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end + %% Line 231 + <[],ErrAct,InstOpts> when 'true' -> + %% Line 232 + {'ok',ErrAct,InstOpts} + ( <_6,_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5,_4}) + -| [{'function_name',{'check_install_options',3}}] ) + -| ['compiler_generated'] ) + end +'install_option'/1 = + %% Line 234 + fun (_0) -> + case _0 of + when 'true' -> + Opt + %% Line 235 + when 'true' -> + Opt + %% Line 236 + <{'code_change_timeout',TimeOut}> when 'true' -> + %% Line 237 + apply 'check_timeout'/1 + (TimeOut) + %% Line 238 + <{'suspend_timeout',TimeOut}> when 'true' -> + %% Line 239 + apply 'check_timeout'/1 + (TimeOut) + %% Line 240 + <{'update_paths',Bool}> + when let <_1> = + call 'erlang':'=:=' + (Bool, 'true') + in let <_2> = + call 'erlang':'=:=' + (Bool, 'false') + in call 'erlang':'or' + (_1, _2) -> + %% Line 241 + 'true' + %% Line 242 + <_X_Opt> when 'true' -> + 'false' + end +'check_timeout'/1 = + %% Line 244 + fun (_0) -> + case _0 of + <'infinity'> when 'true' -> + 'true' + %% Line 245 + + when let <_1> = + call 'erlang':'is_integer' + (_0) + in let <_2> = + call 'erlang':'>' + (_0, 0) + in call 'erlang':'and' + (_1, _2) -> + 'true' + %% Line 246 + <_X_Else> when 'true' -> + 'false' + end +'new_emulator_upgrade'/2 = + %% Line 256 + fun (_0,_1) -> + let = + apply %% Line 257 + 'call'/1 + (%% Line 257 + {'install_release',_0,'reboot',_1}) + in do %% Line 258 + call 'error_logger':'info_msg' + (%% Line 259 + [126|[119|[58|[105|[110|[115|[116|[97|[108|[108|[95|[114|[101|[108|[101|[97|[115|[101|[40|[126|[112|[44|[126|[112|[41|[32|[99|[111|[109|[112|[108|[101|[116|[101|[100|[32|[97|[102|[116|[101|[114|[32|[110|[111|[100|[101|[32|[114|[101|[115|[116|[97|[114|[116|[32|[119|[105|[116|[104|[32|[110|[101|[119|[32|[101|[109|[117|[108|[97|[116|[111|[114|[32|[118|[101|[114|[115|[105|[111|[110|[126|[110|[82|[101|[115|[117|[108|[116|[58|[32|[126|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 260 + ['release_handler'|[_0|[_1|[Result|[]]]]]) + %% Line 261 + Result +'make_permanent'/1 = + %% Line 272 + fun (_0) -> + %% Line 273 + apply 'call'/1 + ({'make_permanent',_0}) +'reboot_old_release'/1 = + %% Line 278 + fun (_0) -> + %% Line 279 + apply 'call'/1 + ({'reboot_old_release',_0}) +'remove_release'/1 = + %% Line 288 + fun (_0) -> + %% Line 289 + apply 'call'/1 + ({'remove_release',_0}) +'set_unpacked'/2 = + %% Line 307 + fun (_0,_1) -> + %% Line 308 + apply 'call'/1 + ({'set_unpacked',_0,_1}) +'set_removed'/1 = + %% Line 317 + fun (_0) -> + %% Line 318 + apply 'call'/1 + ({'set_removed',_0}) +'install_file'/2 = + %% Line 328 + fun (_0,_1) -> + case <_0,_1> of + + when call 'erlang':'is_list' + (File) -> + %% Line 329 + apply 'call'/1 + ({'install_file',File,Vsn}) + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'install_file',2}}] ) + -| ['compiler_generated'] ) + end +'which_releases'/0 = + %% Line 335 + fun () -> + %% Line 336 + apply 'call'/1 + ('which_releases') +'which_releases'/1 = + %% Line 342 + fun (_0) -> + let = + apply %% Line 343 + 'which_releases'/0 + () + in %% Line 344 + apply 'get_releases_with_status'/3 + (Releases, _0, []) +'check_script'/2 = + %% Line 349 + fun (_0,_1) -> + %% Line 350 + call 'release_handler_1':'check_script' + (_0, _1) +'eval_script'/5 = + %% Line 367 + fun (_0,_1,_2,_3,_4) -> + catch + %% Line 368 + call 'release_handler_1':'eval_script' + (_0, _1, _2, _3, _4) +'create_RELEASES'/1 = + %% Line 375 + fun (_0) -> + case _0 of + <[Root|[RelFile|LibDirs]]> when 'true' -> + let <_1> = + call %% Line 376 + 'filename':%% Line 376 + 'join' + (%% Line 376 + Root, %% Line 376 + [114|[101|[108|[101|[97|[115|[101|[115]]]]]]]]) + in %% Line 376 + apply 'create_RELEASES'/4 + (Root, _1, RelFile, LibDirs) + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'create_RELEASES',1}}] ) + -| ['compiler_generated'] ) + end +'create_RELEASES'/2 = + %% Line 378 + fun (_0,_1) -> + let <_2> = + call %% Line 379 + 'filename':%% Line 379 + 'join' + (_0, %% Line 379 + [114|[101|[108|[101|[97|[115|[101|[115]]]]]]]]) + in %% Line 379 + apply 'create_RELEASES'/4 + (_0, _2, _1, []) +'create_RELEASES'/4 = + %% Line 381 + fun (_0,_1,_2,_3) -> + let <_4> = + catch + %% Line 382 + apply 'check_rel'/4 + (_0, _2, _3, 'false') + in %% Line 382 + case _4 of + %% Line 383 + <_@r0 = {'error',Reason}> when 'true' -> + %% Line 384 + _@r0 + %% Line 385 + when 'true' -> + %% Line 386 + case Rel of + <{'release',_14,_15,_16,_17,_18}> when 'true' -> + let <_7> = + call 'erlang':'setelement' + (6, Rel, 'permanent') + in catch + %% Line 387 + apply 'write_releases'/3 + (_1, [_7|[]], 'false') + ( <_19> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + end +'upgrade_app'/2 = + %% Line 400 + fun (_0,_1) -> + %% Line 401 + try + apply 'upgrade_script'/2 + (_0, _1) + of <_2> -> + case _2 of + %% Line 402 + <{'ok',NewVsn,Script}> when 'true' -> + %% Line 403 + apply 'eval_appup_script'/4 + (_0, NewVsn, _1, Script) + ( <_3> when 'true' -> + primop 'match_fail' + ({'try_clause',_3}) + -| ['compiler_generated'] ) + end + catch <_6,_5,_4> -> + %% Line 405 + case <_6,_5,_4> of + <( 'throw' + -| ['compiler_generated'] ),Reason,_9> when 'true' -> + %% Line 406 + {'error',Reason} + ( <_10,_11,_12> when 'true' -> + primop 'raise' + (_12, _11) + -| ['compiler_generated'] ) + end +'downgrade_app'/2 = + %% Line 422 + fun (_0,_1) -> + let <_2> = + call %% Line 423 + 'filename':%% Line 423 + 'basename' + (_1) + in %% Line 423 + case call 'string':'lexemes' + (_2, [45]) of + %% Line 424 + <[_X_AppS|[OldVsn|[]]]> when 'true' -> + %% Line 425 + apply 'downgrade_app'/3 + (_0, OldVsn, _1) + %% Line 426 + <_6> when 'true' -> + %% Line 427 + {'error',{'unknown_version',_0}} + end +'downgrade_app'/3 = + %% Line 429 + fun (_0,_1,_2) -> + %% Line 430 + try + apply 'downgrade_script'/3 + (_0, _1, _2) + of <_3> -> + case _3 of + %% Line 431 + <{'ok',Script}> when 'true' -> + %% Line 432 + apply 'eval_appup_script'/4 + (_0, _1, _2, Script) + ( <_4> when 'true' -> + primop 'match_fail' + ({'try_clause',_4}) + -| ['compiler_generated'] ) + end + catch <_7,_6,_5> -> + %% Line 434 + case <_7,_6,_5> of + <( 'throw' + -| ['compiler_generated'] ),Reason,_11> when 'true' -> + %% Line 435 + {'error',Reason} + ( <_12,_13,_14> when 'true' -> + primop 'raise' + (_14, _13) + -| ['compiler_generated'] ) + end +'upgrade_script'/2 = + %% Line 438 + fun (_0,_1) -> + let = + apply %% Line 439 + 'ensure_running'/1 + (_0) + in let = + call %% Line 440 + 'code':%% Line 440 + 'lib_dir' + (_0) + in %% Line 441 + case apply 'find_script'/4 + (_0, _1, OldVsn, 'up') of + <{NewVsn,Script}> when 'true' -> + let = + apply %% Line 442 + 'read_app'/3 + (_0, %% Line 442 + OldVsn, %% Line 442 + OldDir) + in let = + apply %% Line 443 + 'read_app'/3 + (_0, %% Line 443 + NewVsn, _1) + in %% Line 444 + case call 'systools_rc':'translate_scripts' + ('up', %% Line 445 + [Script|[]], %% Line 445 + [NewAppl|[]], %% Line 445 + [OldAppl|[]]) of + %% Line 446 + <{'ok',LowLevelScript}> when 'true' -> + %% Line 447 + {'ok',NewVsn,LowLevelScript} + %% Line 448 + <{'error',_X_SystoolsRC,Reason}> when 'true' -> + %% Line 449 + call 'erlang':'throw' + (Reason) + ( <_7> when 'true' -> + primop 'match_fail' + ({'case_clause',_7}) + -| ['compiler_generated'] ) + end + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end +'downgrade_script'/3 = + %% Line 452 + fun (_0,_1,_2) -> + let = + apply %% Line 453 + 'ensure_running'/1 + (_0) + in let = + call %% Line 454 + 'code':%% Line 454 + 'lib_dir' + (_0) + in %% Line 455 + case apply 'find_script'/4 + (_0, NewDir, _1, 'down') of + <{_12,Script}> + when call 'erlang':'=:=' + (_12, + NewVsn) -> + let = + apply %% Line 456 + 'read_app'/3 + (_0, _1, _2) + in let = + apply %% Line 457 + 'read_app'/3 + (_0, %% Line 457 + NewVsn, %% Line 457 + NewDir) + in %% Line 458 + case call 'systools_rc':'translate_scripts' + ('dn', %% Line 459 + [Script|[]], %% Line 459 + [OldAppl|[]], %% Line 459 + [NewAppl|[]]) of + %% Line 460 + <_@r0 = {'ok',LowLevelScript}> when 'true' -> + %% Line 461 + _@r0 + %% Line 462 + <{'error',_X_SystoolsRC,Reason}> when 'true' -> + %% Line 463 + call 'erlang':'throw' + (Reason) + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end + ( <_5> when 'true' -> + primop 'match_fail' + ({'badmatch',_5}) + -| ['compiler_generated'] ) + end +'eval_appup_script'/4 = + %% Line 466 + fun (_0,_1,_2,_3) -> + let = + call %% Line 467 + 'application_controller':%% Line 467 + 'prep_config_change' + () + in let = + apply %% Line 468 + 'read_appspec'/2 + (_0, _2) + in let = + call %% Line 469 + 'release_handler_1':%% Line 469 + 'eval_script' + (_3, %% Line 470 + [], %% Line 471 + [{_0,_1,_2}|[]], %% Line 472 + [{_0,_1,_2}|[]], %% Line 473 + []) + in do %% Line 474 + case Res of + %% Line 475 + <{'ok',_X_Unpurged}> when 'true' -> + do %% Line 476 + call 'application_controller':'change_application_data' + (AppSpecL, []) + %% Line 477 + call 'application_controller':'config_change' + (EnvBefore) + %% Line 478 + <_X_Res> when 'true' -> + 'ok' + end + %% Line 481 + Res +'ensure_running'/1 = + %% Line 483 + fun (_0) -> + let <_1> = + call %% Line 484 + 'application':%% Line 484 + 'which_applications' + () + in %% Line 484 + case call 'lists':'keysearch' + (_0, 1, _1) of + %% Line 485 + <{'value',{_X_App,_X_Descr,Vsn}}> when 'true' -> + %% Line 486 + Vsn + %% Line 487 + <'false'> when 'true' -> + %% Line 488 + call 'erlang':'throw' + ({'app_not_running',_0}) + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'find_script'/4 = + %% Line 491 + fun (_0,_1,_2,_3) -> + let <_4> = + call %% Line 492 + 'erlang':%% Line 492 + 'atom_to_list' + (_0) + in let <_5> = + call %% Line 492 + 'erlang':%% Line 492 + '++' + (_4, %% Line 492 + [46|[97|[112|[112|[117|[112]]]]]]) + in let = + call %% Line 492 + 'filename':%% Line 492 + 'join' + (%% Line 492 + [_1|[[101|[98|[105|[110]]]]|[_5|[]]]]) + in %% Line 493 + case call 'file':'consult' + (Appup) of + %% Line 494 + <{'ok',[{NewVsn,UpFromScripts,DownToScripts}|[]]}> when 'true' -> + let <_8> = + case _3 of + %% Line 496 + <'up'> when 'true' -> + UpFromScripts + %% Line 497 + <'down'> when 'true' -> + DownToScripts + ( <_7> when 'true' -> + %% Line 495 + primop 'match_fail' + ({'case_clause',_7}) + -| ['compiler_generated'] ) + end + in %% Line 499 + case call 'systools_relup':'appup_search_for_version' + (_2, _8) of + %% Line 500 + <{'ok',Script}> when 'true' -> + %% Line 501 + {NewVsn,Script} + %% Line 502 + <'error'> when 'true' -> + %% Line 503 + call 'erlang':'throw' + ({'version_not_in_appup',_2}) + ( <_10> when 'true' -> + primop 'match_fail' + ({'case_clause',_10}) + -| ['compiler_generated'] ) + end + %% Line 505 + <{'error','enoent'}> when 'true' -> + %% Line 506 + call 'erlang':'throw' + ('no_appup_found') + %% Line 507 + <{'error',Reason}> when 'true' -> + %% Line 508 + call 'erlang':'throw' + (Reason) + ( <_11> when 'true' -> + primop 'match_fail' + ({'case_clause',_11}) + -| ['compiler_generated'] ) + end +'read_app'/3 = + %% Line 511 + fun (_0,_1,_2) -> + let = + call %% Line 512 + 'erlang':%% Line 512 + 'atom_to_list' + (_0) + in let <_4> = + call %% Line 513 + 'filename':%% Line 513 + 'join' + (_2, %% Line 513 + [101|[98|[105|[110]]]]) + in let = + [_4|%% Line 513 + []] + in %% Line 514 + case call 'systools_make':'read_application' + (AppS, _1, Path, []) of + %% Line 515 + <{'ok',Appl}> when 'true' -> + %% Line 516 + Appl + %% Line 517 + <{'error',{'not_found',_X_AppFile}}> when 'true' -> + %% Line 518 + call 'erlang':'throw' + ({'no_app_found',_1,_2}) + %% Line 519 + <{'error',Reason}> when 'true' -> + %% Line 520 + call 'erlang':'throw' + (Reason) + ( <_6> when 'true' -> + primop 'match_fail' + ({'case_clause',_6}) + -| ['compiler_generated'] ) + end +'read_appspec'/2 = + %% Line 523 + fun (_0,_1) -> + let = + call %% Line 524 + 'erlang':%% Line 524 + 'atom_to_list' + (_0) + in let <_3> = + call %% Line 525 + 'filename':%% Line 525 + 'join' + (_1, %% Line 525 + [101|[98|[105|[110]]]]) + in let = + [_3|%% Line 525 + []] + in let <_5> = + call %% Line 526 + 'erlang':%% Line 526 + '++' + (%% Line 526 + AppS, %% Line 526 + [46|[97|[112|[112]]]]) + in %% Line 526 + case call 'file':'path_consult' + (Path, _5) of + %% Line 527 + <{'ok',AppSpecL,_X_File}> when 'true' -> + %% Line 528 + AppSpecL + %% Line 529 + <{'error',Reason}> when 'true' -> + %% Line 530 + call 'erlang':'throw' + (Reason) + ( <_6> when 'true' -> + primop 'match_fail' + ({'case_clause',_6}) + -| ['compiler_generated'] ) + end +'call'/1 = + %% Line 536 + fun (_0) -> + %% Line 537 + call 'gen_server':'call' + ('release_handler', _0, 'infinity') +'init'/1 = + %% Line 543 + fun (_0) -> + case _0 of + <[]> when 'true' -> + %% Line 544 + case call 'init':'get_argument' + ('root') of + <{'ok',[[Root|[]]|[]]}> when 'true' -> + %% Line 545 + case apply 'is_client'/0 + () of + <{CliDir,Masters}> when 'true' -> + let <_5> = + case %% Line 547 + call 'application':'get_env' + ('sasl', 'releases_dir') of + %% Line 548 + <'undefined'> when 'true' -> + %% Line 549 + case call 'os':'getenv' + ([82|[69|[76|[68|[73|[82]]]]]]) of + %% Line 550 + <'false'> when 'true' -> + %% Line 551 + case <> of + %% Line 552 + <> + when call 'erlang':'=:=' + (CliDir, + 'false') -> + %% Line 553 + call 'filename':'join' + ([Root|[[114|[101|[108|[101|[97|[115|[101|[115]]]]]]]]]]) + %% Line 554 + <> when 'true' -> + %% Line 555 + call 'filename':'join' + ([CliDir|[[114|[101|[108|[101|[97|[115|[101|[115]]]]]]]]]]) + end + %% Line 557 + when 'true' -> + %% Line 558 + RELDIR + end + %% Line 560 + <{'ok',Dir}> when 'true' -> + %% Line 561 + Dir + ( <_4> when 'true' -> + %% Line 547 + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end + in let <_7> = + call %% Line 564 + 'filename':%% Line 564 + 'join' + (_5, %% Line 564 + [82|[69|[76|[69|[65|[83|[69|[83]]]]]]]]) + in let <_10> = + case %% Line 564 + apply 'consult'/2 + (_7, Masters) of + %% Line 565 + <{'ok',[Term|[]]}> when 'true' -> + %% Line 566 + apply 'transform_release'/3 + (_5, Term, Masters) + %% Line 567 + <_20> when 'true' -> + %% Line 568 + case call 'init':'script_id' + () of + <{Name,Vsn}> when 'true' -> + %% Line 569 + [{'release',Name,Vsn,'undefined',[],'permanent'}|[]] + ( <_8> when 'true' -> + primop 'match_fail' + ({'badmatch',_8}) + -| ['compiler_generated'] ) + end + end + in let <_14> = + case %% Line 572 + call 'application':'get_env' + ('start_prg') of + %% Line 573 + <{'ok',Found2}> + when call 'erlang':'is_list' + (Found2) -> + %% Line 574 + {'do_check',Found2} + %% Line 575 + <_21> when 'true' -> + let <_12> = + call %% Line 576 + 'filename':%% Line 576 + 'join' + (%% Line 576 + [Root|[[98|[105|[110]]]|[[115|[116|[97|[114|[116]]]]]]]]) + in %% Line 576 + {'no_check',_12} + end + in let <_17> = + case %% Line 579 + call 'application':'get_env' + ('static_emulator') of + %% Line 580 + <{'ok',SFlag}> + when call 'erlang':'is_atom' + (SFlag) -> + SFlag + %% Line 581 + <_22> when 'true' -> + 'false' + end + in %% Line 583 + {'ok',{'state',[],Root,_5,_10,'undefined',_14,%% Line 584 + Masters,%% Line 585 + CliDir,_17,[]}} + ( <_2> when 'true' -> + primop 'match_fail' + ({'badmatch',_2}) + -| ['compiler_generated'] ) + end + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end + ( <_19> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_19}) + -| [{'function_name',{'init',1}}] ) + -| ['compiler_generated'] ) + end +'handle_call'/3 = + %% Line 587 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <{'unpack_release',ReleaseName},_X_From,S = {'state',_117,_118,_119,_120,_121,_122,_123,_124,_125,_126}> + when %% Line 588 + ( try + let <_7> = + call 'erlang':'element' + (8, S) + in call 'erlang':'=:=' + (_7, 'false') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + let <_15> = + catch + %% Line 589 + ( case S of + ( <( {'state',_127,_rec1,_128,_129,_130,_131,_132,_133,_134,_135} + -| ['compiler_generated'] )> when 'true' -> + ( case S of + ( <( {'state',_137,_138,_rec2,_139,_140,_141,_142,_143,_144,_145} + -| ['compiler_generated'] )> when 'true' -> + %% Line 590 + ( case S of + ( <( {'state',_147,_148,_149,_rec3,_150,_151,_152,_153,_154,_155} + -| ['compiler_generated'] )> when 'true' -> + apply 'do_unpack_release'/4 + (_rec1, _rec2, ReleaseName, _rec3) + -| ['compiler_generated'] ) + ( <_156> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_146> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_136> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + in %% Line 589 + case _15 of + %% Line 591 + <{'ok',NewReleases,Vsn}> when 'true' -> + %% Line 592 + case S of + <{'state',_157,_158,_159,_160,_161,_162,_163,_164,_165,_166}> when 'true' -> + let <_18> = + call 'erlang':'setelement' + (5, S, NewReleases) + in {'reply',{'ok',Vsn},_18} + ( <_167> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 593 + <_@r0 = {'error',Reason}> when 'true' -> + %% Line 594 + {'reply',_@r0,S} + %% Line 595 + <{'EXIT',Reason}> when 'true' -> + %% Line 596 + {'reply',{'error',Reason},S} + ( <_19> when 'true' -> + primop 'match_fail' + ({'case_clause',_19}) + -| ['compiler_generated'] ) + end + %% Line 598 + <{'unpack_release',_X_ReleaseName},_X_From,S> when 'true' -> + %% Line 599 + {'reply',{'error','client_node'},S} + %% Line 601 + <{'check_install_release',Vsn,Purge},_X_From,S> when 'true' -> + let <_26> = + catch + %% Line 602 + ( case S of + ( <( {'state',_168,_169,_rec5,_170,_171,_172,_173,_174,_175,_176} + -| ['compiler_generated'] )> when 'true' -> + %% Line 604 + ( case S of + ( <( {'state',_178,_179,_180,_rec6,_181,_182,_183,_184,_185,_186} + -| ['compiler_generated'] )> when 'true' -> + %% Line 605 + ( case S of + ( <( {'state',_188,_189,_190,_191,_192,_193,_rec7,_194,_195,_196} + -| ['compiler_generated'] )> when 'true' -> + apply 'do_check_install_release'/5 + (_rec5, Vsn, _rec6, _rec7, %% Line 606 + Purge) + -| ['compiler_generated'] ) + ( <_197> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_187> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_177> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + in %% Line 602 + case _26 of + %% Line 607 + <_@r1 = {'ok',CurrentVsn,Descr}> when 'true' -> + %% Line 608 + {'reply',_@r1,S} + %% Line 609 + <_@r2 = {'error',Reason}> when 'true' -> + %% Line 610 + {'reply',_@r2,S} + %% Line 611 + <{'EXIT',Reason}> when 'true' -> + %% Line 612 + {'reply',{'error',Reason},S} + ( <_27> when 'true' -> + primop 'match_fail' + ({'case_clause',_27}) + -| ['compiler_generated'] ) + end + %% Line 615 + <{'install_release',Vsn,ErrorAction,Opts},From,S> when 'true' -> + let = + apply %% Line 616 + 'resend_sync_nodes'/1 + (%% Line 616 + S) + in let <_29> = + catch + %% Line 617 + apply 'do_install_release'/3 + (S, Vsn, Opts) + in %% Line 617 + case _29 of + %% Line 618 + <{'ok',NewReleases,[],CurrentVsn,Descr}> when 'true' -> + %% Line 619 + case NS of + <{'state',_198,_199,_200,_201,_202,_203,_204,_205,_206,_207}> when 'true' -> + let <_32> = + call 'erlang':'setelement' + (5, NS, NewReleases) + in {'reply',{'ok',CurrentVsn,Descr},_32} + ( <_208> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 620 + <{'ok',NewReleases,Unpurged,CurrentVsn,Descr}> when 'true' -> + %% Line 622 + ( case S of + ( <( {'state',_209,_210,_211,_212,_rec9,_213,_214,_215,_216,_217} + -| ['compiler_generated'] )> when 'true' -> + let <_37> = + case _rec9 of + %% Line 623 + <'undefined'> when 'true' -> + %% Line 624 + case call 'timer':'send_interval' + (10000, 'timeout') of + <{'ok',Ref}> when 'true' -> + %% Line 625 + Ref + ( <_35> when 'true' -> + primop 'match_fail' + ({'badmatch',_35}) + -| ['compiler_generated'] ) + end + %% Line 626 + when 'true' -> + Ref + end + in %% Line 628 + case NS of + <{'state',_219,_220,_221,_222,_223,_224,_225,_226,_227,_228}> when 'true' -> + let <_40> = + call %% Line 629 + 'erlang':%% Line 629 + 'setelement' + (%% Line 629 + 6, NS, _37) + in let <_41> = + call 'erlang':'setelement' + (5, _40, NewReleases) + in let <_43> = + call 'erlang':'setelement' + (2, _41, Unpurged) + in %% Line 630 + {'reply',{'ok',CurrentVsn,Descr},_43} + ( <_229> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_218> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 631 + <_@r3 = {'error',Reason}> when 'true' -> + %% Line 632 + {'reply',_@r3,NS} + %% Line 633 + <{'restart_emulator',CurrentVsn,Descr}> when 'true' -> + do %% Line 634 + call 'gen_server':'reply' + (From, {'ok',CurrentVsn,Descr}) + do %% Line 635 + call 'init':'reboot' + () + %% Line 636 + {'noreply',NS} + %% Line 637 + <{'restart_new_emulator',CurrentVsn,Descr}> when 'true' -> + do %% Line 638 + call 'gen_server':'reply' + (From, {'continue_after_restart',CurrentVsn,Descr}) + do %% Line 639 + call 'init':'reboot' + () + %% Line 640 + {'noreply',NS} + %% Line 641 + <{'EXIT',Reason}> when 'true' -> + do %% Line 642 + call 'io':'format' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[105|[110|[115|[116|[97|[108|[108|[95|[114|[101|[108|[101|[97|[115|[101|[40|[86|[115|[110|[61|[126|[116|[112|[32|[79|[112|[116|[115|[61|[126|[116|[112|[41|[32|[102|[97|[105|[108|[101|[100|[44|[32|[82|[101|[97|[115|[111|[110|[61|[126|[116|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 644 + [Vsn|[Opts|[Reason|[]]]]) + do %% Line 645 + call 'gen_server':'reply' + (From, {'error',Reason}) + do %% Line 646 + case ErrorAction of + %% Line 647 + <'restart'> when 'true' -> + %% Line 648 + call 'init':'restart' + () + %% Line 649 + <'reboot'> when 'true' -> + %% Line 650 + call 'init':'reboot' + () + ( <_45> when 'true' -> + primop 'match_fail' + ({'case_clause',_45}) + -| ['compiler_generated'] ) + end + %% Line 652 + {'noreply',NS} + ( <_46> when 'true' -> + primop 'match_fail' + ({'case_clause',_46}) + -| ['compiler_generated'] ) + end + %% Line 655 + <{'make_permanent',Vsn},_X_From,S> when 'true' -> + let <_47> = + catch + %% Line 656 + apply 'do_make_permanent'/2 + (S, Vsn) + in %% Line 656 + case _47 of + %% Line 657 + <{'ok',Releases,Unpurged}> when 'true' -> + %% Line 658 + case S of + <{'state',_230,_231,_232,_233,_234,_235,_236,_237,_238,_239}> when 'true' -> + let <_49> = + call 'erlang':'setelement' + (5, S, Releases) + in let <_51> = + call 'erlang':'setelement' + (2, _49, Unpurged) + in {'reply','ok',_51} + ( <_240> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 659 + <_@r4 = {'error',Reason}> when 'true' -> + %% Line 660 + {'reply',_@r4,S} + %% Line 661 + <{'EXIT',Reason}> when 'true' -> + %% Line 662 + {'reply',{'error',Reason},S} + ( <_52> when 'true' -> + primop 'match_fail' + ({'case_clause',_52}) + -| ['compiler_generated'] ) + end + %% Line 665 + <{'reboot_old_release',Vsn},From,S> when 'true' -> + let <_53> = + catch + %% Line 666 + apply 'do_reboot_old_release'/2 + (S, Vsn) + in %% Line 666 + case _53 of + %% Line 667 + <'ok'> when 'true' -> + do %% Line 668 + call 'gen_server':'reply' + (From, 'ok') + do %% Line 669 + call 'init':'reboot' + () + %% Line 670 + {'noreply',S} + %% Line 671 + <_@r5 = {'error',Reason}> when 'true' -> + %% Line 672 + {'reply',_@r5,S} + %% Line 673 + <{'EXIT',Reason}> when 'true' -> + %% Line 674 + {'reply',{'error',Reason},S} + ( <_54> when 'true' -> + primop 'match_fail' + ({'case_clause',_54}) + -| ['compiler_generated'] ) + end + %% Line 677 + <{'remove_release',Vsn},_X_From,S = {'state',_241,_242,_243,_244,_245,_246,_247,_248,_249,_250}> + when %% Line 678 + ( try + let <_59> = + call 'erlang':'element' + (8, S) + in call 'erlang':'=:=' + (_59, 'false') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + let <_67> = + catch + %% Line 679 + ( case S of + ( <( {'state',_251,_rec12,_252,_253,_254,_255,_256,_257,_258,_259} + -| ['compiler_generated'] )> when 'true' -> + ( case S of + ( <( {'state',_261,_262,_rec13,_263,_264,_265,_266,_267,_268,_269} + -| ['compiler_generated'] )> when 'true' -> + %% Line 680 + ( case S of + ( <( {'state',_271,_272,_273,_rec14,_274,_275,_276,_277,_278,_279} + -| ['compiler_generated'] )> when 'true' -> + apply 'do_remove_release'/4 + (_rec12, _rec13, Vsn, _rec14) + -| ['compiler_generated'] ) + ( <_280> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_270> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_260> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + in %% Line 679 + case _67 of + %% Line 681 + <{'ok',NewReleases}> when 'true' -> + %% Line 682 + case S of + <{'state',_281,_282,_283,_284,_285,_286,_287,_288,_289,_290}> when 'true' -> + let <_70> = + call 'erlang':'setelement' + (5, S, NewReleases) + in {'reply','ok',_70} + ( <_291> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 683 + <_@r6 = {'error',Reason}> when 'true' -> + %% Line 684 + {'reply',_@r6,S} + %% Line 685 + <{'EXIT',Reason}> when 'true' -> + %% Line 686 + {'reply',{'error',Reason},S} + ( <_71> when 'true' -> + primop 'match_fail' + ({'case_clause',_71}) + -| ['compiler_generated'] ) + end + %% Line 688 + <{'remove_release',_X_Vsn},_X_From,S> when 'true' -> + %% Line 689 + {'reply',{'error','client_node'},S} + %% Line 691 + <{'set_unpacked',RelFile,LibDirs},_X_From,S> when 'true' -> + %% Line 692 + ( case S of + ( <( {'state',_292,_rec16,_293,_294,_295,_296,_297,_298,_299,_300} + -| ['compiler_generated'] )> when 'true' -> + let <_81> = + catch + %% Line 693 + ( case S of + ( <( {'state',_302,_303,_rec17,_304,_305,_306,_307,_308,_309,_310} + -| ['compiler_generated'] )> when 'true' -> + %% Line 694 + ( case S of + ( <( {'state',_312,_313,_314,_rec18,_315,_316,_317,_318,_319,_320} + -| ['compiler_generated'] )> when 'true' -> + %% Line 695 + ( case S of + ( <( {'state',_322,_323,_324,_325,_326,_327,_rec19,_328,_329,_330} + -| ['compiler_generated'] )> when 'true' -> + apply 'do_set_unpacked'/6 + (_rec16, _rec17, RelFile, LibDirs, _rec18, _rec19) + -| ['compiler_generated'] ) + ( <_331> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_321> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_311> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + in %% Line 693 + case _81 of + %% Line 696 + <{'ok',NewReleases,Vsn}> when 'true' -> + %% Line 697 + case S of + <{'state',_332,_333,_334,_335,_336,_337,_338,_339,_340,_341}> when 'true' -> + let <_84> = + call 'erlang':'setelement' + (5, S, NewReleases) + in {'reply',{'ok',Vsn},_84} + ( <_342> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 698 + <_@r7 = {'error',Reason}> when 'true' -> + %% Line 699 + {'reply',_@r7,S} + %% Line 700 + <{'EXIT',Reason}> when 'true' -> + %% Line 701 + {'reply',{'error',Reason},S} + ( <_85> when 'true' -> + primop 'match_fail' + ({'case_clause',_85}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_301> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 704 + <{'set_removed',Vsn},_X_From,S> when 'true' -> + let <_92> = + catch + %% Line 705 + ( case S of + ( <( {'state',_343,_344,_rec21,_345,_346,_347,_348,_349,_350,_351} + -| ['compiler_generated'] )> when 'true' -> + %% Line 706 + ( case S of + ( <( {'state',_353,_354,_355,_rec22,_356,_357,_358,_359,_360,_361} + -| ['compiler_generated'] )> when 'true' -> + %% Line 707 + ( case S of + ( <( {'state',_363,_364,_365,_366,_367,_368,_rec23,_369,_370,_371} + -| ['compiler_generated'] )> when 'true' -> + apply 'do_set_removed'/4 + (_rec21, Vsn, _rec22, _rec23) + -| ['compiler_generated'] ) + ( <_372> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_362> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_352> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + in %% Line 705 + case _92 of + %% Line 708 + <{'ok',NewReleases}> when 'true' -> + %% Line 709 + case S of + <{'state',_373,_374,_375,_376,_377,_378,_379,_380,_381,_382}> when 'true' -> + let <_95> = + call 'erlang':'setelement' + (5, S, NewReleases) + in {'reply','ok',_95} + ( <_383> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 710 + <_@r8 = {'error',Reason}> when 'true' -> + %% Line 711 + {'reply',_@r8,S} + %% Line 712 + <{'EXIT',Reason}> when 'true' -> + %% Line 713 + {'reply',{'error',Reason},S} + ( <_96> when 'true' -> + primop 'match_fail' + ({'case_clause',_96}) + -| ['compiler_generated'] ) + end + %% Line 716 + <{'install_file',File,Vsn},_X_From,S> when 'true' -> + %% Line 718 + ( case S of + ( <( {'state',_384,_385,_386,_rec25,_387,_388,_389,_390,_391,_392} + -| ['compiler_generated'] )> when 'true' -> + let <_105> = + case call 'lists':'keysearch' + (Vsn, 3, _rec25) of + %% Line 719 + <{'value',_394}> when 'true' -> + %% Line 720 + ( case S of + ( <( {'state',_395,_396,_rec26,_397,_398,_399,_400,_401,_402,_403} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'filename':'join' + ([_rec26|[Vsn|[]]]) + in catch + %% Line 721 + ( case S of + ( <( {'state',_405,_406,_407,_408,_409,_410,_rec27,_411,_412,_413} + -| ['compiler_generated'] )> when 'true' -> + apply 'copy_file'/3 + (File, Dir, _rec27) + -| ['compiler_generated'] ) + ( <_414> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_404> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 722 + <_415> when 'true' -> + %% Line 723 + {'error',{'no_such_release',Vsn}} + end + in %% Line 725 + {'reply',_105,S} + -| ['compiler_generated'] ) + ( <_393> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 727 + <'which_releases',_X_From,S> when 'true' -> + let <_112> = + fun (_110) -> + %% Line 728 + case _110 of + <{'release',Name,Vsn,_416,Libs,%% Line 729 + Status}> when 'true' -> + let <_109> = + apply %% Line 730 + 'mk_lib_name'/1 + (%% Line 730 + Libs) + in %% Line 730 + {Name,Vsn,_109,Status} + ( <_111> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_111}) + -| [{'function_name',{'-handle_call/3-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 731 + ( case S of + ( <( {'state',_417,_418,_419,_rec28,_420,_421,_422,_423,_424,_425} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'lists':'map' + (_112, _rec28) + in %% Line 732 + {'reply',Reply,S} + -| ['compiler_generated'] ) + ( <_426> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_116,_115,_114> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_116,_115,_114}) + -| [{'function_name',{'handle_call',3}}] ) + -| ['compiler_generated'] ) + end +'mk_lib_name'/1 = + %% Line 734 + fun (_0) -> + case _0 of + <[{LibName,Vsn,_X_Dir}|T]> when 'true' -> + let <_1> = + call %% Line 735 + 'lists':%% Line 735 + 'concat' + (%% Line 735 + [LibName|[[45]|[Vsn|[]]]]) + in let <_2> = + apply %% Line 735 + 'mk_lib_name'/1 + (%% Line 735 + T) + in %% Line 735 + [_1|_2] + %% Line 736 + <[]> when 'true' -> + [] + ( <_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3}) + -| [{'function_name',{'mk_lib_name',1}}] ) + -| ['compiler_generated'] ) + end +'handle_info'/2 = + %% Line 738 + fun (_0,_1) -> + case <_0,_1> of + <'timeout',S> when 'true' -> + %% Line 739 + ( case S of + ( <( {'state',_rec29,_24,_25,_26,_27,_28,_29,_30,_31,_32} + -| ['compiler_generated'] )> when 'true' -> + case apply 'soft_purge'/1 + (_rec29) of + %% Line 740 + <[]> when 'true' -> + %% Line 741 + ( case S of + ( <( {'state',_34,_35,_36,_37,_rec30,_38,_39,_40,_41,_42} + -| ['result_not_wanted','compiler_generated'] )> when 'true' -> + do ( call ( 'timer' + -| ['result_not_wanted'] ):( 'cancel' + -| ['result_not_wanted'] ) + (_rec30) + -| ['result_not_wanted'] ) + %% Line 742 + case S of + <{'state',_44,_45,_46,_47,_48,_49,_50,_51,_52,_53}> when 'true' -> + let <_8> = + call 'erlang':'setelement' + (6, S, 'undefined') + in let <_10> = + call 'erlang':'setelement' + (2, _8, []) + in {'noreply',_10} + ( <_54> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_43> when 'true' -> + ( call ( 'erlang' + -| ['result_not_wanted','compiler_generated'] ):( 'error' + -| ['result_not_wanted','compiler_generated'] ) + (( {'badrecord','state'} + -| ['result_not_wanted','compiler_generated'] )) + -| ['result_not_wanted','compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 743 + when 'true' -> + %% Line 744 + case S of + <{'state',_55,_56,_57,_58,_59,_60,_61,_62,_63,_64}> when 'true' -> + let <_13> = + call 'erlang':'setelement' + (2, S, Unpurged) + in {'noreply',_13} + ( <_65> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + end + -| ['compiler_generated'] ) + ( <_33> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 747 + <_@r0 = {'sync_nodes',Id,Node},S> when 'true' -> + %% Line 748 + ( case S of + ( <( {'state',_66,_67,_68,_69,_70,_71,_72,_73,_74,_rec33} + -| ['compiler_generated'] )> when 'true' -> + let <_rec34> = + [%% Line 749 + _@r0|_rec33] + in %% Line 749 + case S of + <{'state',_76,_77,_78,_79,_80,_81,_82,_83,_84,_85}> when 'true' -> + let <_21> = + call 'erlang':'setelement' + (11, S, _rec34) + in {'noreply',_21} + ( <_86> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_75> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 751 + when 'true' -> + do %% Line 752 + call 'error_logger':'info_msg' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[32|[103|[111|[116|[32|[117|[110|[107|[110|[111|[119|[110|[32|[109|[101|[115|[115|[97|[103|[101|[58|[32|[126|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [Msg|[]]) + %% Line 753 + {'noreply',State} + end +'terminate'/2 = + %% Line 755 + fun (_0,_1) -> + %% Line 756 + 'ok' +'handle_cast'/2 = + %% Line 758 + fun (_0,_1) -> + %% Line 759 + {'noreply',_1} +'code_change'/3 = + %% Line 760 + fun (_0,_1,_2) -> + %% Line 761 + {'ok',_1} +'is_client'/0 = + %% Line 766 + fun () -> + %% Line 767 + case call 'application':'get_env' + ('masters') of + %% Line 768 + <{'ok',Masters}> when 'true' -> + let = + call %% Line 769 + 'erlang':%% Line 769 + 'is_alive' + () + in %% Line 770 + case apply 'atom_list'/1 + (Masters) of + %% Line 771 + <'true'> + when call 'erlang':'=:=' + (Alive, + 'true') -> + %% Line 772 + case call 'application':'get_env' + ('client_directory') of + %% Line 773 + <{'ok',ClientDir}> when 'true' -> + %% Line 774 + case apply 'int_list'/1 + (ClientDir) of + %% Line 775 + <'true'> when 'true' -> + %% Line 776 + {ClientDir,Masters} + %% Line 777 + <_5> when 'true' -> + %% Line 778 + call 'erlang':'exit' + ({'bad_parameter','client_directory',%% Line 779 + ClientDir}) + end + %% Line 781 + <_6> when 'true' -> + %% Line 782 + {'false','false'} + end + %% Line 784 + <_7> when 'true' -> + %% Line 785 + call 'erlang':'exit' + ({'bad_parameter','masters',Masters}) + end + %% Line 787 + <_8> when 'true' -> + %% Line 788 + {'false','false'} + end +'atom_list'/1 = + %% Line 791 + fun (_0) -> + case _0 of + <[A|T]> + when call 'erlang':'is_atom' + (A) -> + apply 'atom_list'/1 + (T) + %% Line 792 + <[]> when 'true' -> + 'true' + %% Line 793 + <_2> when 'true' -> + 'false' + end +'int_list'/1 = + %% Line 795 + fun (_0) -> + case _0 of + <[I|T]> + when call 'erlang':'is_integer' + (I) -> + apply 'int_list'/1 + (T) + %% Line 796 + <[]> when 'true' -> + 'true' + %% Line 797 + <_2> when 'true' -> + 'false' + end +'resend_sync_nodes'/1 = + %% Line 799 + fun (_0) -> + let <_6> = + fun (_4) -> + let <_3> = + call %% Line 800 + 'erlang':%% Line 800 + 'self' + () + in %% Line 800 + call 'erlang':'!' + (_3, _4) + in %% Line 800 + ( case _0 of + ( <( {'state',_10,_11,_12,_13,_14,_15,_16,_17,_18,_rec36} + -| ['compiler_generated'] )> when 'true' -> + do call 'lists':'foreach' + (_6, _rec36) + %% Line 801 + case _0 of + <{'state',_20,_21,_22,_23,_24,_25,_26,_27,_28,_29}> when 'true' -> + call 'erlang':'setelement' + (11, _0, []) + ( <_30> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_19> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) +'soft_purge'/1 = + %% Line 803 + fun (_0) -> + let <_4> = + fun (_2) -> + %% Line 804 + case _2 of + <{Mod,_X_PostPurgeMethod}> when 'true' -> + %% Line 805 + case call 'code':'soft_purge' + (Mod) of + %% Line 806 + <'true'> when 'true' -> + 'false' + %% Line 807 + <'false'> when 'true' -> + 'true' + ( <_1> when 'true' -> + primop 'match_fail' + ({'case_clause',_1}) + -| ['compiler_generated'] ) + end + ( <_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3}) + -| [{'function_name',{'-soft_purge/1-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 804 + call 'lists':'filter' + (_4, _0) +'brutal_purge'/1 = + %% Line 812 + fun (_0) -> + let <_3> = + fun (_1) -> + %% Line 813 + case _1 of + <{Mod,'brutal_purge'}> when 'true' -> + do call 'code':'purge' + (Mod) + 'false' + %% Line 814 + <_5> when 'true' -> + 'true' + end + in %% Line 813 + call 'lists':'filter' + (_3, _0) +'do_unpack_release'/4 = + %% Line 830 + fun (_0,_1,_2,_3) -> + let <_4> = + call %% Line 831 + 'erlang':%% Line 831 + '++' + (_2, %% Line 831 + [46|[116|[97|[114|[46|[103|[122]]]]]]]) + in let = + call %% Line 831 + 'filename':%% Line 831 + 'join' + (_1, _4) + in do %% Line 832 + apply 'do_check_file'/2 + (Tar, 'regular') + let = + call %% Line 833 + 'erlang':%% Line 833 + '++' + (_2, %% Line 833 + [46|[114|[101|[108]]]]) + in let <_7> = + call %% Line 834 + ( 'filename' + -| ['result_not_wanted'] ):%% Line 834 + ( 'join' + -| ['result_not_wanted'] ) + (%% Line 834 + ( [114|[101|[108|[101|[97|[115|[101|[115]]]]]]]] + -| ['result_not_wanted'] ), %% Line 834 + Rel) + in do %% Line 834 + apply 'extract_rel_file'/3 + (_7, Tar, _0) + let = + call %% Line 835 + 'filename':%% Line 835 + 'join' + (_1, %% Line 835 + Rel) + in let = + apply %% Line 836 + 'check_rel'/3 + (_0, %% Line 836 + RelFile, %% Line 836 + 'false') + in %% Line 837 + case Release of + <{'release',_24,Vsn,_25,_26,_27}> when 'true' -> + do %% Line 838 + case call 'lists':'keysearch' + (Vsn, 3, _3) of + %% Line 839 + <{'value',_28}> when 'true' -> + call 'erlang':'throw' + ({'error',{'existing_release',Vsn}}) + %% Line 840 + <_29> when 'true' -> + 'ok' + end + do %% Line 842 + apply 'extract_tar'/2 + (_0, Tar) + %% Line 843 + case Release of + <{'release',_30,_31,_32,_33,_34}> when 'true' -> + let <_15> = + call 'erlang':'setelement' + (6, Release, 'unpacked') + in let = + [_15|_3] + in do %% Line 844 + apply 'write_releases'/3 + (_1, NewReleases, 'false') + let = + call %% Line 849 + 'filename':%% Line 849 + 'join' + (%% Line 849 + [_1|[Vsn|[]]]) + in do %% Line 850 + apply 'copy_file'/3 + (RelFile, Dir, 'false') + do %% Line 853 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'delete' + -| ['result_not_wanted'] ) + (Tar) + -| ['result_not_wanted'] ) + do %% Line 854 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'delete' + -| ['result_not_wanted'] ) + (RelFile) + -| ['result_not_wanted'] ) + %% Line 856 + {'ok',NewReleases,Vsn} + ( <_35> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + ( <_11> when 'true' -> + primop 'match_fail' + ({'badmatch',_11}) + -| ['compiler_generated'] ) + end +'check_rel'/3 = + %% Line 858 + fun (_0,_1,_2) -> + %% Line 859 + apply 'check_rel'/4 + (_0, _1, [], _2) +'check_rel'/4 = + %% Line 860 + fun (_0,_1,_2,_3) -> + %% Line 861 + case apply 'consult'/2 + (_1, _3) of + %% Line 862 + <{'ok',[RelData|[]]}> when 'true' -> + %% Line 863 + apply 'check_rel_data'/4 + (RelData, _0, _2, _3) + %% Line 864 + <{'ok',_9}> when 'true' -> + %% Line 865 + call 'erlang':'throw' + ({'error',{'bad_rel_file',_1}}) + %% Line 866 + <{'error',Reason}> + when call 'erlang':'is_tuple' + (Reason) -> + %% Line 867 + call 'erlang':'throw' + ({'error',{'bad_rel_file',_1}}) + %% Line 868 + <{'error',FileError}> when 'true' -> + %% Line 869 + call 'erlang':'throw' + ({'error',{FileError,_1}}) + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end +'check_rel_data'/4 = + %% Line 872 + fun (_0,_1,_2,_3) -> + case <_0,_1,_2,_3> of + <{'release',{Name,Vsn},{'erts',EVsn},Libs},Root,LibDirs,%% Line 873 + Masters> when 'true' -> + let <_13> = + fun (_11) -> + let = + call %% Line 876 + 'erlang':%% Line 876 + 'element' + (%% Line 876 + 1, %% Line 875 + _11) + in let = + call %% Line 877 + 'erlang':%% Line 877 + 'element' + (%% Line 877 + 2, %% Line 875 + _11) + in let = + call %% Line 878 + 'lists':%% Line 878 + 'concat' + (%% Line 878 + [Lib|[[45]|[LibVsn|[]]]]) + in let <_9> = + case %% Line 880 + call 'lists':'keysearch' + (Lib, 1, LibDirs) of + %% Line 881 + <{'value',{_X_Lib,_X_Vsn,Dir}}> when 'true' -> + let = + call %% Line 882 + 'filename':%% Line 882 + 'join' + (%% Line 882 + Dir, %% Line 882 + LibName) + in do %% Line 883 + apply 'check_path'/2 + (Path, Masters) + %% Line 884 + Path + %% Line 885 + <_19> when 'true' -> + %% Line 886 + call 'filename':'join' + ([Root|[[108|[105|[98]]]|[LibName|[]]]]) + end + in %% Line 888 + {Lib,LibVsn,_9} + in let = + call %% Line 875 + 'lists':%% Line 875 + 'map' + (_13, %% Line 890 + Libs) + in %% Line 891 + {'release',Name,Vsn,EVsn,%% Line 892 + Libs2,%% Line 892 + 'unpacking'} + %% Line 893 + when 'true' -> + %% Line 894 + call 'erlang':'throw' + ({'error',{'bad_rel_data',RelData}}) + end +'check_path'/1 = + %% Line 896 + fun (_0) -> + let <_1> = + call %% Line 897 + 'file':%% Line 897 + 'read_file_info' + (_0) + in %% Line 897 + apply 'check_path_response'/2 + (_0, _1) +'check_path'/2 = + %% Line 898 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + apply 'check_path'/1 + (Path) + %% Line 899 + when 'true' -> + apply 'check_path_master'/2 + (Masters, Path) + end +'check_path_master'/2 = + %% Line 906 + fun (_0,_1) -> + case <_0,_1> of + <[Master|Ms],Path> when 'true' -> + %% Line 907 + case call 'rpc':'call' + (Master, 'file', 'read_file_info', [Path|[]]) of + %% Line 908 + <{'badrpc',_5}> when 'true' -> + apply 'consult_master'/2 + (Ms, Path) + %% Line 909 + when 'true' -> + apply 'check_path_response'/2 + (Path, Res) + end + %% Line 911 + <[],_X_Path> when 'true' -> + %% Line 912 + {'error','no_master'} + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'check_path_master',2}}] ) + -| ['compiler_generated'] ) + end +'check_path_response'/2 = + %% Line 914 + fun (_0,_1) -> + case <_0,_1> of + <_X_Path,{'ok',Info = {'file_info',_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22}}> + when ( try + let <_6> = + call 'erlang':'element' + (3, Info) + in call 'erlang':'=:=' + (_6, 'directory') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 915 + 'ok' + %% Line 916 + when 'true' -> + %% Line 917 + call 'erlang':'throw' + ({'error',{'not_a_directory',Path}}) + %% Line 918 + when 'true' -> + %% Line 919 + call 'erlang':'throw' + ({'error',{'no_such_directory',Path}}) + ( <_9,_8> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_9,_8}) + -| [{'function_name',{'check_path_response',2}}] ) + -| ['compiler_generated'] ) + end +'do_check_install_release'/5 = + %% Line 921 + fun (_0,_1,_2,_3,_4) -> + %% Line 922 + case call 'lists':'keysearch' + (_1, 3, _2) of + %% Line 923 + <{'value',{'release',_32,_33,_34,_35,'current'}}> when 'true' -> + %% Line 924 + {'error',{'already_installed',_1}} + %% Line 925 + <{'value',Release}> when 'true' -> + let = + apply %% Line 926 + 'get_latest_release'/1 + (_2) + in let = + call %% Line 927 + 'filename':%% Line 927 + 'join' + (%% Line 927 + [_0|[_1|[]]]) + in let <_7> = + call %% Line 928 + 'filename':%% Line 928 + 'join' + (%% Line 928 + VsnDir, %% Line 928 + [115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]) + in do %% Line 928 + apply 'check_file'/3 + (_7, 'regular', _3) + let <_8> = + call %% Line 929 + 'filename':%% Line 929 + 'join' + (%% Line 929 + VsnDir, %% Line 929 + [114|[101|[108|[117|[112]]]]]) + in let = + apply %% Line 929 + 'check_opt_file'/3 + (_8, %% Line 929 + 'regular', _3) + in let <_10> = + call %% Line 930 + 'filename':%% Line 930 + 'join' + (%% Line 930 + VsnDir, %% Line 930 + [115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]) + in do %% Line 930 + apply 'check_opt_file'/3 + (_10, 'regular', _3) + %% Line 933 + ( case Release of + ( <( {'release',_36,_37,_38,_rec39,_39} + -| ['compiler_generated'] )> when 'true' -> + let <_17> = + fun (_15) -> + %% Line 934 + case _15 of + <{_X_Lib,_X_LibVsn,LibDir}> when 'true' -> + do %% Line 935 + apply 'check_file'/3 + (LibDir, 'directory', _3) + let = + call %% Line 936 + 'filename':%% Line 936 + 'join' + (%% Line 936 + LibDir, %% Line 936 + [101|[98|[105|[110]]]]) + in %% Line 937 + apply 'check_file'/3 + (Ebin, 'directory', _3) + ( <_16> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_16}) + -| [{'function_name',{'-do_check_install_release/5-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in do %% Line 934 + call 'lists':'foreach' + (_17, _rec39) + %% Line 941 + case <> of + %% Line 942 + <> + when ( call 'erlang':'=:=' + (IsRelup, + 'true') + -| ['compiler_generated'] ) -> + %% Line 943 + case apply 'get_rh_script'/4 + (LatestRelease, Release, _0, _3) of + %% Line 944 + <{'ok',{CurrentVsn,Descr,Script}}> when 'true' -> + let <_18> = + catch + %% Line 945 + apply 'check_script'/2 + (Script, _rec39) + in %% Line 945 + case _18 of + %% Line 946 + <{'ok',SoftPurgeMods}> + when call 'erlang':'=:=' + (_4, + 'true') -> + %% Line 950 + case %% Line 951 + call 'release_handler_1':'check_old_processes' + (%% Line 952 + Script, %% Line 952 + 'brutal_purge') of + <{'ok',BrutalPurgeMods}> when 'true' -> + let <_23> = + fun (_21) -> + catch + %% Line 955 + call 'erlang':'purge_module' + (_21) + in let <_20> = + call %% Line 957 + 'erlang':%% Line 957 + '++' + (%% Line 957 + SoftPurgeMods, %% Line 957 + BrutalPurgeMods) + in do %% Line 953 + call 'lists':'foreach' + (_23, _20) + %% Line 958 + {'ok',CurrentVsn,Descr} + ( <_19> when 'true' -> + primop 'match_fail' + ({'badmatch',_19}) + -| ['compiler_generated'] ) + end + %% Line 959 + <{'ok',_41}> when 'true' -> + %% Line 960 + {'ok',CurrentVsn,Descr} + %% Line 961 + when 'true' -> + %% Line 962 + Else + end + %% Line 964 + when 'true' -> + %% Line 965 + Error + end + %% Line 967 + <> when 'true' -> + %% Line 968 + {'ok',_1,[]} + end + -| ['compiler_generated'] ) + ( <_40> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 970 + <_42> when 'true' -> + %% Line 971 + {'error',{'no_such_release',_1}} + end +'do_install_release'/3 = + %% Line 974 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <{'state',_28,%% Line 975 + RootDir,%% Line 976 + RelDir,%% Line 976 + Releases,_29,StartPrg,%% Line 977 + Masters,_30,%% Line 978 + Static,_31},%% Line 979 + Vsn,%% Line 979 + Opts> when 'true' -> + %% Line 980 + case call 'lists':'keysearch' + (Vsn, 3, Releases) of + %% Line 981 + <{'value',{'release',_32,_33,_34,_35,'current'}}> when 'true' -> + %% Line 982 + {'error',{'already_installed',Vsn}} + %% Line 983 + <{'value',Release}> when 'true' -> + let = + apply %% Line 984 + 'get_latest_release'/1 + (%% Line 984 + Releases) + in %% Line 985 + case apply 'get_rh_script'/4 + (LatestRelease, Release, RelDir, Masters) of + %% Line 986 + <{'ok',{_X_CurrentVsn,_X_Descr,['restart_new_emulator'|_X_Script]}}> + when %% Line 987 + call 'erlang':'=:=' + (Static, + 'true') -> + %% Line 988 + call 'erlang':'throw' + ('static_emulator') + %% Line 989 + <{'ok',{CurrentVsn,Descr,['restart_new_emulator'|_X_Script]}}> when 'true' -> + %% Line 997 + case %% Line 998 + apply 'new_emulator_make_tmp_release'/5 + (LatestRelease, Release, %% Line 999 + RelDir, %% Line 999 + Opts, %% Line 999 + Masters) of + <{TmpVsn,TmpRelease}> when 'true' -> + let = + [%% Line 1000 + TmpRelease|%% Line 1000 + Releases] + in do %% Line 1004 + apply 'prepare_restart_new_emulator'/7 + (StartPrg, RootDir, %% Line 1005 + RelDir, %% Line 1005 + TmpVsn, %% Line 1005 + TmpRelease, %% Line 1006 + NReleases, %% Line 1006 + Masters) + %% Line 1007 + {'restart_new_emulator',CurrentVsn,Descr} + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end + %% Line 1008 + <{'ok',{CurrentVsn,Descr,Script}}> when 'true' -> + %% Line 1013 + ( case LatestRelease of + ( <( {'release',_36,_rec40,_37,_38,_39} + -| ['compiler_generated'] )> when 'true' -> + %% Line 1014 + ( case LatestRelease of + ( <( {'release',_41,_42,_rec41,_43,_44} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'new_emulator_rm_tmp_release'/6 + (_rec40, _rec41, %% Line 1015 + Vsn, %% Line 1015 + RelDir, %% Line 1015 + Releases, %% Line 1015 + Masters) + in do %% Line 1018 + apply 'mon_nodes'/1 + ('true') + let = + call %% Line 1019 + 'application_controller':%% Line 1019 + 'prep_config_change' + () + in let = + apply %% Line 1020 + 'change_appl_data'/3 + (%% Line 1020 + RelDir, %% Line 1020 + Release, %% Line 1020 + Masters) + in %% Line 1021 + ( case Release of + ( <( {'release',_46,_47,_48,_rec42,_49} + -| ['compiler_generated'] )> when 'true' -> + %% Line 1022 + ( case LatestRelease of + ( <( {'release',_51,_52,_53,_rec43,_54} + -| ['compiler_generated'] )> when 'true' -> + %% Line 1023 + ( case Release of + ( <( {'release',_56,_57,_58,_rec44,_59} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'get_new_libs'/2 + (_rec43, _rec44) + in %% Line 1024 + case apply 'eval_script'/5 + (Script, Apps, _rec42, NewLibs, Opts) of + %% Line 1025 + <{'ok',Unpurged}> when 'true' -> + do %% Line 1026 + call 'application_controller':'config_change' + (EnvBefore) + do %% Line 1027 + apply 'mon_nodes'/1 + ('false') + let = + apply %% Line 1028 + 'set_status'/3 + (%% Line 1028 + Vsn, %% Line 1028 + 'current', %% Line 1028 + NReleases) + in %% Line 1029 + {'ok',NReleases1,Unpurged,CurrentVsn,Descr} + %% Line 1030 + <'restart_emulator'> + when call 'erlang':'=:=' + (Static, + 'true') -> + %% Line 1031 + call 'erlang':'throw' + ('static_emulator') + %% Line 1032 + <'restart_emulator'> when 'true' -> + do %% Line 1033 + apply 'mon_nodes'/1 + ('false') + do %% Line 1034 + apply 'prepare_restart_new_emulator'/7 + (StartPrg, RootDir, %% Line 1035 + RelDir, %% Line 1035 + Vsn, %% Line 1035 + Release, %% Line 1036 + NReleases, %% Line 1036 + Masters) + %% Line 1037 + {'restart_emulator',CurrentVsn,Descr} + %% Line 1038 + when 'true' -> + do %% Line 1039 + call 'application_controller':'config_change' + (EnvBefore) + do %% Line 1040 + apply 'mon_nodes'/1 + ('false') + %% Line 1041 + Else + end + -| ['compiler_generated'] ) + ( <_60> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_55> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_50> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_45> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_40> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 1043 + when 'true' -> + %% Line 1044 + Error + end + %% Line 1046 + <_61> when 'true' -> + %% Line 1047 + {'error',{'no_such_release',Vsn}} + end + ( <_27,_26,_25> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_27,_26,_25}) + -| [{'function_name',{'do_install_release',3}}] ) + -| ['compiler_generated'] ) + end +'new_emulator_make_tmp_release'/5 = + %% Line 1050 + fun (_0,_1,_2,_3,_4) -> + %% Line 1051 + ( case _0 of + ( <( {'release',_31,_rec45,_32,_33,_34} + -| ['compiler_generated'] )> when 'true' -> + %% Line 1052 + ( case _1 of + ( <( {'release',_36,_rec46,_37,_38,_39} + -| ['compiler_generated'] )> when 'true' -> + let = + call %% Line 1053 + 'erlang':%% Line 1053 + '++' + (%% Line 1053 + [95|[95|[110|[101|[119|[95|[101|[109|[117|[108|[97|[116|[111|[114|[95|[95]]]]]]]]]]]]]]]], _rec45) + in %% Line 1054 + ( case _1 of + ( <( {'release',_41,_42,_43,_rec47,_44} + -| ['compiler_generated'] )> when 'true' -> + case apply 'get_base_libs'/1 + (_rec47) of + %% Line 1055 + <{'ok',{Kernel,Stdlib,Sasl},_46}> when 'true' -> + %% Line 1056 + ( case _0 of + ( <( {'release',_47,_48,_49,_rec48,_50} + -| ['compiler_generated'] )> when 'true' -> + case apply 'get_base_libs'/1 + (_rec48) of + %% Line 1057 + <{'ok',_52,RestLibs}> when 'true' -> + %% Line 1058 + ( case _1 of + ( <( {'release',_53,_54,_rec49,_55,_56} + -| ['compiler_generated'] )> when 'true' -> + let = + [%% Line 1059 + Kernel|%% Line 1059 + [Stdlib|[Sasl|RestLibs]]] + in %% Line 1063 + case _0 of + <{'release',_rec51,_rec52,_rec53,_rec54,_rec55}> when 'true' -> + let <_22> = + {'release',_rec51,TmpVsn,_rec49,TmpLibs,'unpacked'} + in do %% Line 1064 + apply 'new_emulator_make_hybrid_boot'/6 + (_rec45, _rec46, TmpVsn, _2, _3, _4) + do %% Line 1066 + apply 'new_emulator_make_hybrid_config'/5 + (_rec45, _rec46, TmpVsn, _2, _4) + %% Line 1068 + {TmpVsn,_22} + ( <_58> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_57> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 1069 + <{'error',{'missing',Missing}}> when 'true' -> + %% Line 1070 + call 'erlang':'throw' + ({'error',{'missing_base_app',_rec45,Missing}}) + ( <_24> when 'true' -> + primop 'match_fail' + ({'case_clause',_24}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_51> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 1072 + <{'error',{'missing',Missing}}> when 'true' -> + %% Line 1073 + call 'erlang':'throw' + ({'error',{'missing_base_app',_rec46,Missing}}) + ( <_25> when 'true' -> + primop 'match_fail' + ({'case_clause',_25}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_45> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_40> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_35> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) +'get_base_libs'/1 = + %% Line 1079 + fun (_0) -> + %% Line 1080 + apply 'get_base_libs'/5 + (_0, 'undefined', 'undefined', 'undefined', []) +'get_base_libs'/5 = + %% Line 1081 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + <[Kernel = {'kernel',_11,_12}|Libs],'undefined',Stdlib,Sasl,Rest> when 'true' -> + %% Line 1082 + apply 'get_base_libs'/5 + (Libs, Kernel, Stdlib, Sasl, Rest) + %% Line 1083 + <[Stdlib = {'stdlib',_13,_14}|Libs],Kernel,'undefined',Sasl,Rest> when 'true' -> + %% Line 1084 + apply 'get_base_libs'/5 + (Libs, Kernel, Stdlib, Sasl, Rest) + %% Line 1085 + <[Sasl = {'sasl',_15,_16}|Libs],Kernel,Stdlib,'undefined',Rest> when 'true' -> + %% Line 1086 + apply 'get_base_libs'/5 + (Libs, Kernel, Stdlib, Sasl, Rest) + %% Line 1087 + <[Lib|Libs],Kernel,Stdlib,Sasl,Rest> when 'true' -> + %% Line 1088 + apply 'get_base_libs'/5 + (Libs, Kernel, Stdlib, Sasl, [Lib|Rest]) + %% Line 1089 + <[],'undefined',_X_Stdlib,_X_Sasl,_X_Rest> when 'true' -> + %% Line 1090 + {'error',{'missing','kernel'}} + %% Line 1091 + <[],_X_Kernel,'undefined',_X_Sasl,_X_Rest> when 'true' -> + %% Line 1092 + {'error',{'missing','stdlib'}} + %% Line 1093 + <[],_X_Kernel,_X_Stdlib,'undefined',_X_Rest> when 'true' -> + %% Line 1094 + {'error',{'missing','sasl'}} + %% Line 1095 + <[],Kernel,Stdlib,Sasl,Rest> when 'true' -> + let <_5> = + call %% Line 1096 + 'lists':%% Line 1096 + 'reverse' + (%% Line 1096 + Rest) + in %% Line 1096 + {'ok',{Kernel,Stdlib,Sasl},_5} + ( <_10,_9,_8,_7,_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_10,_9,_8,_7,_6}) + -| [{'function_name',{'get_base_libs',5}}] ) + -| ['compiler_generated'] ) + end +'new_emulator_make_hybrid_boot'/6 = + %% Line 1098 + fun (_0,_1,_2,_3,_4,_5) -> + let = + call %% Line 1099 + 'filename':%% Line 1099 + 'join' + (%% Line 1099 + [_3|[_0|[[115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]]]]) + in let = + call %% Line 1100 + 'filename':%% Line 1100 + 'join' + (%% Line 1100 + [_3|[_1|[[115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]]]]) + in let = + call %% Line 1101 + 'filename':%% Line 1101 + 'join' + (%% Line 1101 + [_3|[_2|[[115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]]]]) + in do %% Line 1102 + apply 'ensure_dir'/2 + (TmpBootFile, _5) + let = + [_1|%% Line 1103 + [_4|[]]] + in %% Line 1104 + case apply 'read_file'/2 + (FromBootFile, _5) of + <{'ok',FromBoot}> when 'true' -> + %% Line 1105 + case apply 'read_file'/2 + (ToBootFile, _5) of + <{'ok',ToBoot}> when 'true' -> + %% Line 1106 + case call 'systools_make':'make_hybrid_boot' + (_2, FromBoot, ToBoot, Args) of + %% Line 1107 + <{'ok',TmpBoot}> when 'true' -> + %% Line 1108 + apply 'write_file'/3 + (TmpBootFile, TmpBoot, _5) + %% Line 1109 + <{'error',Reason}> when 'true' -> + %% Line 1110 + call 'erlang':'throw' + ({'error',{'could_not_create_hybrid_boot',Reason}}) + ( <_12> when 'true' -> + primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end + ( <_11> when 'true' -> + primop 'match_fail' + ({'badmatch',_11}) + -| ['compiler_generated'] ) + end + ( <_10> when 'true' -> + primop 'match_fail' + ({'badmatch',_10}) + -| ['compiler_generated'] ) + end +'new_emulator_make_hybrid_config'/5 = + %% Line 1113 + fun (_0,_1,_2,_3,_4) -> + let = + call %% Line 1114 + 'filename':%% Line 1114 + 'join' + (%% Line 1114 + [_3|[_0|[[115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]]]]) + in let = + call %% Line 1115 + 'filename':%% Line 1115 + 'join' + (%% Line 1115 + [_3|[_1|[[115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]]]]) + in let = + call %% Line 1116 + 'filename':%% Line 1116 + 'join' + (%% Line 1116 + [_3|[_2|[[115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]]]]) + in let <_9> = + case %% Line 1119 + apply 'consult'/2 + (FromFile, _4) of + %% Line 1120 + <{'ok',[FC|[]]}> when 'true' -> + %% Line 1121 + FC + %% Line 1122 + <{'error',Error1}> when 'true' -> + do %% Line 1123 + call 'io':'format' + ([87|[97|[114|[110|[105|[110|[103|[58|[32|[126|[119|[32|[99|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[126|[116|[112|[58|[32|[126|[116|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 1124 + ['release_handler'|[FromFile|[Error1|[]]]]) + %% Line 1125 + [] + ( <_8> when 'true' -> + %% Line 1119 + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end + in let <_17> = + case %% Line 1129 + apply 'consult'/2 + (ToFile, _4) of + %% Line 1130 + <{'ok',[ToConfig|[]]}> when 'true' -> + %% Line 1131 + ( letrec + 'lc$^0'/1 = + fun (_13) -> + case _13 of + <[App|_12]> when 'true' -> + let <_14> = + call 'lists':'keyfind' + (App, 1, ToConfig) + in let <_15> = + apply 'lc$^0'/1 + (_12) + in ( [_14|_15] + -| ['compiler_generated'] ) + <[]> when 'true' -> + [] + ( <_30> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_30}) + -| [{'function_name',{'lc$^0',1}}] ) + -| ['compiler_generated'] ) + end + in apply 'lc$^0'/1 + (['kernel'|['stdlib'|['sasl']]]) + -| ['list_comprehension'] ) + %% Line 1132 + <{'error',Error2}> when 'true' -> + do %% Line 1133 + call 'io':'format' + ([87|[97|[114|[110|[105|[110|[103|[58|[32|[126|[119|[32|[99|[97|[110|[110|[111|[116|[32|[114|[101|[97|[100|[32|[126|[116|[112|[58|[32|[126|[116|[112|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 1134 + ['release_handler'|[ToFile|[Error2|[]]]]) + %% Line 1135 + ['false'|['false'|['false']]] + ( <_16> when 'true' -> + %% Line 1129 + primop 'match_fail' + ({'case_clause',_16}) + -| ['compiler_generated'] ) + end + in %% Line 1128 + case _17 of + <[Kernel|[Stdlib|[Sasl|[]]]]> when 'true' -> + let = + apply %% Line 1138 + 'replace_config'/3 + (%% Line 1138 + 'kernel', _9, %% Line 1138 + Kernel) + in let = + apply %% Line 1139 + 'replace_config'/3 + (%% Line 1139 + 'stdlib', %% Line 1139 + Config1, %% Line 1139 + Stdlib) + in let = + apply %% Line 1140 + 'replace_config'/3 + (%% Line 1140 + 'sasl', %% Line 1140 + Config2, %% Line 1140 + Sasl) + in let <_22> = + call %% Line 1143 + 'epp':%% Line 1143 + 'encoding_to_string' + (%% Line 1143 + 'utf8') + in let = + call %% Line 1142 + 'io_lib':%% Line 1142 + 'format' + (%% Line 1142 + [37|[37|[32|[126|[115|[126|[110|[126|[116|[112|[46|[126|[110]]]]]]]]]]]]], %% Line 1143 + [_22|[Config3|[]]]) + in let <_24> = + call %% Line 1144 + 'unicode':%% Line 1144 + 'characters_to_binary' + (%% Line 1144 + ConfigStr) + in %% Line 1144 + apply 'write_file'/3 + (TmpFile, _24, _4) + ( <_18> when 'true' -> + primop 'match_fail' + ({'badmatch',_18}) + -| ['compiler_generated'] ) + end +'replace_config'/3 = + %% Line 1152 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 1153 + call 'lists':'keydelete' + (App, 1, Config) + %% Line 1154 + when 'true' -> + %% Line 1155 + call 'lists':'keystore' + (App, 1, Config, AppConfig) + end +'new_emulator_rm_tmp_release'/6 = + %% Line 1158 + fun (_0,_1,_2,_3,_4,_5) -> + case <_0,_1,_2,_3,_4,_5> of + when 'true' -> + do %% Line 1160 + case call 'os':'type' + () of + %% Line 1161 + <{'win32','nt'}> when 'true' -> + %% Line 1162 + apply 'rename_tmp_service'/3 + (EVsn, TmpVsn, NewVsn) + %% Line 1163 + <_15> when 'true' -> + 'ok' + end + let <_7> = + call %% Line 1166 + 'filename':%% Line 1166 + 'join' + (%% Line 1166 + RelDir, %% Line 1166 + TmpVsn) + in do %% Line 1166 + apply 'remove_dir'/2 + (_7, Masters) + %% Line 1167 + call 'lists':'keydelete' + (TmpVsn, 3, Releases) + %% Line 1168 + <_16,_17,_18,_19,Releases,_20> when 'true' -> + %% Line 1169 + Releases + end +'rename_tmp_service'/3 = + %% Line 1172 + fun (_0,_1,_2) -> + let <_4> = + call %% Line 1173 + 'erlang':%% Line 1173 + 'node' + () + in let <_5> = + call %% Line 1173 + 'erlang':%% Line 1173 + 'atom_to_list' + (_4) + in let <_6> = + call %% Line 1173 + 'string':%% Line 1173 + 'lexemes' + (_5, %% Line 1173 + [64]) + in let <_7> = + call %% Line 1173 + 'erlang':%% Line 1173 + 'hd' + (_6) + in let <_3> = + [95|_1] + in let = + call %% Line 1173 + 'erlang':%% Line 1173 + '++' + (_7, _3) + in let <_10> = + call %% Line 1174 + 'erlang':%% Line 1174 + 'node' + () + in let <_11> = + call %% Line 1174 + 'erlang':%% Line 1174 + 'atom_to_list' + (_10) + in let <_12> = + call %% Line 1174 + 'string':%% Line 1174 + 'lexemes' + (_11, %% Line 1174 + [64]) + in let <_13> = + call %% Line 1174 + 'erlang':%% Line 1174 + 'hd' + (_12) + in let <_9> = + [95|_2] + in let = + call %% Line 1174 + 'erlang':%% Line 1174 + '++' + (_13, _9) + in do %% Line 1175 + case call 'erlsrv':'get_service' + (_0, ToName) of + %% Line 1176 + <{'error',_X_Error}> when 'true' -> + 'ok' + %% Line 1178 + <_X_Data> when 'true' -> + %% Line 1179 + case call 'erlsrv':'remove_service' + (ToName) of + <{'ok',_20}> when 'true' -> + 'ok' + ( <_15> when 'true' -> + primop 'match_fail' + ({'badmatch',_15}) + -| ['compiler_generated'] ) + end + end + %% Line 1182 + apply 'rename_service'/3 + (_0, FromName, ToName) +'rename_service'/3 = + %% Line 1186 + fun (_0,_1,_2) -> + %% Line 1187 + case call 'erlsrv':'rename_service' + (_0, _1, _2) of + %% Line 1188 + <{'ok',_8}> when 'true' -> + %% Line 1189 + case call 'erlsrv':'get_service' + (_0, _2) of + %% Line 1190 + <_@r0 = {'error',Error1}> when 'true' -> + %% Line 1191 + call 'erlang':'throw' + (_@r0) + %% Line 1192 + <_X_Data2> when 'true' -> + %% Line 1193 + 'ok' + end + %% Line 1195 + when 'true' -> + %% Line 1196 + call 'erlang':'throw' + ({'error',{'service_rename_failed',Error2}}) + end +'do_make_services_permanent'/4 = + %% Line 1205 + fun (_0,_1,_2,_3) -> + let <_5> = + call %% Line 1206 + 'erlang':%% Line 1206 + 'node' + () + in let <_6> = + call %% Line 1206 + 'erlang':%% Line 1206 + 'atom_to_list' + (_5) + in let <_7> = + call %% Line 1206 + 'string':%% Line 1206 + 'lexemes' + (_6, %% Line 1206 + [64]) + in let <_8> = + call %% Line 1206 + 'erlang':%% Line 1206 + 'hd' + (_7) + in let <_4> = + [95|_0] + in let = + call %% Line 1207 + 'erlang':%% Line 1207 + '++' + (_8, _4) + in let <_11> = + call %% Line 1208 + 'erlang':%% Line 1208 + 'node' + () + in let <_12> = + call %% Line 1208 + 'erlang':%% Line 1208 + 'atom_to_list' + (_11) + in let <_13> = + call %% Line 1208 + 'string':%% Line 1208 + 'lexemes' + (_12, %% Line 1208 + [64]) + in let <_14> = + call %% Line 1208 + 'erlang':%% Line 1208 + 'hd' + (_13) + in let <_10> = + [95|_1] + in let = + call %% Line 1209 + 'erlang':%% Line 1209 + '++' + (_14, _10) + in %% Line 1210 + case call 'erlsrv':'get_service' + (_3, Name) of + %% Line 1211 + <{'error',_X_Error}> when 'true' -> + let <_16> = + call %% Line 1214 + 'os':%% Line 1214 + 'getenv' + (%% Line 1214 + [69|[82|[76|[83|[82|[86|[95|[83|[69|[82|[86|[73|[67|[69|[95|[78|[65|[77|[69]]]]]]]]]]]]]]]]]]]) + in %% Line 1214 + case <> of + %% Line 1215 + <> + when call 'erlang':'==' + (_16, + PermName) -> + do %% Line 1216 + apply 'rename_service'/3 + (_3, PermName, Name) + do %% Line 1221 + call 'os':'putenv' + ([69|[82|[76|[83|[82|[86|[95|[83|[69|[82|[86|[73|[67|[69|[95|[78|[65|[77|[69]]]]]]]]]]]]]]]]]]], Name) + %% Line 1225 + call 'heart':'cycle' + () + %% Line 1226 + <> when 'true' -> + %% Line 1227 + call 'erlang':'throw' + ({'error','service_name_missmatch'}) + end + %% Line 1229 + when 'true' -> + let = + call %% Line 1230 + 'erlsrv':%% Line 1230 + 'new_service' + (%% Line 1230 + Name, %% Line 1230 + Data, %% Line 1230 + []) + in %% Line 1231 + case call 'erlsrv':'store_service' + (_3, UpdData) of + %% Line 1232 + <'ok'> when 'true' -> + %% Line 1233 + case call 'erlsrv':'disable_service' + (_2, PermName) of + <{'ok',_29}> when 'true' -> + %% Line 1234 + case call 'erlsrv':'enable_service' + (_3, Name) of + <{'ok',_30}> when 'true' -> + %% Line 1235 + case call 'erlsrv':'remove_service' + (PermName) of + <{'ok',_31}> when 'true' -> + do %% Line 1237 + call 'os':'putenv' + ([69|[82|[76|[83|[82|[86|[95|[83|[69|[82|[86|[73|[67|[69|[95|[78|[65|[77|[69]]]]]]]]]]]]]]]]]]], Name) + let <_32> = + call %% Line 1238 + 'heart':%% Line 1238 + 'cycle' + () + in %% Line 1238 + case _32 of + <'ok'> when 'true' -> + ( _32 + -| ['compiler_generated'] ) + ( <_22> when 'true' -> + primop 'match_fail' + ({'badmatch',_22}) + -| ['compiler_generated'] ) + end + ( <_21> when 'true' -> + primop 'match_fail' + ({'badmatch',_21}) + -| ['compiler_generated'] ) + end + ( <_20> when 'true' -> + primop 'match_fail' + ({'badmatch',_20}) + -| ['compiler_generated'] ) + end + ( <_19> when 'true' -> + primop 'match_fail' + ({'badmatch',_19}) + -| ['compiler_generated'] ) + end + %% Line 1239 + when 'true' -> + %% Line 1240 + call 'erlang':'throw' + (Error4) + end + end +'do_make_permanent'/2 = + %% Line 1244 + fun (_0,_1) -> + case <_0,_1> of + <{'state',%% Line 1245 + Unpurged,_30,%% Line 1245 + RelDir,Releases,_31,_32,%% Line 1246 + Masters,_33,%% Line 1247 + Static,_34},%% Line 1248 + Vsn> when 'true' -> + %% Line 1249 + case call 'lists':'keysearch' + (Vsn, 3, Releases) of + %% Line 1250 + <{'value',{'release',_35,_36,EVsn,_37,Status}}> + when %% Line 1251 + try + let <_2> = + call 'erlang':'=/=' + (Status, 'unpacked') + in let <_3> = + call 'erlang':'=/=' + (Status, 'old') + in let <_4> = + call 'erlang':'=/=' + (Status, 'permanent') + in let <_5> = + call 'erlang':'and' + (_3, _4) + in call 'erlang':'and' + (_2, _5) + of -> + Try + catch -> + 'false' -> + let = + call %% Line 1252 + 'filename':%% Line 1252 + 'join' + (%% Line 1252 + [RelDir|[Vsn|[]]]) + in let <_8> = + catch + let <_7> = + call %% Line 1254 + 'filename':%% Line 1254 + 'join' + (%% Line 1254 + Dir, %% Line 1254 + [115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]) + in %% Line 1254 + apply 'check_file'/3 + (_7, %% Line 1255 + 'regular', %% Line 1255 + Masters) + in let <_10> = + case _8 of + %% Line 1256 + <'ok'> when 'true' -> + call 'filename':'join' + (Dir, [115|[121|[115]]]) + %% Line 1257 + <_38> when 'true' -> + 'false' + end + in let = + call %% Line 1259 + 'filename':%% Line 1259 + 'join' + (%% Line 1259 + Dir, %% Line 1259 + [115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]) + in do %% Line 1260 + apply 'check_file'/3 + (Boot, 'regular', Masters) + do %% Line 1261 + apply 'set_permanent_files'/5 + (RelDir, EVsn, Vsn, Masters, Static) + let = + apply %% Line 1262 + 'set_status'/3 + (%% Line 1262 + Vsn, %% Line 1262 + 'permanent', %% Line 1262 + Releases) + in do %% Line 1263 + apply 'write_releases'/3 + (RelDir, NewReleases, Masters) + do %% Line 1264 + case call 'os':'type' + () of + %% Line 1265 + <{'win32','nt'}> when 'true' -> + %% Line 1266 + case %% Line 1267 + call 'lists':'keysearch' + ('permanent', 6, %% Line 1268 + Releases) of + <{'value',PermanentRelease}> when 'true' -> + %% Line 1269 + ( case PermanentRelease of + ( <( {'release',_39,_rec56,_40,_41,_42} + -| ['compiler_generated'] )> when 'true' -> + %% Line 1270 + ( case PermanentRelease of + ( <( {'release',_44,_45,_rec57,_46,_47} + -| ['compiler_generated'] )> when 'true' -> + let <_21> = + catch + %% Line 1271 + apply 'do_make_services_permanent'/4 + (_rec56, %% Line 1272 + Vsn, _rec57, %% Line 1274 + EVsn) + in %% Line 1271 + case _21 of + %% Line 1275 + <{'error',Reason}> when 'true' -> + %% Line 1276 + call 'erlang':'throw' + ({'error',{'service_update_failed',Reason}}) + %% Line 1277 + <_49> when 'true' -> + 'ok' + end + -| ['compiler_generated'] ) + ( <_48> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_43> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_14> when 'true' -> + primop 'match_fail' + ({'badmatch',_14}) + -| ['compiler_generated'] ) + end + %% Line 1280 + <_50> when 'true' -> + 'ok' + end + let <_24> = + call %% Line 1283 + 'filename':%% Line 1283 + 'join' + (%% Line 1283 + Dir, %% Line 1283 + [115|[116|[97|[114|[116]]]]]) + in %% Line 1283 + case call 'init':'make_permanent' + (_24, _10) of + <'ok'> when 'true' -> + let <_26> = + apply %% Line 1284 + 'brutal_purge'/1 + (%% Line 1284 + Unpurged) + in %% Line 1284 + {'ok',NewReleases,_26} + ( <_25> when 'true' -> + primop 'match_fail' + ({'badmatch',_25}) + -| ['compiler_generated'] ) + end + %% Line 1285 + <{'value',{'release',_51,_52,_53,_54,'permanent'}}> when 'true' -> + %% Line 1286 + {'ok',Releases,Unpurged} + %% Line 1287 + <{'value',{'release',_55,_56,_57,_58,Status}}> when 'true' -> + %% Line 1288 + {'error',{'bad_status',Status}} + %% Line 1289 + <'false'> when 'true' -> + %% Line 1290 + {'error',{'no_such_release',Vsn}} + ( <_27> when 'true' -> + primop 'match_fail' + ({'case_clause',_27}) + -| ['compiler_generated'] ) + end + ( <_29,_28> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_29,_28}) + -| [{'function_name',{'do_make_permanent',2}}] ) + -| ['compiler_generated'] ) + end +'do_back_service'/4 = + %% Line 1294 + fun (_0,_1,_2,_3) -> + let <_4> = + call %% Line 1295 + 'erlang':%% Line 1295 + 'node' + () + in let <_5> = + call %% Line 1295 + 'erlang':%% Line 1295 + 'atom_to_list' + (_4) + in let <_6> = + call %% Line 1295 + 'string':%% Line 1295 + 'lexemes' + (_5, %% Line 1295 + [64]) + in let = + call %% Line 1295 + 'erlang':%% Line 1295 + 'hd' + (_6) + in let <_8> = + [95|_0] + in let = + call %% Line 1296 + 'erlang':%% Line 1296 + '++' + (%% Line 1296 + NN, _8) + in let <_10> = + [95|_1] + in let = + call %% Line 1297 + 'erlang':%% Line 1297 + '++' + (%% Line 1297 + NN, _10) + in let <_13> = + case %% Line 1298 + call 'erlsrv':'get_service' + (_3, CurrentName) of + %% Line 1299 + <_@r0 = {'error',Error}> when 'true' -> + %% Line 1300 + call 'erlang':'throw' + (_@r0) + %% Line 1301 + when 'true' -> + %% Line 1302 + call 'erlsrv':'new_service' + (OldName, Data, []) + end + in %% Line 1304 + case ( call ( 'erlsrv' + -| ['result_not_wanted'] ):( 'store_service' + -| ['result_not_wanted'] ) + (_2, _13) + -| ['result_not_wanted'] ) of + %% Line 1305 + <'ok'> when 'true' -> + %% Line 1306 + case ( call ( 'erlsrv' + -| ['result_not_wanted'] ):( 'disable_service' + -| ['result_not_wanted'] ) + (_3, CurrentName) + -| ['result_not_wanted'] ) of + <( {'ok',_35} + -| ['result_not_wanted'] )> when 'true' -> + %% Line 1307 + case ( call ( 'erlsrv' + -| ['result_not_wanted'] ):( 'enable_service' + -| ['result_not_wanted'] ) + (_2, OldName) + -| ['result_not_wanted'] ) of + <( {'ok',_37} + -| ['result_not_wanted'] )> when 'true' -> + let <_20> = + call %% Line 1311 + 'erlsrv':%% Line 1311 + 'erlsrv' + (_2) + in let = + call %% Line 1311 + 'filename':%% Line 1311 + 'nativename' + (_20) + in let <_22> = + call %% Line 1312 + 'erlsrv':%% Line 1312 + 'erlsrv' + (_3) + in let = + call %% Line 1312 + 'filename':%% Line 1312 + 'nativename' + (_22) + in let <_24> = + call %% Line 1314 + 'erlang':%% Line 1314 + '++' + (%% Line 1314 + [32|[115|[116|[97|[114|[116|[32]]]]]]], %% Line 1314 + OldName) + in let <_25> = + call %% Line 1314 + 'erlang':%% Line 1314 + '++' + (%% Line 1314 + OldErlSrv, _24) + in let <_26> = + [32|%% Line 1314 + [38|[32|_25]]] + in let <_27> = + call %% Line 1313 + 'erlang':%% Line 1313 + '++' + (%% Line 1313 + CurrentName, _26) + in let <_28> = + call %% Line 1313 + 'erlang':%% Line 1313 + '++' + (%% Line 1313 + [32|[114|[101|[109|[111|[118|[101|[32]]]]]]]], _27) + in let <_29> = + call %% Line 1313 + 'erlang':%% Line 1313 + '++' + (%% Line 1313 + CurrentErlSrv, _28) + in %% Line 1313 + case call 'heart':'set_cmd' + (_29) of + %% Line 1315 + <'ok'> when 'true' -> + %% Line 1316 + 'ok' + %% Line 1317 + when 'true' -> + %% Line 1318 + call 'erlang':'throw' + ({'error',{'heart:set_cmd() error',Error3}}) + end + ( <_16> when 'true' -> + primop 'match_fail' + ({'badmatch',_16}) + -| ['compiler_generated'] ) + end + ( <_15> when 'true' -> + primop 'match_fail' + ({'badmatch',_15}) + -| ['compiler_generated'] ) + end + %% Line 1308 + when 'true' -> + %% Line 1309 + ( call ( 'erlang' + -| ['result_not_wanted'] ):( 'throw' + -| ['result_not_wanted'] ) + (Error2) + -| ['result_not_wanted'] ) + end +'do_reboot_old_release'/2 = + %% Line 1321 + fun (_0,_1) -> + case <_0,_1> of + <{'state',_15,_16,%% Line 1322 + RelDir,Releases,_17,_18,%% Line 1322 + Masters,_19,%% Line 1323 + Static,_20},%% Line 1324 + Vsn> when 'true' -> + %% Line 1325 + case call 'lists':'keysearch' + (Vsn, 3, Releases) of + %% Line 1326 + <{'value',{'release',_21,_22,EVsn,_23,'old'}}> when 'true' -> + let <_4> = + case %% Line 1327 + call 'os':'type' + () of + %% Line 1328 + <{'win32','nt'}> when 'true' -> + %% Line 1330 + case call 'lists':'keysearch' + ('permanent', %% Line 1331 + 6, %% Line 1332 + Releases) of + %% Line 1333 + <'false'> when 'true' -> + %% Line 1334 + call 'lists':'keysearch' + ('current', %% Line 1335 + 6, %% Line 1336 + Releases) + %% Line 1337 + <{'value',CR}> when 'true' -> + %% Line 1338 + CR + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end + %% Line 1340 + <_24> when 'true' -> + %% Line 1341 + 'false' + end + in do %% Line 1343 + apply 'set_permanent_files'/5 + (RelDir, EVsn, Vsn, Masters, Static) + let = + apply %% Line 1344 + 'set_status'/3 + (%% Line 1344 + Vsn, %% Line 1344 + 'permanent', %% Line 1344 + Releases) + in do %% Line 1345 + apply 'write_releases'/3 + (RelDir, NewReleases, Masters) + do %% Line 1346 + case call 'os':'type' + () of + %% Line 1347 + <{'win32','nt'}> when 'true' -> + %% Line 1350 + ( case _4 of + ( <( {'release',_25,_rec58,_26,_27,_28} + -| ['compiler_generated'] )> when 'true' -> + %% Line 1351 + ( case _4 of + ( <( {'release',_30,_31,_rec59,_32,_33} + -| ['compiler_generated'] )> when 'true' -> + apply 'do_back_service'/4 + (Vsn, _rec58, EVsn, _rec59) + -| ['compiler_generated'] ) + ( <_34> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_29> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 1352 + <_35> when 'true' -> + 'ok' + end + %% Line 1355 + 'ok' + %% Line 1356 + <{'value',{'release',_36,_37,_38,_39,Status}}> when 'true' -> + %% Line 1357 + {'error',{'bad_status',Status}} + %% Line 1358 + <'false'> when 'true' -> + %% Line 1359 + {'error',{'no_such_release',Vsn}} + ( <_12> when 'true' -> + primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end + ( <_14,_13> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_14,_13}) + -| [{'function_name',{'do_reboot_old_release',2}}] ) + -| ['compiler_generated'] ) + end +'set_permanent_files'/5 = + %% Line 1367 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + when 'true' -> + let <_7> = + call %% Line 1368 + 'filename':%% Line 1368 + 'join' + (%% Line 1368 + [RelDir|[[115|[116|[97|[114|[116|[95|[101|[114|[108|[46|[100|[97|[116|[97]]]]]]]]]]]]]]]]) + in let <_5> = + [32|%% Line 1369 + Vsn] + in let <_6> = + call %% Line 1369 + 'erlang':%% Line 1369 + '++' + (%% Line 1369 + EVsn, _5) + in %% Line 1368 + apply 'write_start'/3 + (_7, _6, %% Line 1370 + 'false') + %% Line 1371 + when 'true' -> + let <_10> = + call %% Line 1372 + 'filename':%% Line 1372 + 'join' + (%% Line 1372 + [RelDir|[[115|[116|[97|[114|[116|[95|[101|[114|[108|[46|[100|[97|[116|[97]]]]]]]]]]]]]]]]) + in let <_8> = + [32|%% Line 1373 + Vsn] + in let <_9> = + call %% Line 1373 + 'erlang':%% Line 1373 + '++' + (%% Line 1373 + EVsn, _8) + in %% Line 1372 + apply 'write_start'/3 + (_10, _9, %% Line 1374 + Masters) + %% Line 1375 + when 'true' -> + let = + call %% Line 1376 + 'filename':%% Line 1376 + 'join' + (%% Line 1376 + [RelDir|[Vsn|[]]]) + in %% Line 1377 + apply 'set_static_files'/3 + (VsnDir, RelDir, Masters) + end +'do_remove_service'/1 = + %% Line 1380 + fun (_0) -> + let <_2> = + call %% Line 1384 + 'erlang':%% Line 1384 + 'node' + () + in let <_3> = + call %% Line 1384 + 'erlang':%% Line 1384 + 'atom_to_list' + (_2) + in let <_4> = + call %% Line 1384 + 'string':%% Line 1384 + 'lexemes' + (_3, %% Line 1384 + [64]) + in let <_5> = + call %% Line 1384 + 'erlang':%% Line 1384 + 'hd' + (_4) + in let <_1> = + [95|_0] + in let = + call %% Line 1385 + 'erlang':%% Line 1385 + '++' + (_5, _1) + in %% Line 1386 + case call 'erlsrv':'get_service' + (ServiceName) of + %% Line 1387 + <{'error',_X_Error}> when 'true' -> + %% Line 1388 + 'ok' + %% Line 1389 + <_X_Data> when 'true' -> + %% Line 1390 + case call 'erlsrv':'remove_service' + (ServiceName) of + <{'ok',_10}> when 'true' -> + %% Line 1391 + 'ok' + ( <_7> when 'true' -> + primop 'match_fail' + ({'badmatch',_7}) + -| ['compiler_generated'] ) + end + end +'do_remove_release'/4 = + %% Line 1394 + fun (_0,_1,_2,_3) -> + %% Line 1396 + case call 'lists':'keysearch' + (_2, 3, _3) of + %% Line 1397 + <{'value',{'release',_24,_25,_26,_27,'permanent'}}> when 'true' -> + %% Line 1398 + {'error',{'permanent',_2}} + %% Line 1399 + <{'value',{'release',_28,_29,EVsn,RemoveLibs,_30}}> + when call 'erlang':'=:=' + (_29, + _2) -> + do %% Line 1400 + case call 'os':'type' + () of + %% Line 1401 + <{'win32','nt'}> when 'true' -> + %% Line 1402 + apply 'do_remove_service'/1 + (_2) + %% Line 1403 + <_31> when 'true' -> + 'ok' + end + let = + call %% Line 1407 + 'lists':%% Line 1407 + 'keydelete' + (_2, %% Line 1407 + 3, _3) + in let <_10> = + fun (_7,_6) -> + %% Line 1409 + case <_7,_6> of + <{'release',_32,_33,_34,Libs,_35},Remove> when 'true' -> + %% Line 1410 + apply 'diff_dir'/2 + (Remove, Libs) + ( <_9,_8> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_9,_8}) + -| [{'function_name',{'-do_remove_release/4-fun-0-',2}}] ) + -| ['compiler_generated'] ) + end + in let = + call %% Line 1409 + 'lists':%% Line 1409 + 'foldl' + (_10, %% Line 1411 + RemoveLibs, %% Line 1411 + NewReleases) + in let <_14> = + fun (_12) -> + %% Line 1412 + case _12 of + <{_X_Lib,_X_LVsn,LDir}> when 'true' -> + %% Line 1413 + apply 'remove_file'/1 + (LDir) + ( <_13> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_13}) + -| [{'function_name',{'-do_remove_release/4-fun-1-',1}}] ) + -| ['compiler_generated'] ) + end + in do %% Line 1412 + call 'lists':'foreach' + (_14, %% Line 1414 + RemoveThese) + let <_15> = + call %% Line 1415 + 'filename':%% Line 1415 + 'join' + (%% Line 1415 + [_1|[_2|[]]]) + in do %% Line 1415 + apply 'remove_file'/1 + (_15) + do %% Line 1416 + case call 'lists':'keysearch' + (EVsn, 4, NewReleases) of + %% Line 1417 + <{'value',_36}> when 'true' -> + 'ok' + %% Line 1418 + <'false'> when 'true' -> + let <_16> = + call %% Line 1419 + 'erlang':%% Line 1419 + '++' + (%% Line 1419 + [101|[114|[116|[115|[45]]]]], %% Line 1419 + EVsn) + in let <_17> = + call %% Line 1419 + 'filename':%% Line 1419 + 'join' + (_0, _16) + in %% Line 1419 + apply 'remove_file'/1 + (_17) + ( <_18> when 'true' -> + primop 'match_fail' + ({'case_clause',_18}) + -| ['compiler_generated'] ) + end + do %% Line 1421 + apply 'write_releases'/3 + (_1, NewReleases, 'false') + %% Line 1422 + {'ok',NewReleases} + %% Line 1423 + <'false'> when 'true' -> + %% Line 1424 + {'error',{'no_such_release',_2}} + ( <_19> when 'true' -> + primop 'match_fail' + ({'case_clause',_19}) + -| ['compiler_generated'] ) + end +'do_set_unpacked'/6 = + %% Line 1427 + fun (_0,_1,_2,_3,_4,_5) -> + let = + apply %% Line 1428 + 'check_rel'/4 + (_0, _2, _3, _5) + in %% Line 1429 + case Release of + <{'release',_20,Vsn,_21,_22,_23}> when 'true' -> + do %% Line 1430 + case call 'lists':'keysearch' + (Vsn, 3, _4) of + %% Line 1431 + <{'value',_24}> when 'true' -> + call 'erlang':'throw' + ({'error',{'existing_release',Vsn}}) + %% Line 1432 + <'false'> when 'true' -> + 'ok' + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end + %% Line 1434 + case Release of + <{'release',_25,_26,_27,_28,_29}> when 'true' -> + let <_11> = + call 'erlang':'setelement' + (6, Release, 'unpacked') + in let = + [_11|_4] + in let = + call %% Line 1435 + 'filename':%% Line 1435 + 'join' + (%% Line 1435 + [_1|[Vsn|[]]]) + in do %% Line 1436 + apply 'make_dir'/2 + (VsnDir, _5) + do %% Line 1437 + apply 'write_releases'/3 + (_1, NewReleases, _5) + %% Line 1438 + {'ok',NewReleases,Vsn} + ( <_30> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + ( <_7> when 'true' -> + primop 'match_fail' + ({'badmatch',_7}) + -| ['compiler_generated'] ) + end +'do_set_removed'/4 = + %% Line 1440 + fun (_0,_1,_2,_3) -> + %% Line 1441 + case call 'lists':'keysearch' + (_1, 3, _2) of + %% Line 1442 + <{'value',{'release',_10,_11,_12,_13,'permanent'}}> when 'true' -> + %% Line 1443 + {'error',{'permanent',_1}} + %% Line 1444 + <{'value',_14}> when 'true' -> + let = + call %% Line 1445 + 'lists':%% Line 1445 + 'keydelete' + (_1, %% Line 1445 + 3, _2) + in do %% Line 1446 + apply 'write_releases'/3 + (_0, NewReleases, _3) + %% Line 1447 + {'ok',NewReleases} + %% Line 1448 + <'false'> when 'true' -> + %% Line 1449 + {'error',{'no_such_release',_1}} + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'get_rh_script'/4 = + %% Line 1471 + fun (_0,_1,_2,_3) -> + case <_0,_1,_2,_3> of + <{'release',_9,[95|[95|[110|[101|[119|[95|[101|[109|[117|[108|[97|[116|[111|[114|[95|[95|CurrentVsn]]]]]]]]]]]]]]]],_10,_11,_12},%% Line 1472 + {'release',_13,ToVsn,_14,_15,_16},%% Line 1473 + RelDir,%% Line 1474 + Masters> when 'true' -> + %% Line 1475 + case %% Line 1476 + apply 'do_get_rh_script'/4 + (CurrentVsn, ToVsn, RelDir, Masters) of + <{'ok',{Vsn,Descr,['restart_new_emulator'|Script]}}> when 'true' -> + %% Line 1477 + {'ok',{Vsn,Descr,Script}} + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end + %% Line 1478 + <{'release',_17,CurrentVsn,_18,_19,_20},%% Line 1479 + {'release',_21,ToVsn,_22,_23,_24},%% Line 1480 + RelDir,%% Line 1481 + Masters> when 'true' -> + %% Line 1482 + apply 'do_get_rh_script'/4 + (CurrentVsn, ToVsn, RelDir, Masters) + ( <_8,_7,_6,_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_8,_7,_6,_5}) + -| [{'function_name',{'get_rh_script',4}}] ) + -| ['compiler_generated'] ) + end +'do_get_rh_script'/4 = + %% Line 1484 + fun (_0,_1,_2,_3) -> + let = + call %% Line 1485 + 'filename':%% Line 1485 + 'join' + (%% Line 1485 + [_2|[_1|[[114|[101|[108|[117|[112]]]]]]]]) + in %% Line 1486 + case apply 'try_upgrade'/4 + (_1, _0, Relup, _3) of + %% Line 1487 + <_@r0 = {'ok',RhScript}> when 'true' -> + %% Line 1488 + _@r0 + %% Line 1489 + <_12> when 'true' -> + let = + call %% Line 1490 + 'filename':%% Line 1490 + 'join' + (%% Line 1490 + [_2|[_0|[[114|[101|[108|[117|[112]]]]]]]]) + in %% Line 1491 + case apply 'try_downgrade'/4 + (_1, _0, Relup2, _3) of + %% Line 1492 + <_@r1 = {'ok',RhScript}> when 'true' -> + %% Line 1493 + _@r1 + %% Line 1494 + <_13> when 'true' -> + %% Line 1495 + call 'erlang':'throw' + ({'error',{'no_matching_relup',_1,_0}}) + end + end +'try_upgrade'/4 = + %% Line 1499 + fun (_0,_1,_2,_3) -> + %% Line 1500 + case apply 'consult'/2 + (_2, _3) of + %% Line 1501 + <{'ok',[{_10,ListOfRhScripts,_11}|[]]}> + when call 'erlang':'=:=' + (_10, + _0) -> + %% Line 1502 + case call 'lists':'keysearch' + (_1, 1, ListOfRhScripts) of + %% Line 1503 + <{'value',RhScript}> when 'true' -> + %% Line 1504 + {'ok',RhScript} + %% Line 1505 + <_12> when 'true' -> + %% Line 1506 + 'error' + end + %% Line 1508 + <{'ok',_13}> when 'true' -> + %% Line 1509 + call 'erlang':'throw' + ({'error',{'bad_relup_file',_2}}) + %% Line 1510 + <{'error',Reason}> + when call 'erlang':'is_tuple' + (Reason) -> + %% Line 1511 + call 'erlang':'throw' + ({'error',{'bad_relup_file',_2}}) + %% Line 1512 + <{'error','enoent'}> when 'true' -> + %% Line 1513 + 'error' + %% Line 1514 + <{'error',FileError}> when 'true' -> + %% Line 1515 + call 'erlang':'throw' + ({'error',{FileError,_2}}) + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'try_downgrade'/4 = + %% Line 1518 + fun (_0,_1,_2,_3) -> + %% Line 1519 + case apply 'consult'/2 + (_2, _3) of + %% Line 1520 + <{'ok',[{_10,_11,ListOfRhScripts}|[]]}> + when call 'erlang':'=:=' + (_10, + _1) -> + %% Line 1521 + case call 'lists':'keysearch' + (_0, 1, ListOfRhScripts) of + %% Line 1522 + <{'value',RhScript}> when 'true' -> + %% Line 1523 + {'ok',RhScript} + %% Line 1524 + <_12> when 'true' -> + %% Line 1525 + 'error' + end + %% Line 1527 + <{'ok',_13}> when 'true' -> + %% Line 1528 + call 'erlang':'throw' + ({'error',{'bad_relup_file',_2}}) + %% Line 1529 + <{'error',Reason}> + when call 'erlang':'is_tuple' + (Reason) -> + %% Line 1530 + call 'erlang':'throw' + ({'error',{'bad_relup_file',_2}}) + %% Line 1531 + <{'error',FileError}> when 'true' -> + %% Line 1532 + call 'erlang':'throw' + ({'error',{FileError,_2}}) + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'set_status'/3 = + %% Line 1537 + fun (_0,_1,_2) -> + let <_32> = + fun (_30) -> + %% Line 1538 + case _30 of + + when ( try + let <_7> = + call 'erlang':'element' + (3, Release) + in let <_8> = + call 'erlang':'==' + (_7, _0) + in let <_10> = + call %% Line 1539 + 'erlang':%% Line 1539 + 'element' + (%% Line 1539 + 6, %% Line 1539 + Release) + in let <_11> = + call %% Line 1539 + 'erlang':%% Line 1539 + '=:=' + (_10, %% Line 1539 + 'permanent') + in ( call ( 'erlang' + -| ['compiler_generated'] ):( 'and' + -| ['compiler_generated'] ) + (_8, _11) + -| ['compiler_generated'] ) + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1543 + 'true' + %% Line 1544 + + when ( try + let <_16> = + call 'erlang':'element' + (3, Release) + in call 'erlang':'==' + (_16, _0) + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1545 + case Release of + <{'release',_46,_47,_48,_49,_50}> when 'true' -> + let <_20> = + call 'erlang':'setelement' + (6, Release, _1) + in {'true',_20} + ( <_51> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 1546 + + when ( try + let <_25> = + call 'erlang':'element' + (6, Release) + in call 'erlang':'==' + (_25, _1) + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1547 + case Release of + <{'release',_57,_58,_59,_60,_61}> when 'true' -> + let <_29> = + call 'erlang':'setelement' + (6, Release, 'old') + in {'true',_29} + ( <_62> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 1548 + <_63> when 'true' -> + %% Line 1549 + 'true' + end + in %% Line 1538 + call 'lists':'zf' + (_32, _2) +'get_latest_release'/1 = + %% Line 1552 + fun (_0) -> + %% Line 1553 + case call 'lists':'keysearch' + ('current', 6, _0) of + %% Line 1554 + <{'value',Release}> when 'true' -> + %% Line 1555 + Release + %% Line 1556 + <'false'> when 'true' -> + %% Line 1557 + case %% Line 1558 + call 'lists':'keysearch' + ('permanent', 6, _0) of + <{'value',Release}> when 'true' -> + %% Line 1559 + Release + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'diff_dir'/2 = + %% Line 1563 + fun (_0,_1) -> + case <_0,_1> of + <[H|T],L> when 'true' -> + %% Line 1564 + case apply 'memlib'/2 + (H, L) of + %% Line 1565 + <'true'> when 'true' -> + apply 'diff_dir'/2 + (T, L) + %% Line 1566 + <'false'> when 'true' -> + let <_2> = + apply 'diff_dir'/2 + (T, L) + in [H|_2] + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end + %% Line 1568 + <[],_6> when 'true' -> + [] + ( <_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4}) + -| [{'function_name',{'diff_dir',2}}] ) + -| ['compiler_generated'] ) + end +'memlib'/2 = + %% Line 1570 + fun (_0,_1) -> + case <_0,_1> of + <{Lib,Vsn,_X_Dir},[{_4,_5,_X_Dir2}|_X_T]> + when let <_6> = + call 'erlang':'=:=' + (_4, Lib) + in let <_7> = + call 'erlang':'=:=' + (_5, Vsn) + in call 'erlang':'and' + (_6, _7) -> + 'true' + %% Line 1571 + when 'true' -> + apply 'memlib'/2 + (Lib, T) + %% Line 1572 + <_X_Lib,[]> when 'true' -> + 'false' + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'memlib',2}}] ) + -| ['compiler_generated'] ) + end +'remove_file'/1 = + %% Line 1575 + fun (_0) -> + %% Line 1576 + case call 'file':'read_link_info' + (_0) of + %% Line 1577 + <{'ok',Info = {'file_info',_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28}}> + when ( try + let <_5> = + call 'erlang':'element' + (3, Info) + in call 'erlang':'=:=' + (_5, 'directory') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1578 + case call 'file':'list_dir' + (_0) of + %% Line 1579 + <{'ok',Files}> when 'true' -> + let <_10> = + fun (_8) -> + let <_7> = + call %% Line 1581 + 'filename':%% Line 1581 + 'join' + (_0, %% Line 1580 + _8) + in %% Line 1581 + apply 'remove_file'/1 + (_7) + in do %% Line 1580 + call 'lists':'foreach' + (_10, %% Line 1582 + Files) + %% Line 1583 + case call 'file':'del_dir' + (_0) of + %% Line 1584 + <'ok'> when 'true' -> + 'ok' + %% Line 1585 + <_@r0 = {'error',Reason}> when 'true' -> + call 'erlang':'throw' + (_@r0) + ( <_11> when 'true' -> + primop 'match_fail' + ({'case_clause',_11}) + -| ['compiler_generated'] ) + end + %% Line 1587 + <_@r1 = {'error',Reason}> when 'true' -> + %% Line 1588 + call 'erlang':'throw' + (_@r1) + ( <_12> when 'true' -> + primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end + %% Line 1590 + <{'ok',_X_Info}> when 'true' -> + %% Line 1591 + case call 'file':'delete' + (_0) of + %% Line 1592 + <'ok'> when 'true' -> + 'ok' + %% Line 1593 + <_@r2 = {'error',Reason}> when 'true' -> + call 'erlang':'throw' + (_@r2) + ( <_13> when 'true' -> + primop 'match_fail' + ({'case_clause',_13}) + -| ['compiler_generated'] ) + end + %% Line 1595 + <{'error',_X_Reason}> when 'true' -> + %% Line 1596 + call 'erlang':'throw' + ({'error',{'no_such_file',_0}}) + ( <_14> when 'true' -> + primop 'match_fail' + ({'case_clause',_14}) + -| ['compiler_generated'] ) + end +'do_write_file'/2 = + %% Line 1600 + fun (_0,_1) -> + %% Line 1601 + apply 'do_write_file'/3 + (_0, _1, []) +'do_write_file'/3 = + %% Line 1602 + fun (_0,_1,_2) -> + %% Line 1603 + case call 'file':'open' + (_0, ['write'|_2]) of + %% Line 1604 + <{'ok',Fd}> when 'true' -> + do %% Line 1605 + call 'io':'put_chars' + (Fd, _1) + let <_8> = + call %% Line 1606 + 'file':%% Line 1606 + 'close' + (%% Line 1606 + Fd) + in %% Line 1606 + case _8 of + <'ok'> when 'true' -> + ( _8 + -| ['compiler_generated'] ) + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end + %% Line 1607 + <{'error',Reason}> when 'true' -> + %% Line 1608 + {'error',{Reason,_0}} + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end +'change_appl_data'/3 = + %% Line 1615 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + let = + call %% Line 1616 + 'filename':%% Line 1616 + 'join' + (%% Line 1616 + [RelDir|[Vsn|[]]]) + in let = + call %% Line 1617 + 'filename':%% Line 1617 + 'join' + (%% Line 1617 + Dir, %% Line 1617 + [115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]) + in %% Line 1618 + case apply 'read_file'/2 + (BootFile, Masters) of + %% Line 1619 + <{'ok',Bin}> when 'true' -> + let <_5> = + call %% Line 1620 + 'filename':%% Line 1620 + 'join' + (%% Line 1620 + Dir, %% Line 1620 + [115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]) + in let <_7> = + case %% Line 1620 + apply 'consult'/2 + (_5, Masters) of + %% Line 1621 + <{'ok',[Conf|[]]}> when 'true' -> + Conf + %% Line 1622 + <_20> when 'true' -> + [] + end + in let <_9> = + call %% Line 1624 + 'erlang':%% Line 1624 + 'binary_to_term' + (%% Line 1624 + Bin) + in let = + apply %% Line 1624 + 'get_appls'/1 + (_9) + in %% Line 1625 + case call 'application_controller':'change_application_data' + (Appls, _7) of + %% Line 1626 + <'ok'> when 'true' -> + Appls + %% Line 1627 + <{'error',Reason}> when 'true' -> + call 'erlang':'exit' + ({'change_appl_data',Reason}) + ( <_11> when 'true' -> + primop 'match_fail' + ({'case_clause',_11}) + -| ['compiler_generated'] ) + end + %% Line 1629 + <{'error',_X_Reason}> when 'true' -> + %% Line 1630 + call 'erlang':'throw' + ({'error',{'no_such_file',BootFile}}) + ( <_12> when 'true' -> + primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end + ( <_15,_14,_13> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_15,_14,_13}) + -| [{'function_name',{'change_appl_data',3}}] ) + -| ['compiler_generated'] ) + end +'get_appls'/1 = + %% Line 1637 + fun (_0) -> + case _0 of + <{'script',_2,Script}> when 'true' -> + apply 'get_appls'/2 + (Script, []) + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'get_appls',1}}] ) + -| ['compiler_generated'] ) + end +'get_appls'/2 = + %% Line 1640 + fun (_0,_1) -> + case <_0,_1> of + <[{'kernelProcess','application_controller',%% Line 1641 + {'application_controller','start',[App|[]]}}|%% Line 1641 + T],%% Line 1641 + Res> when 'true' -> + %% Line 1642 + apply 'get_appls'/2 + (T, [App|Res]) + %% Line 1644 + <[{'apply',{'application','load',[App|[]]}}|T],Res> when 'true' -> + %% Line 1645 + apply 'get_appls'/2 + (T, [App|Res]) + %% Line 1646 + <[_4|T],Res> when 'true' -> + %% Line 1647 + apply 'get_appls'/2 + (T, Res) + %% Line 1648 + <[],Res> when 'true' -> + %% Line 1649 + Res + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'get_appls',2}}] ) + -| ['compiler_generated'] ) + end +'mon_nodes'/1 = + %% Line 1652 + fun (_0) -> + case _0 of + <'true'> when 'true' -> + let <_4> = + call %% Line 1653 + 'net_kernel':%% Line 1653 + 'monitor_nodes' + (%% Line 1653 + 'true') + in %% Line 1653 + case _4 of + <'ok'> when 'true' -> + ( _4 + -| ['compiler_generated'] ) + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end + %% Line 1654 + <'false'> when 'true' -> + %% Line 1655 + case call 'net_kernel':'monitor_nodes' + ('false') of + <'ok'> when 'true' -> + %% Line 1656 + apply 'flush'/0 + () + ( <_2> when 'true' -> + primop 'match_fail' + ({'badmatch',_2}) + -| ['compiler_generated'] ) + end + ( <_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3}) + -| [{'function_name',{'mon_nodes',1}}] ) + -| ['compiler_generated'] ) + end +'flush'/0 = + %% Line 1658 + fun () -> + %% Line 1659 + receive + %% Line 1660 + <{'nodedown',_0}> when 'true' -> + apply 'flush'/0 + () + %% Line 1661 + <{'nodeup',_1}> when 'true' -> + apply 'flush'/0 + () + after %% Line 1663 + 0 -> + %% Line 1663 + 'ok' +'prepare_restart_nt'/3 = + %% Line 1666 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <{'release',_30,Vsn,EVsn,_31,_32},%% Line 1667 + {'release',_33,PermVsn,PermEVsn,_34,_35},%% Line 1668 + DataFileName> when 'true' -> + let <_4> = + call %% Line 1669 + 'erlang':%% Line 1669 + 'node' + () + in let <_5> = + call %% Line 1669 + 'erlang':%% Line 1669 + 'atom_to_list' + (_4) + in let <_6> = + call %% Line 1669 + 'string':%% Line 1669 + 'lexemes' + (_5, %% Line 1669 + [64]) + in let <_7> = + call %% Line 1669 + 'erlang':%% Line 1669 + 'hd' + (_6) + in let <_3> = + [95|%% Line 1670 + PermVsn] + in let = + call %% Line 1670 + 'erlang':%% Line 1670 + '++' + (_7, _3) + in let <_10> = + call %% Line 1671 + 'erlang':%% Line 1671 + 'node' + () + in let <_11> = + call %% Line 1671 + 'erlang':%% Line 1671 + 'atom_to_list' + (_10) + in let <_12> = + call %% Line 1671 + 'string':%% Line 1671 + 'lexemes' + (_11, %% Line 1671 + [64]) + in let <_13> = + call %% Line 1671 + 'erlang':%% Line 1671 + 'hd' + (_12) + in let <_9> = + [95|%% Line 1672 + Vsn] + in let = + call %% Line 1672 + 'erlang':%% Line 1672 + '++' + (_13, _9) + in let <_16> = + case %% Line 1673 + call 'erlsrv':'get_service' + (PermEVsn, CurrentServiceName) of + %% Line 1674 + when 'true' -> + %% Line 1675 + call 'erlang':'throw' + (Error1) + %% Line 1676 + when 'true' -> + %% Line 1677 + CS + end + in let <_18> = + call %% Line 1681 + 'filename':%% Line 1681 + 'nativename' + (%% Line 1681 + DataFileName) + in let = + call %% Line 1679 + 'erlsrv':%% Line 1679 + 'new_service' + (%% Line 1679 + FutureServiceName, _16, _18, %% Line 1687 + CurrentServiceName) + in %% Line 1689 + case call 'erlsrv':'store_service' + (EVsn, FutureService) of + %% Line 1690 + when 'true' -> + %% Line 1691 + call 'erlang':'throw' + (Error2) + %% Line 1692 + <_X_X> when 'true' -> + %% Line 1693 + case call 'erlsrv':'disable_service' + (EVsn, FutureServiceName) of + <{'ok',_38}> when 'true' -> + let <_21> = + call %% Line 1694 + 'erlsrv':%% Line 1694 + 'erlsrv' + (%% Line 1694 + EVsn) + in let = + call %% Line 1694 + 'filename':%% Line 1694 + 'nativename' + (_21) + in let <_23> = + call %% Line 1695 + 'erlang':%% Line 1695 + '++' + (%% Line 1695 + [32|[115|[116|[97|[114|[116|[95|[100|[105|[115|[97|[98|[108|[101|[100|[32]]]]]]]]]]]]]]]], %% Line 1695 + FutureServiceName) + in let = + call %% Line 1695 + 'erlang':%% Line 1695 + '++' + (%% Line 1695 + ErlSrv, _23) + in %% Line 1696 + case call 'heart':'set_cmd' + (StartDisabled) of + %% Line 1697 + <'ok'> when 'true' -> + %% Line 1698 + 'ok' + %% Line 1699 + when 'true' -> + %% Line 1700 + call 'erlang':'throw' + ({'error',{'heart:set_cmd() error',Error3}}) + end + ( <_20> when 'true' -> + primop 'match_fail' + ({'badmatch',_20}) + -| ['compiler_generated'] ) + end + end + ( <_29,_28,_27> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_29,_28,_27}) + -| [{'function_name',{'prepare_restart_nt',3}}] ) + -| ['compiler_generated'] ) + end +'prepare_restart_new_emulator'/7 = + %% Line 1708 + fun (_0,_1,_2,_3,_4,_5,_6) -> + %% Line 1710 + case call 'lists':'keysearch' + ('permanent', 6, _5) of + <{'value',PRelease}> when 'true' -> + let = + apply %% Line 1711 + 'set_status'/3 + (_3, %% Line 1711 + 'current', _5) + in let = + apply %% Line 1712 + 'set_status'/3 + (_3, %% Line 1712 + 'tmp_current', %% Line 1712 + NReleases1) + in do %% Line 1713 + apply 'write_releases'/3 + (_2, NReleases2, _6) + %% Line 1714 + apply 'prepare_restart_new_emulator'/6 + (_0, _1, _2, _4, %% Line 1715 + PRelease, _6) + ( <_7> when 'true' -> + primop 'match_fail' + ({'badmatch',_7}) + -| ['compiler_generated'] ) + end +'prepare_restart_new_emulator'/6 = + %% Line 1717 + fun (_0,_1,_2,_3,_4,_5) -> + %% Line 1719 + case _3 of + <{'release',_21,Vsn,EVsn,_22,_23}> when 'true' -> + let <_7> = + [32|%% Line 1720 + Vsn] + in let = + call %% Line 1720 + 'erlang':%% Line 1720 + '++' + (%% Line 1720 + EVsn, _7) + in let = + apply %% Line 1721 + 'write_new_start_erl'/3 + (%% Line 1721 + Data, _2, _5) + in %% Line 1723 + case call 'os':'type' + () of + %% Line 1724 + <{'win32','nt'}> when 'true' -> + do %% Line 1725 + apply 'write_ini_file'/3 + (_1, EVsn, _5) + %% Line 1726 + apply 'prepare_restart_nt'/3 + (_3, _4, DataFile) + %% Line 1727 + <{'unix',_24}> when 'true' -> + let = + apply %% Line 1728 + 'check_start_prg'/2 + (_0, _5) + in let <_11> = + [32|%% Line 1729 + DataFile] + in let <_12> = + call %% Line 1729 + 'erlang':%% Line 1729 + '++' + (%% Line 1729 + StartP, _11) + in %% Line 1729 + case call 'heart':'set_cmd' + (_12) of + %% Line 1730 + <'ok'> when 'true' -> + %% Line 1731 + 'ok' + %% Line 1732 + when 'true' -> + %% Line 1733 + call 'erlang':'throw' + ({'error',{'heart:set_cmd() error',Error}}) + end + ( <_14> when 'true' -> + primop 'match_fail' + ({'case_clause',_14}) + -| ['compiler_generated'] ) + end + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end +'check_start_prg'/2 = + %% Line 1737 + fun (_0,_1) -> + case <_0,_1> of + <{'do_check',StartPrg},Masters> when 'true' -> + do %% Line 1738 + apply 'check_file'/3 + (StartPrg, 'regular', Masters) + %% Line 1739 + StartPrg + %% Line 1740 + <{_4,StartPrg},_5> when 'true' -> + %% Line 1741 + StartPrg + ( <_3,_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3,_2}) + -| [{'function_name',{'check_start_prg',2}}] ) + -| ['compiler_generated'] ) + end +'write_new_start_erl'/3 = + %% Line 1743 + fun (_0,_1,_2) -> + let = + call %% Line 1744 + 'filename':%% Line 1744 + 'join' + (%% Line 1744 + [_1|[[110|[101|[119|[95|[115|[116|[97|[114|[116|[95|[101|[114|[108|[46|[100|[97|[116|[97]]]]]]]]]]]]]]]]]]]]) + in do %% Line 1745 + apply 'write_file'/3 + (DataFile, _0, _2) + %% Line 1746 + DataFile +'transform_release'/3 = + %% Line 1759 + fun (_0,_1,_2) -> + %% Line 1760 + case call 'init':'script_id' + () of + %% Line 1761 + <_@r0 = {Name,TmpVsn = [95|[95|[110|[101|[119|[95|[101|[109|[117|[108|[97|[116|[111|[114|[95|[95|_20]]]]]]]]]]]]]]]]}> when 'true' -> + let = + call %% Line 1766 + 'lists':%% Line 1766 + 'keydelete' + (%% Line 1766 + TmpVsn, %% Line 1766 + 3, _1) + in do %% Line 1767 + apply 'write_releases'/3 + (_0, DReleases, _2) + %% Line 1768 + apply 'set_current'/2 + (_@r0, _1) + %% Line 1769 + when 'true' -> + let = + fun (_12) -> + %% Line 1770 + case _12 of + + when ( try + let <_8> = + call 'erlang':'element' + (6, Release) + in call 'erlang':'=:=' + (_8, 'tmp_current') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1771 + case Release of + <{'release',_26,_27,_28,_29,_30}> when 'true' -> + call 'erlang':'setelement' + (6, Release, 'unpacked') + ( <_31> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 1772 + when 'true' -> + Release + end + in %% Line 1774 + case call 'lists':'map' + (F, _1) of + %% Line 1775 + <_32> + when call 'erlang':'=:=' + (_32, + _1) -> + _1 + %% Line 1777 + when 'true' -> + do %% Line 1778 + apply 'write_releases'/3 + (_0, DReleases, _2) + %% Line 1779 + apply 'set_current'/2 + (ScriptId, _1) + end + end +'set_current'/2 = + %% Line 1783 + fun (_0,_1) -> + let = + fun (_19) -> + %% Line 1784 + case _19 of + + when ( try + let <_6> = + call 'erlang':'element' + (6, Release) + in call 'erlang':'=:=' + (_6, 'tmp_current') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1785 + case _0 of + %% Line 1786 + <{_X_Name,Vsn}> + when ( try + ( let <_10> = + case ( call ( 'erlang' + -| ['compiler_generated'] ):( 'is_record' + -| ['compiler_generated'] ) + (Release, ( 'release' + -| ['compiler_generated'] ), ( 6 + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) of + ( <( 'true' + -| ['compiler_generated'] )> when 'true' -> + ( 'true' + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <( 'false' + -| ['compiler_generated'] )> when 'true' -> + ( 'fail' + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <( _8 + -| ['compiler_generated'] )> when 'true' -> + ( _8 + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + in let <_11> = + call 'erlang':'=:=' + (( _10 + -| ['compiler_generated'] ), 'true') + in let <_12> = + call 'erlang':'element' + (3, Release) + in let <_13> = + call 'erlang':'==' + (_12, Vsn) + in ( call ( 'erlang' + -| ['compiler_generated'] ):( 'and' + -| ['compiler_generated'] ) + (_11, _13) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1787 + case Release of + <{'release',_29,_30,_31,_32,_33}> when 'true' -> + call 'erlang':'setelement' + (6, Release, 'current') + ( <_34> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 1788 + <_35> when 'true' -> + %% Line 1789 + case Release of + <{'release',_36,_37,_38,_39,_40}> when 'true' -> + call 'erlang':'setelement' + (6, Release, 'unpacked') + ( <_41> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + end + %% Line 1791 + when 'true' -> + Release + end + in %% Line 1793 + call 'lists':'map' + (F1, _1) +'check_opt_file'/3 = + %% Line 1802 + fun (_0,_1,_2) -> + let <_3> = + catch + %% Line 1803 + apply 'check_file'/3 + (_0, _1, _2) + in %% Line 1803 + case _3 of + %% Line 1804 + <'ok'> when 'true' -> + %% Line 1805 + 'true' + %% Line 1806 + <_X_Error> when 'true' -> + do %% Line 1807 + call 'io':'format' + ([87|[97|[114|[110|[105|[110|[103|[58|[32|[126|[116|[112|[32|[109|[105|[115|[115|[105|[110|[103|[32|[40|[111|[112|[116|[105|[111|[110|[97|[108|[41|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [_0|[]]) + %% Line 1808 + 'false' + end +'check_file'/3 = + %% Line 1811 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 1812 + apply 'do_check_file'/2 + (FileName, Type) + %% Line 1813 + when 'true' -> + %% Line 1814 + apply 'check_file_masters'/3 + (FileName, Type, Masters) + end +'check_file_masters'/3 = + %% Line 1817 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + do %% Line 1818 + apply 'do_check_file'/3 + (Master, FileName, Type) + %% Line 1819 + apply 'check_file_masters'/3 + (FileName, Type, Masters) + %% Line 1820 + <_X_FileName,_X_Type,[]> when 'true' -> + %% Line 1821 + 'ok' + ( <_5,_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4,_3}) + -| [{'function_name',{'check_file_masters',3}}] ) + -| ['compiler_generated'] ) + end +'do_check_file'/2 = + %% Line 1824 + fun (_0,_1) -> + %% Line 1825 + case call 'file':'read_file_info' + (_0) of + %% Line 1826 + <{'ok',Info = {'file_info',_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23}}> + when ( try + let <_6> = + call 'erlang':'element' + (3, Info) + in call 'erlang':'==' + (_6, _1) + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + 'ok' + %% Line 1827 + <{'error',_X_Reason}> when 'true' -> + call 'erlang':'throw' + ({'error',{'no_such_file',_0}}) + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end +'do_check_file'/3 = + %% Line 1830 + fun (_0,_1,_2) -> + %% Line 1831 + case call 'rpc':'call' + (_0, 'file', 'read_file_info', [_1|[]]) of + %% Line 1832 + <{'ok',Info = {'file_info',_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25}}> + when ( try + let <_7> = + call 'erlang':'element' + (3, Info) + in call 'erlang':'==' + (_7, _2) + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + 'ok' + %% Line 1833 + <_26> when 'true' -> + call 'erlang':'throw' + ({'error',{'no_such_file',{_0,_1}}}) + end +'extract_rel_file'/3 = + %% Line 1840 + fun (_0,_1,_2) -> + %% Line 1841 + ( call ( 'erl_tar' + -| ['result_not_wanted'] ):( 'extract' + -| ['result_not_wanted'] ) + (_1, ( [( {( 'files' + -| ['result_not_wanted'] ),( [_0|( [] + -| ['result_not_wanted'] )] + -| ['result_not_wanted'] )} + -| ['result_not_wanted'] )|( [( {( 'cwd' + -| ['result_not_wanted'] ),_2} + -| ['result_not_wanted'] )|( ['compressed'] + -| ['result_not_wanted'] )] + -| ['result_not_wanted'] )] + -| ['result_not_wanted'] )) + -| ['result_not_wanted'] ) +'extract_tar'/2 = + %% Line 1843 + fun (_0,_1) -> + %% Line 1844 + case call 'erl_tar':'extract' + (_1, ['keep_old_files'|[{'cwd',_0}|['compressed']]]) of + %% Line 1845 + <'ok'> when 'true' -> + %% Line 1846 + 'ok' + %% Line 1847 + <{'error',{Name,Reason}}> when 'true' -> + %% Line 1848 + call 'erlang':'throw' + ({'error',{'cannot_extract_file',Name,Reason}}) + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'write_releases'/3 = + %% Line 1851 + fun (_0,_1,_2) -> + let <_14> = + fun (_12) -> + %% Line 1856 + case _12 of + + when ( try + let <_7> = + call 'erlang':'element' + (6, Release) + in call 'erlang':'=:=' + (_7, 'current') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + %% Line 1857 + case Release of + <{'release',_24,_25,_26,_27,_28}> when 'true' -> + let <_11> = + call 'erlang':'setelement' + (6, Release, 'unpacked') + in {'true',_11} + ( <_29> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','release'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + %% Line 1858 + <_30> when 'true' -> + %% Line 1859 + 'true' + end + in let = + call %% Line 1856 + 'lists':%% Line 1856 + 'zf' + (_14, _1) + in %% Line 1861 + apply 'write_releases_1'/3 + (_0, NewReleases, _2) +'write_releases_1'/3 = + %% Line 1864 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 1865 + case apply 'do_write_release'/3 + (Dir, [82|[69|[76|[69|[65|[83|[69|[83]]]]]]]], NewReleases) of + %% Line 1866 + <'ok'> when 'true' -> + 'ok' + %% Line 1867 + when 'true' -> + call 'erlang':'throw' + (Error) + end + %% Line 1869 + when 'true' -> + do %% Line 1870 + apply 'all_masters'/1 + (Masters) + %% Line 1871 + apply 'write_releases_m'/3 + (Dir, NewReleases, Masters) + end +'do_write_release'/3 = + %% Line 1873 + fun (_0,_1,_2) -> + let <_3> = + call %% Line 1874 + 'filename':%% Line 1874 + 'join' + (_0, _1) + in %% Line 1874 + case call 'file':'open' + (_3, ['write'|[{'encoding','utf8'}]]) of + %% Line 1875 + <{'ok',Fd}> when 'true' -> + let <_4> = + call %% Line 1877 + 'epp':%% Line 1877 + 'encoding_to_string' + (%% Line 1877 + 'utf8') + in %% Line 1876 + case call 'io':'format' + (Fd, [37|[37|[32|[126|[115|[126|[110|[126|[116|[112|[46|[126|[110]]]]]]]]]]]]], %% Line 1877 + [_4|[_2|[]]]) of + <'ok'> when 'true' -> + let <_11> = + call %% Line 1878 + 'file':%% Line 1878 + 'close' + (%% Line 1878 + Fd) + in %% Line 1878 + case _11 of + <'ok'> when 'true' -> + ( _11 + -| ['compiler_generated'] ) + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end + ( <_5> when 'true' -> + primop 'match_fail' + ({'badmatch',_5}) + -| ['compiler_generated'] ) + end + %% Line 1879 + <_@r0 = {'error',Reason}> when 'true' -> + %% Line 1880 + _@r0 + ( <_7> when 'true' -> + primop 'match_fail' + ({'case_clause',_7}) + -| ['compiler_generated'] ) + end +'write_releases_m'/3 = + %% Line 1894 + fun (_0,_1,_2) -> + let = + call %% Line 1895 + 'filename':%% Line 1895 + 'join' + (_0, %% Line 1895 + [82|[69|[76|[69|[65|[83|[69|[83]]]]]]]]) + in let = + call %% Line 1896 + 'filename':%% Line 1896 + 'join' + (_0, %% Line 1896 + [82|[69|[76|[69|[65|[83|[69|[83|[46|[98|[97|[99|[107|[117|[112]]]]]]]]]]]]]]]) + in let = + call %% Line 1897 + 'filename':%% Line 1897 + 'join' + (_0, %% Line 1897 + [82|[69|[76|[69|[65|[83|[69|[83|[46|[99|[104|[97|[110|[103|[101]]]]]]]]]]]]]]]) + in do %% Line 1898 + apply 'ensure_RELEASES_exists'/2 + (_2, RelFile) + %% Line 1899 + case apply 'at_all_masters'/4 + (_2, 'release_handler', 'do_copy_files', %% Line 1900 + [RelFile|[[Backup|[Change|[]]]|[]]]) of + %% Line 1901 + <'ok'> when 'true' -> + %% Line 1902 + case apply 'at_all_masters'/4 + (_2, 'release_handler', 'do_write_release', %% Line 1903 + [_0|[[82|[69|[76|[69|[65|[83|[69|[83|[46|[99|[104|[97|[110|[103|[101]]]]]]]]]]]]]]]|[_1|[]]]]) of + %% Line 1904 + <'ok'> when 'true' -> + %% Line 1905 + case apply 'at_all_masters'/4 + (_2, 'file', 'rename', %% Line 1906 + [Change|[RelFile|[]]]) of + %% Line 1907 + <'ok'> when 'true' -> + do %% Line 1908 + apply 'remove_files'/3 + ('all', [Backup|[Change|[]]], _2) + %% Line 1909 + 'ok' + %% Line 1910 + <{'error',{Master,R}}> when 'true' -> + do %% Line 1911 + apply 'takewhile'/5 + (Master, _2, 'file', 'rename', %% Line 1912 + [Backup|[RelFile|[]]]) + do %% Line 1913 + apply 'remove_files'/3 + ('all', [Backup|[Change|[]]], _2) + %% Line 1914 + call 'erlang':'throw' + ({'error',{Master,R,'move_releases'}}) + ( <_6> when 'true' -> + primop 'match_fail' + ({'case_clause',_6}) + -| ['compiler_generated'] ) + end + %% Line 1916 + <{'error',{Master,R}}> when 'true' -> + do %% Line 1917 + apply 'remove_files'/3 + ('all', [Backup|[Change|[]]], _2) + %% Line 1918 + call 'erlang':'throw' + ({'error',{Master,R,'update_releases'}}) + ( <_7> when 'true' -> + primop 'match_fail' + ({'case_clause',_7}) + -| ['compiler_generated'] ) + end + %% Line 1920 + <{'error',{Master,R}}> when 'true' -> + do %% Line 1921 + apply 'remove_files'/3 + (Master, [Backup|[Change|[]]], _2) + %% Line 1922 + call 'erlang':'throw' + ({'error',{Master,R,'backup_releases'}}) + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end +'ensure_RELEASES_exists'/2 = + %% Line 1925 + fun (_0,_1) -> + %% Line 1926 + case apply 'at_all_masters'/4 + (_0, 'release_handler', 'do_ensure_RELEASES', [_1|[]]) of + %% Line 1927 + <'ok'> when 'true' -> + %% Line 1928 + 'ok' + %% Line 1929 + <{'error',{Master,R}}> when 'true' -> + %% Line 1930 + call 'erlang':'throw' + ({'error',{Master,R,'ensure_RELEASES_exists'}}) + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'copy_file'/3 = + %% Line 1933 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 1934 + case apply 'do_copy_file'/2 + (File, Dir) of + %% Line 1935 + <'ok'> when 'true' -> + 'ok' + %% Line 1936 + when 'true' -> + call 'erlang':'throw' + (Error) + end + %% Line 1938 + when 'true' -> + do %% Line 1939 + apply 'all_masters'/1 + (Masters) + %% Line 1940 + apply 'copy_file_m'/3 + (File, Dir, Masters) + end +'copy_file_m'/3 = + %% Line 1948 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 1949 + case call 'rpc':'call' + (Master, 'release_handler', 'do_copy_file', [File|[Dir|[]]]) of + %% Line 1950 + <'ok'> when 'true' -> + apply 'copy_file_m'/3 + (File, Dir, Masters) + %% Line 1951 + <{'error',{Reason,F}}> when 'true' -> + call 'erlang':'throw' + ({'error',{Master,Reason,F}}) + %% Line 1952 + when 'true' -> + call 'erlang':'throw' + ({'error',{Master,Other,File}}) + end + %% Line 1954 + <_X_File,_X_Dir,[]> when 'true' -> + %% Line 1955 + 'ok' + ( <_6,_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5,_4}) + -| [{'function_name',{'copy_file_m',3}}] ) + -| ['compiler_generated'] ) + end +'do_copy_file'/2 = + %% Line 1957 + fun (_0,_1) -> + let <_2> = + call %% Line 1958 + 'filename':%% Line 1958 + 'basename' + (_0) + in let = + call %% Line 1958 + 'filename':%% Line 1958 + 'join' + (_1, _2) + in %% Line 1959 + apply 'do_copy_file1'/2 + (_0, File2) +'do_copy_file1'/2 = + %% Line 1961 + fun (_0,_1) -> + %% Line 1962 + case call 'file':'read_file' + (_0) of + %% Line 1963 + <{'ok',Bin}> when 'true' -> + %% Line 1964 + case call 'file':'write_file' + (_1, Bin) of + %% Line 1965 + <'ok'> when 'true' -> + 'ok' + %% Line 1966 + <{'error',Reason}> when 'true' -> + %% Line 1967 + {'error',{Reason,_1}} + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end + %% Line 1969 + <{'error',Reason}> when 'true' -> + %% Line 1970 + {'error',{Reason,_0}} + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end +'do_copy_files'/2 = + %% Line 1976 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 1977 + case apply 'do_copy_file1'/2 + (File, ToFile) of + %% Line 1978 + <'ok'> when 'true' -> + apply 'do_copy_files'/2 + (File, ToFiles) + %% Line 1979 + when 'true' -> + Error + end + %% Line 1981 + <_5,[]> when 'true' -> + %% Line 1982 + 'ok' + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'do_copy_files',2}}] ) + -| ['compiler_generated'] ) + end +'do_copy_files'/1 = + %% Line 1987 + fun (_0) -> + case _0 of + <[{Src,Dest}|Files]> when 'true' -> + %% Line 1988 + case apply 'do_copy_file1'/2 + (Src, Dest) of + %% Line 1989 + <'ok'> when 'true' -> + apply 'do_copy_files'/1 + (Files) + %% Line 1990 + when 'true' -> + Error + end + %% Line 1992 + <[]> when 'true' -> + %% Line 1993 + 'ok' + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'do_copy_files',1}}] ) + -| ['compiler_generated'] ) + end +'do_rename_files'/1 = + %% Line 1998 + fun (_0) -> + case _0 of + <[{Src,Dest}|Files]> when 'true' -> + %% Line 1999 + case call 'file':'rename' + (Src, Dest) of + %% Line 2000 + <'ok'> when 'true' -> + apply 'do_rename_files'/1 + (Files) + %% Line 2001 + when 'true' -> + Error + end + %% Line 2003 + <[]> when 'true' -> + %% Line 2004 + 'ok' + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'do_rename_files',1}}] ) + -| ['compiler_generated'] ) + end +'do_remove_files'/1 = + %% Line 2009 + fun (_0) -> + case _0 of + <[File|Files]> when 'true' -> + do %% Line 2010 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'delete' + -| ['result_not_wanted'] ) + (File) + -| ['result_not_wanted'] ) + %% Line 2011 + apply 'do_remove_files'/1 + (Files) + %% Line 2012 + <[]> when 'true' -> + %% Line 2013 + 'ok' + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'do_remove_files',1}}] ) + -| ['compiler_generated'] ) + end +'do_ensure_RELEASES'/1 = + %% Line 2020 + fun (_0) -> + %% Line 2021 + case call 'file':'read_file_info' + (_0) of + %% Line 2022 + <{'ok',_3}> when 'true' -> + 'ok' + %% Line 2023 + <_4> when 'true' -> + apply 'do_write_file'/2 + (_0, [91|[93|[46|[32]]]]) + end +'make_dir'/2 = + %% Line 2029 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + do %% Line 2030 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'make_dir' + -| ['result_not_wanted'] ) + (Dir) + -| ['result_not_wanted'] ) + %% Line 2031 + 'ok' + %% Line 2032 + when 'true' -> + let <_5> = + fun (_3) -> + %% Line 2033 + call 'rpc':'call' + (_3, 'file', 'make_dir', [Dir|[]]) + in %% Line 2033 + call 'lists':'foreach' + (_5, %% Line 2034 + Masters) + end +'all_masters'/1 = + %% Line 2039 + fun (_0) -> + %% Line 2040 + case call 'rpc':'multicall' + (_0, 'erlang', 'info', ['version']) of + %% Line 2041 + <{_3,[]}> when 'true' -> + 'ok' + %% Line 2042 + <{_4,BadNodes}> when 'true' -> + call 'erlang':'throw' + ({'error',{'bad_masters',BadNodes}}) + ( <_1> when 'true' -> + primop 'match_fail' + ({'case_clause',_1}) + -| ['compiler_generated'] ) + end +'at_all_masters'/4 = + %% Line 2050 + fun (_0,_1,_2,_3) -> + case <_0,_1,_2,_3> of + <[Master|Masters],M,F,A> when 'true' -> + %% Line 2051 + case call 'rpc':'call' + (Master, M, F, A) of + %% Line 2052 + <'ok'> when 'true' -> + apply 'at_all_masters'/4 + (Masters, M, F, A) + %% Line 2053 + when 'true' -> + {'error',{Master,Error}} + end + %% Line 2055 + <[],_9,_10,_11> when 'true' -> + %% Line 2056 + 'ok' + ( <_8,_7,_6,_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_8,_7,_6,_5}) + -| [{'function_name',{'at_all_masters',4}}] ) + -| ['compiler_generated'] ) + end +'takewhile'/5 = + %% Line 2062 + fun (_0,_1,_2,_3,_4) -> + let <_7> = + fun (_5) -> + %% Line 2063 + ( case ( _5 + -| ['result_not_wanted'] ) of + + when ( call ( 'erlang' + -| ['result_not_wanted'] ):( '==' + -| ['result_not_wanted'] ) + (( _5 + -| ['result_not_wanted'] ), + _0) + -| ['result_not_wanted'] ) -> + %% Line 2064 + ( 'false' + -| ['result_not_wanted'] ) + %% Line 2065 + when 'true' -> + do %% Line 2066 + ( call ( 'rpc' + -| ['result_not_wanted'] ):( 'call' + -| ['result_not_wanted'] ) + (Ma, _2, _3, _4) + -| ['result_not_wanted'] ) + %% Line 2067 + ( 'true' + -| ['result_not_wanted'] ) + end + -| ['result_not_wanted'] ) + in do %% Line 2063 + ( call ( 'lists' + -| ['result_not_wanted'] ):( 'takewhile' + -| ['result_not_wanted'] ) + (_7, _1) + -| ['result_not_wanted'] ) + %% Line 2069 + 'ok' +'consult'/2 = + %% Line 2071 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + call 'file':'consult' + (File) + %% Line 2072 + when 'true' -> + apply 'consult_master'/2 + (Masters, File) + end +'consult_master'/2 = + %% Line 2079 + fun (_0,_1) -> + case <_0,_1> of + <[Master|Ms],File> when 'true' -> + %% Line 2080 + case call 'rpc':'call' + (Master, 'file', 'consult', [File|[]]) of + %% Line 2081 + <{'badrpc',_5}> when 'true' -> + apply 'consult_master'/2 + (Ms, File) + %% Line 2082 + when 'true' -> + Res + end + %% Line 2084 + <[],_X_File> when 'true' -> + %% Line 2085 + {'error','no_master'} + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'consult_master',2}}] ) + -| ['compiler_generated'] ) + end +'read_file'/2 = + %% Line 2087 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 2088 + call 'file':'read_file' + (File) + %% Line 2089 + when 'true' -> + %% Line 2090 + apply 'read_master'/2 + (Masters, File) + end +'write_file'/3 = + %% Line 2092 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 2093 + case call 'file':'write_file' + (File, Data) of + %% Line 2094 + <'ok'> when 'true' -> + 'ok' + %% Line 2095 + when 'true' -> + call 'erlang':'throw' + (Error) + end + %% Line 2097 + when 'true' -> + %% Line 2098 + case apply 'at_all_masters'/4 + (Masters, 'file', 'write_file', [File|[Data|[]]]) of + %% Line 2099 + <'ok'> when 'true' -> + 'ok' + %% Line 2100 + when 'true' -> + call 'erlang':'throw' + (Error) + end + end +'ensure_dir'/2 = + %% Line 2103 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 2104 + case call 'filelib':'ensure_dir' + (File) of + %% Line 2105 + <'ok'> when 'true' -> + 'ok' + %% Line 2106 + when 'true' -> + call 'erlang':'throw' + (Error) + end + %% Line 2108 + when 'true' -> + %% Line 2109 + case apply 'at_all_masters'/4 + (Masters, 'filelib', 'ensure_dir', [File|[]]) of + %% Line 2110 + <'ok'> when 'true' -> + 'ok' + %% Line 2111 + when 'true' -> + call 'erlang':'throw' + (Error) + end + end +'remove_dir'/2 = + %% Line 2114 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 2115 + apply 'remove_file'/1 + (Dir) + %% Line 2116 + when 'true' -> + %% Line 2117 + case apply 'at_all_masters'/4 + (Masters, 'release_handler', 'remove_file', [Dir|[]]) of + %% Line 2118 + <'ok'> when 'true' -> + 'ok' + %% Line 2119 + when 'true' -> + call 'erlang':'throw' + (Error) + end + end +'remove_files'/3 = + %% Line 2124 + fun (_0,_1,_2) -> + %% Line 2125 + apply 'takewhile'/5 + (_0, _2, 'release_handler', 'do_remove_files', [_1|[]]) +'read_master'/2 = + %% Line 2132 + fun (_0,_1) -> + case <_0,_1> of + <[Master|Ms],File> when 'true' -> + %% Line 2133 + case call 'rpc':'call' + (Master, 'file', 'read_file', [File|[]]) of + %% Line 2134 + <{'badrpc',_5}> when 'true' -> + apply 'read_master'/2 + (Ms, File) + %% Line 2135 + when 'true' -> + Res + end + %% Line 2137 + <[],_X_File> when 'true' -> + %% Line 2138 + {'error','no_master'} + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'read_master',2}}] ) + -| ['compiler_generated'] ) + end +'write_start'/3 = + %% Line 2143 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 2144 + case apply 'do_write_file'/2 + (File, Data) of + %% Line 2145 + <'ok'> when 'true' -> + 'ok' + %% Line 2146 + when 'true' -> + call 'erlang':'throw' + (Error) + end + %% Line 2148 + when 'true' -> + do %% Line 2149 + apply 'all_masters'/1 + (Masters) + %% Line 2150 + apply 'safe_write_file_m'/3 + (File, Data, Masters) + end +'set_static_files'/3 = + %% Line 2163 + fun (_0,_1,_2) -> + do %% Line 2164 + apply 'all_masters'/1 + (_2) + let = + call %% Line 2167 + 'filename':%% Line 2167 + 'join' + (_0, %% Line 2165 + [115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]) + in let = + call %% Line 2168 + 'filename':%% Line 2168 + 'join' + (_1, %% Line 2165 + [115|[116|[97|[114|[116|[46|[98|[111|[111|[116]]]]]]]]]]) + in let = + call %% Line 2169 + 'filename':%% Line 2169 + 'join' + (_1, %% Line 2169 + [115|[116|[97|[114|[116|[46|[98|[97|[99|[107|[117|[112]]]]]]]]]]]]) + in let = + call %% Line 2170 + 'filename':%% Line 2170 + 'join' + (_0, %% Line 2166 + [115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]) + in let = + call %% Line 2171 + 'filename':%% Line 2171 + 'join' + (_1, %% Line 2166 + [115|[121|[115|[46|[99|[111|[110|[102|[105|[103]]]]]]]]]]) + in let = + call %% Line 2172 + 'filename':%% Line 2172 + 'join' + (_1, %% Line 2172 + [115|[121|[115|[46|[98|[97|[99|[107|[117|[112]]]]]]]]]]) + in %% Line 2174 + case apply 'at_all_masters'/4 + (_2, 'release_handler', 'do_copy_files', %% Line 2175 + [[{DestBoot,BackupBoot}|%% Line 2176 + [{DestConf,BackupConf}|[]]]|%% Line 2176 + []]) of + %% Line 2177 + <'ok'> when 'true' -> + %% Line 2178 + case apply 'at_all_masters'/4 + (_2, 'release_handler', 'do_copy_files', %% Line 2179 + [[{SrcBoot,DestBoot}|%% Line 2180 + [{SrcConf,DestConf}|[]]]|%% Line 2180 + []]) of + %% Line 2181 + <'ok'> when 'true' -> + do %% Line 2182 + apply 'remove_files'/3 + ('all', [BackupBoot|[BackupConf|[]]], _2) + %% Line 2183 + 'ok' + %% Line 2184 + <{'error',{Master,R}}> when 'true' -> + do %% Line 2185 + apply 'takewhile'/5 + (Master, _2, 'release_handler', 'do_rename_files', %% Line 2186 + [{BackupBoot,DestBoot}|%% Line 2187 + [{BackupConf,DestConf}|[]]]) + do %% Line 2188 + apply 'remove_files'/3 + ('all', [BackupBoot|[BackupConf|[]]], _2) + %% Line 2189 + call 'erlang':'throw' + ({'error',{Master,R,'copy_start_config'}}) + ( <_11> when 'true' -> + primop 'match_fail' + ({'case_clause',_11}) + -| ['compiler_generated'] ) + end + %% Line 2191 + <{'error',{Master,R}}> when 'true' -> + do %% Line 2192 + apply 'remove_files'/3 + (Master, [BackupBoot|[BackupConf|[]]], _2) + %% Line 2193 + call 'erlang':'throw' + ({'error',{Master,R,'backup_start_config'}}) + ( <_12> when 'true' -> + primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end +'write_ini_file'/3 = + %% Line 2203 + fun (_0,_1,_2) -> + let <_3> = + call %% Line 2204 + 'erlang':%% Line 2204 + '++' + (%% Line 2204 + [101|[114|[116|[115|[45]]]]], _1) + in let = + call %% Line 2204 + 'filename':%% Line 2204 + 'join' + (%% Line 2204 + [_0|[_3|[[98|[105|[110]]]]]]) + in let <_5> = + call %% Line 2209 + 'filename':%% Line 2209 + 'nativename' + (%% Line 2209 + BinDir) + in let <_6> = + call %% Line 2210 + 'filename':%% Line 2210 + 'nativename' + (_0) + in let = + call %% Line 2205 + 'io_lib':%% Line 2205 + 'format' + (%% Line 2205 + [91|[101|[114|[108|[97|[110|[103|[93|[126|[110|[66|[105|[110|[100|[105|[114|[61|[126|[116|[115|[126|[110|[80|[114|[111|[103|[110|[97|[109|[101|[61|[101|[114|[108|[126|[110|[82|[111|[111|[116|[100|[105|[114|[61|[126|[116|[115|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 2209 + [_5|%% Line 2210 + [_6|[]]]) + in let = + call %% Line 2211 + 're':%% Line 2211 + 'replace' + (%% Line 2211 + Str0, %% Line 2211 + [92|[92]], %% Line 2211 + [92|[92|[92|[92]]]], %% Line 2211 + [{'return','list'}|['global'|['unicode']]]) + in let = + call %% Line 2212 + 'filename':%% Line 2212 + 'join' + (%% Line 2212 + BinDir, %% Line 2212 + [101|[114|[108|[46|[105|[110|[105]]]]]]]) + in %% Line 2213 + apply 'do_write_ini_file'/3 + (IniFile, Str, _2) +'do_write_ini_file'/3 = + %% Line 2215 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 2216 + case apply 'do_write_file'/3 + (File, Data, [{'encoding','utf8'}]) of + %% Line 2217 + <'ok'> when 'true' -> + 'ok' + %% Line 2218 + when 'true' -> + call 'erlang':'throw' + (Error) + end + %% Line 2220 + when 'true' -> + do %% Line 2221 + apply 'all_masters'/1 + (Masters) + %% Line 2222 + apply 'safe_write_file_m'/4 + (File, Data, [{'encoding','utf8'}], Masters) + end +'safe_write_file_m'/3 = + %% Line 2235 + fun (_0,_1,_2) -> + %% Line 2236 + apply 'safe_write_file_m'/4 + (_0, _1, [], _2) +'safe_write_file_m'/4 = + %% Line 2237 + fun (_0,_1,_2,_3) -> + let = + call %% Line 2238 + 'erlang':%% Line 2238 + '++' + (_0, %% Line 2238 + [46|[98|[97|[99|[107|[117|[112]]]]]]]) + in let = + call %% Line 2239 + 'erlang':%% Line 2239 + '++' + (_0, %% Line 2239 + [46|[99|[104|[97|[110|[103|[101]]]]]]]) + in %% Line 2240 + case apply 'at_all_masters'/4 + (_3, 'release_handler', 'do_copy_files', %% Line 2241 + [_0|[[Backup|[]]|[]]]) of + %% Line 2242 + <'ok'> when 'true' -> + %% Line 2243 + case apply 'at_all_masters'/4 + (_3, 'release_handler', 'do_write_file', %% Line 2244 + [Change|[_1|[_2|[]]]]) of + %% Line 2245 + <'ok'> when 'true' -> + %% Line 2246 + case apply 'at_all_masters'/4 + (_3, 'file', 'rename', %% Line 2247 + [Change|[_0|[]]]) of + %% Line 2248 + <'ok'> when 'true' -> + do %% Line 2249 + apply 'remove_files'/3 + ('all', [Backup|[Change|[]]], _3) + %% Line 2250 + 'ok' + %% Line 2251 + <{'error',{Master,R}}> when 'true' -> + do %% Line 2252 + apply 'takewhile'/5 + (Master, _3, 'file', 'rename', %% Line 2253 + [Backup|[_0|[]]]) + do %% Line 2254 + apply 'remove_files'/3 + ('all', [Backup|[Change|[]]], _3) + let <_7> = + call %% Line 2256 + 'filename':%% Line 2256 + 'basename' + (%% Line 2256 + Change) + in let <_6> = + call %% Line 2257 + 'filename':%% Line 2257 + 'basename' + (_0) + in %% Line 2255 + call 'erlang':'throw' + ({'error',{Master,R,'rename',_7,_6}}) + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end + %% Line 2259 + <{'error',{Master,R}}> when 'true' -> + do %% Line 2260 + apply 'remove_files'/3 + ('all', [Backup|[Change|[]]], _3) + let <_9> = + call %% Line 2261 + 'filename':%% Line 2261 + 'basename' + (%% Line 2261 + Change) + in %% Line 2261 + call 'erlang':'throw' + ({'error',{Master,R,'write',_9}}) + ( <_10> when 'true' -> + primop 'match_fail' + ({'case_clause',_10}) + -| ['compiler_generated'] ) + end + %% Line 2263 + <{'error',{Master,R}}> when 'true' -> + do %% Line 2264 + apply 'remove_files'/3 + (Master, [Backup|[]], _3) + let <_12> = + call %% Line 2266 + 'filename':%% Line 2266 + 'basename' + (_0) + in let <_11> = + call %% Line 2267 + 'filename':%% Line 2267 + 'basename' + (%% Line 2267 + Backup) + in %% Line 2265 + call 'erlang':'throw' + ({'error',{Master,R,'backup',_12,_11}}) + ( <_13> when 'true' -> + primop 'match_fail' + ({'case_clause',_13}) + -| ['compiler_generated'] ) + end +'get_new_libs'/2 = + %% Line 2282 + fun (_0,_1) -> + case <_0,_1> of + <[{App,Vsn,_X_LibDir}|CurrentLibs],NewLibs> when 'true' -> + %% Line 2283 + case call 'lists':'keyfind' + (App, 1, NewLibs) of + %% Line 2284 + + when let <_8> = + call 'erlang':'=:=' + (_6, App) + in let <_9> = + call 'erlang':'=/=' + (NewVsn, Vsn) + in call 'erlang':'and' + (_8, _9) -> + let <_2> = + apply %% Line 2285 + 'get_new_libs'/2 + (%% Line 2285 + CurrentLibs, %% Line 2285 + NewLibs) + in %% Line 2285 + [LibInfo|_2] + %% Line 2286 + <_10> when 'true' -> + %% Line 2287 + apply 'get_new_libs'/2 + (CurrentLibs, NewLibs) + end + %% Line 2289 + <[],_11> when 'true' -> + %% Line 2290 + [] + ( <_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4}) + -| [{'function_name',{'get_new_libs',2}}] ) + -| ['compiler_generated'] ) + end +'get_releases_with_status'/3 = + %% Line 2295 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[],_6,Acc> when 'true' -> + %% Line 2296 + Acc + %% Line 2297 + <[Head = {_7,_8,_9,ReleaseStatus}|Tail],%% Line 2298 + Status,%% Line 2298 + Acc> + when %% Line 2298 + call 'erlang':'==' + (ReleaseStatus, + Status) -> + %% Line 2299 + apply 'get_releases_with_status'/3 + (Tail, Status, [Head|Acc]) + %% Line 2300 + <[_10|Tail],Status,Acc> when 'true' -> + %% Line 2301 + apply 'get_releases_with_status'/3 + (Tail, Status, Acc) + ( <_5,_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4,_3}) + -| [{'function_name',{'get_releases_with_status',3}}] ) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('release_handler') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('release_handler', _0) +end \ No newline at end of file diff --git a/test/data/sasl/release_handler_1.core b/test/data/sasl/release_handler_1.core new file mode 100644 index 0000000..46b3b70 --- /dev/null +++ b/test/data/sasl/release_handler_1.core @@ -0,0 +1,2032 @@ +module 'release_handler_1' ['check_old_processes'/2, + 'check_script'/2, + 'eval_script'/1, + 'eval_script'/5, + 'get_current_vsn'/1, + 'get_supervised_procs'/0, + 'module_info'/0, + 'module_info'/1] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[95|[49|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 27 + 'record' = + %% Line 27 + [{'eval_state',[{'record_field',27,{'atom',27,'bins'},{'nil',27}}|[{'record_field',27,{'atom',27,'stopped'},{'nil',27}}|[{'record_field',27,{'atom',27,'suspended'},{'nil',27}}|[{'record_field',27,{'atom',27,'apps'},{'nil',27}}|[{'record_field',28,{'atom',28,'libdirs'}}|[{'record_field',28,{'atom',28,'unpurged'},{'nil',28}}|[{'record_field',28,{'atom',28,'vsns'},{'nil',28}}|[{'record_field',28,{'atom',28,'newlibs'},{'nil',28}}|[{'record_field',29,{'atom',29,'opts'},{'nil',29}}]]]]]]]]]}]] +'check_script'/2 = + %% Line 51 + fun (_0,_1) -> + case <_0,_1> of + <['restart_new_emulator'|Script],LibDirs> when 'true' -> + %% Line 54 + apply 'do_check_script'/3 + (Script, LibDirs, []) + %% Line 55 + when 'true' -> + let <_2> = + catch + %% Line 56 + apply 'check_old_processes'/2 + (Script, 'soft_purge') + in %% Line 56 + case _2 of + %% Line 57 + <{'ok',PurgeMods}> when 'true' -> + %% Line 58 + apply 'do_check_script'/3 + (Script, LibDirs, PurgeMods) + %% Line 59 + <{'error',Mod}> when 'true' -> + %% Line 60 + {'error',{'old_processes',Mod}} + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end + end +'do_check_script'/3 = + %% Line 63 + fun (_0,_1,_2) -> + %% Line 64 + case apply 'split_instructions'/1 + (_0) of + <{Before,After}> when 'true' -> + let <_9> = + catch + let <_8> = + fun (_5,_4) -> + %% Line 66 + apply 'eval'/2 + (_5, _4) + in %% Line 65 + call 'lists':'foldl' + (_8, %% Line 68 + {'eval_state',[],[],[],[],_1,[],[],[],[]}, %% Line 69 + Before) + in %% Line 65 + case _9 of + %% Line 70 + when ( 'true' + -| ['compiler_generated'] ) -> + let <_10> = + catch + %% Line 71 + apply 'syntax_check_script'/1 + (After) + in %% Line 71 + case _10 of + %% Line 72 + <'ok'> when 'true' -> + %% Line 73 + {'ok',_2} + %% Line 74 + when 'true' -> + %% Line 75 + {'error',Other} + end + %% Line 77 + <_@r0 = {'error',Error}> when 'true' -> + %% Line 78 + _@r0 + %% Line 79 + when 'true' -> + %% Line 80 + {'error',Other} + end + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end +'eval_script'/1 = + %% Line 84 + fun (_0) -> + %% Line 85 + apply 'eval_script'/5 + (_0, [], [], [], []) +'eval_script'/5 = + %% Line 87 + fun (_0,_1,_2,_3,_4) -> + let <_5> = + catch + %% Line 88 + apply 'check_old_processes'/2 + (_0, 'soft_purge') + in %% Line 88 + case _5 of + %% Line 89 + <{'ok',_31}> when 'true' -> + %% Line 90 + case apply 'split_instructions'/1 + (_0) of + <{Before,After}> when 'true' -> + let <_12> = + catch + let <_11> = + fun (_8,_7) -> + %% Line 92 + apply 'eval'/2 + (_8, _7) + in %% Line 91 + call 'lists':'foldl' + (_11, %% Line 94 + {'eval_state',[],[],[],_1,_2,[],[],_3,_4}, %% Line 98 + Before) + in %% Line 91 + case _12 of + %% Line 99 + when ( 'true' + -| ['compiler_generated'] ) -> + let <_13> = + catch + %% Line 100 + apply 'syntax_check_script'/1 + (After) + in %% Line 100 + case _13 of + %% Line 101 + <'ok'> when 'true' -> + let <_19> = + catch + let <_18> = + fun (_15,_14) -> + %% Line 104 + apply 'eval'/2 + (_15, _14) + in %% Line 102 + call 'lists':'foldl' + (_18, %% Line 107 + EvalState2, %% Line 108 + After) + in %% Line 102 + case _19 of + %% Line 109 + when %% Line 110 + ( 'true' + -| ['compiler_generated'] ) -> + %% Line 111 + ( case EvalState4 of + ( <( {'eval_state',_50,_51,_52,_53,_54,_rec0,_55,_56,_57} + -| ['compiler_generated'] )> when 'true' -> + {'ok',_rec0} + -| ['compiler_generated'] ) + ( <_58> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 112 + <'restart_emulator'> when 'true' -> + %% Line 113 + 'restart_emulator' + %% Line 114 + when 'true' -> + %% Line 115 + {'EXIT',Error} + end + %% Line 117 + when 'true' -> + %% Line 118 + {'error',Other} + end + %% Line 120 + <_@r0 = {'error',Error}> when 'true' -> + _@r0 + %% Line 121 + when 'true' -> + {'error',Other} + end + ( <_6> when 'true' -> + primop 'match_fail' + ({'badmatch',_6}) + -| ['compiler_generated'] ) + end + %% Line 123 + <{'error',Mod}> when 'true' -> + %% Line 124 + {'error',{'old_processes',Mod}} + ( <_25> when 'true' -> + primop 'match_fail' + ({'case_clause',_25}) + -| ['compiler_generated'] ) + end +'split_instructions'/1 = + %% Line 130 + fun (_0) -> + %% Line 131 + apply 'split_instructions'/2 + (_0, []) +'split_instructions'/2 = + %% Line 132 + fun (_0,_1) -> + case <_0,_1> of + <_@r0 = ['point_of_no_return'|T],Before> when 'true' -> + let <_2> = + call %% Line 133 + 'lists':%% Line 133 + 'reverse' + (%% Line 133 + Before) + in %% Line 133 + {_2,_@r0} + %% Line 134 + <[H|T],Before> when 'true' -> + %% Line 135 + apply 'split_instructions'/2 + (T, [H|Before]) + %% Line 136 + <[],Before> when 'true' -> + let <_3> = + call %% Line 137 + 'lists':%% Line 137 + 'reverse' + (%% Line 137 + Before) + in %% Line 137 + {[],_3} + ( <_5,_4> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_5,_4}) + -| [{'function_name',{'split_instructions',2}}] ) + -| ['compiler_generated'] ) + end +'check_old_processes'/2 = + %% Line 161 + fun (_0,_1) -> + let = + call %% Line 162 + 'erlang':%% Line 162 + 'processes' + () + in let <_5> = + fun (_3) -> + %% Line 164 + case _3 of + <{'load',{Mod,PPM,_X_PostPurgeMethod}}> + when call 'erlang':'==' + (PPM, + _1) -> + %% Line 165 + apply 'check_old_code'/3 + (Mod, Procs, _1) + %% Line 166 + <{'remove',{Mod,PPM,_X_PostPurgeMethod}}> + when call 'erlang':'==' + (PPM, + _1) -> + %% Line 167 + apply 'check_old_code'/3 + (Mod, Procs, _1) + %% Line 168 + <_9> when 'true' -> + [] + end + in let <_6> = + call %% Line 163 + 'lists':%% Line 163 + 'flatmap' + (_5, _0) + in %% Line 163 + {'ok',_6} +'check_old_code'/3 = + %% Line 172 + fun (_0,_1,_2) -> + %% Line 173 + case call 'erlang':'check_old_code' + (_0) of + %% Line 174 + <'true'> + when call 'erlang':'=:=' + (_2, + 'soft_purge') -> + %% Line 175 + apply 'do_check_old_code'/2 + (_0, _1) + %% Line 176 + <'true'> + when call 'erlang':'=:=' + (_2, + 'brutal_purge') -> + let <_3> = + catch + %% Line 177 + apply 'do_check_old_code'/2 + (_0, _1) + in %% Line 177 + case _3 of + %% Line 178 + <{'error',_9}> + when call 'erlang':'=:=' + (_9, + _0) -> + [] + %% Line 179 + when 'true' -> + R + end + %% Line 181 + <'false'> when 'true' -> + %% Line 182 + [] + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'do_check_old_code'/2 = + %% Line 186 + fun (_0,_1) -> + let <_5> = + fun (_3) -> + %% Line 189 + case call 'erlang':'check_process_code' + (_3, _0) of + %% Line 190 + <'false'> when 'true' -> + 'ok' + %% Line 191 + <'true'> when 'true' -> + call 'erlang':'throw' + ({'error',_0}) + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end + in do %% Line 187 + call 'lists':'foreach' + (_5, _1) + %% Line 195 + [_0|[]] +'syntax_check_script'/1 = + %% Line 200 + fun (_0) -> + case _0 of + <['point_of_no_return'|Script]> when 'true' -> + %% Line 201 + apply 'syntax_check_script'/1 + (Script) + %% Line 202 + <[{'load',{_2,_3,_4}}|Script]> when 'true' -> + %% Line 203 + apply 'syntax_check_script'/1 + (Script) + %% Line 204 + <[{'remove',{_5,_6,_7}}|Script]> when 'true' -> + %% Line 205 + apply 'syntax_check_script'/1 + (Script) + %% Line 206 + <[{'purge',_8}|Script]> when 'true' -> + %% Line 207 + apply 'syntax_check_script'/1 + (Script) + %% Line 208 + <[{'suspend',_9}|Script]> when 'true' -> + %% Line 209 + apply 'syntax_check_script'/1 + (Script) + %% Line 210 + <[{'resume',_10}|Script]> when 'true' -> + %% Line 211 + apply 'syntax_check_script'/1 + (Script) + %% Line 212 + <[{'code_change',_11}|Script]> when 'true' -> + %% Line 213 + apply 'syntax_check_script'/1 + (Script) + %% Line 214 + <[{'code_change',_12,_13}|Script]> when 'true' -> + %% Line 215 + apply 'syntax_check_script'/1 + (Script) + %% Line 216 + <[{'stop',_14}|Script]> when 'true' -> + %% Line 217 + apply 'syntax_check_script'/1 + (Script) + %% Line 218 + <[{'start',_15}|Script]> when 'true' -> + %% Line 219 + apply 'syntax_check_script'/1 + (Script) + %% Line 220 + <[{'sync_nodes',_16,{_17,_18,_19}}|Script]> when 'true' -> + %% Line 221 + apply 'syntax_check_script'/1 + (Script) + %% Line 222 + <[{'sync_nodes',_20,_21}|Script]> when 'true' -> + %% Line 223 + apply 'syntax_check_script'/1 + (Script) + %% Line 224 + <[{'apply',{_22,_23,_24}}|Script]> when 'true' -> + %% Line 225 + apply 'syntax_check_script'/1 + (Script) + %% Line 226 + <['restart_emulator'|Script]> when 'true' -> + %% Line 227 + apply 'syntax_check_script'/1 + (Script) + %% Line 228 + <[Illegal|_X_Script]> when 'true' -> + %% Line 229 + call 'erlang':'throw' + ({'illegal_instruction_after_point_of_no_return',Illegal}) + %% Line 230 + <[]> when 'true' -> + %% Line 231 + 'ok' + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'syntax_check_script',1}}] ) + -| ['compiler_generated'] ) + end +'eval'/2 = + %% Line 309 + fun (_0,_1) -> + case <_0,_1> of + <{'load_object_code',{Lib,LibVsn,Modules}},EvalState> when 'true' -> + %% Line 310 + ( case EvalState of + ( <( {'eval_state',_127,_128,_129,_130,_rec1,_131,_132,_133,_134} + -| ['compiler_generated'] )> when 'true' -> + case call 'lists':'keysearch' + (Lib, 1, _rec1) of + %% Line 311 + <{'value',LibInfo = {_136,_137,LibDir}}> + when let <_138> = + call 'erlang':'=:=' + (_136, Lib) + in let <_139> = + call 'erlang':'=:=' + (_137, LibVsn) + in call 'erlang':'and' + (_138, _139) -> + let = + call %% Line 312 + 'code':%% Line 312 + 'objfile_extension' + () + in let <_17> = + fun (_14,_13) -> + %% Line 314 + case <_14,_13> of + when 'true' -> + let = + call %% Line 315 + 'lists':%% Line 315 + 'concat' + (%% Line 315 + [Mod|[Ext|[]]]) + in let = + call %% Line 316 + 'filename':%% Line 316 + 'join' + (%% Line 316 + [LibDir|[[101|[98|[105|[110]]]]|[File|[]]]]) + in %% Line 317 + case call 'erl_prim_loader':'get_file' + (FName) of + %% Line 318 + <{'ok',Bin,FName2}> when 'true' -> + let = + apply %% Line 319 + 'add_vsns'/3 + (%% Line 319 + Mod, %% Line 319 + Bin, %% Line 319 + Vsns) + in %% Line 320 + {[{Mod,Bin,FName2}|Bins],NVsns} + %% Line 321 + <'error'> when 'true' -> + %% Line 322 + call 'erlang':'throw' + ({'error',{'no_such_file',FName}}) + ( <_12> when 'true' -> + primop 'match_fail' + ({'case_clause',_12}) + -| ['compiler_generated'] ) + end + ( <_16,_15> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_16,_15}) + -| [{'function_name',{'-eval/2-fun-0-',2}}] ) + -| ['compiler_generated'] ) + end + in %% Line 325 + ( case EvalState of + ( <( {'eval_state',_rec2,_140,_141,_142,_143,_144,_145,_146,_147} + -| ['compiler_generated'] )> when 'true' -> + %% Line 326 + ( case EvalState of + ( <( {'eval_state',_149,_150,_151,_152,_153,_154,_rec3,_155,_156} + -| ['compiler_generated'] )> when 'true' -> + case call 'lists':'foldl' + (_17, {_rec2,_rec3}, %% Line 327 + Modules) of + <{NewBins,NewVsns}> when 'true' -> + %% Line 328 + ( case EvalState of + ( <( {'eval_state',_158,_159,_160,_161,_162,_163,_164,_rec4,_165} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'lists':'keystore' + (Lib, 1, _rec4, LibInfo) + in %% Line 329 + case EvalState of + <{'eval_state',_167,_168,_169,_170,_171,_172,_173,_174,_175}> when 'true' -> + let <_23> = + call %% Line 330 + 'erlang':%% Line 330 + 'setelement' + (%% Line 330 + 9, EvalState, %% Line 330 + NewLibs) + in let <_24> = + call %% Line 331 + 'erlang':%% Line 331 + 'setelement' + (%% Line 331 + 8, _23, %% Line 331 + NewVsns) + in call 'erlang':'setelement' + (2, _24, NewBins) + ( <_176> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_166> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_18> when 'true' -> + primop 'match_fail' + ({'badmatch',_18}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_157> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_148> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 332 + <{'value',{_177,LibVsn2,_X_LibDir}}> + when call 'erlang':'=:=' + (_177, + Lib) -> + %% Line 333 + call 'erlang':'throw' + ({'error',{'bad_lib_vsn',Lib,LibVsn2}}) + ( <_26> when 'true' -> + primop 'match_fail' + ({'case_clause',_26}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_135> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 335 + <'point_of_no_return',EvalState> when 'true' -> + let <_30> = + case %% Line 336 + apply 'get_opt'/3 + ('update_paths', EvalState, 'false') of + %% Line 337 + <'false'> when 'true' -> + %% Line 338 + ( case EvalState of + ( <( {'eval_state',_178,_179,_180,_181,_182,_183,_184,_rec6,_185} + -| ['compiler_generated'] )> when 'true' -> + _rec6 + -| ['compiler_generated'] ) + ( <_186> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 339 + <'true'> when 'true' -> + %% Line 340 + ( case EvalState of + ( <( {'eval_state',_187,_188,_189,_190,_rec7,_191,_192,_193,_194} + -| ['compiler_generated'] )> when 'true' -> + _rec7 + -| ['compiler_generated'] ) + ( <_195> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_29> when 'true' -> + %% Line 336 + primop 'match_fail' + ({'case_clause',_29}) + -| ['compiler_generated'] ) + end + in let <_35> = + fun (_33) -> + %% Line 342 + case _33 of + <{Lib,_X_LibVsn,LibDir}> when 'true' -> + let = + call %% Line 343 + 'filename':%% Line 343 + 'join' + (%% Line 343 + LibDir, %% Line 343 + [101|[98|[105|[110]]]]) + in %% Line 344 + call 'code':'replace_path' + (Lib, Ebin) + ( <_34> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_34}) + -| [{'function_name',{'-eval/2-fun-1-',1}}] ) + -| ['compiler_generated'] ) + end + in do %% Line 342 + call 'lists':'foreach' + (_35, _30) + %% Line 347 + EvalState + %% Line 348 + <{'load',{Mod,_X_PrePurgeMethod,PostPurgeMethod}},EvalState> when 'true' -> + %% Line 349 + ( case EvalState of + ( <( {'eval_state',_rec8,_196,_197,_198,_199,_200,_201,_202,_203} + -| ['compiler_generated'] )> when 'true' -> + %% Line 350 + case call 'lists':'keysearch' + (Mod, 1, _rec8) of + <{'value',{_X_Mod,Bin,File}}> when 'true' -> + %% Line 353 + case call 'code':'load_binary' + (Mod, File, Bin) of + <{'module',_205}> when 'true' -> + %% Line 356 + ( case EvalState of + ( <( {'eval_state',_206,_207,_208,_209,_210,_rec9,_211,_212,_213} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'do_soft_purge'/3 + (Mod, PostPurgeMethod, _rec9) + in let <_rec10> = + call %% Line 357 + 'lists':%% Line 357 + 'keydelete' + (%% Line 357 + Mod, %% Line 357 + 1, _rec8) + in %% Line 357 + case EvalState of + <{'eval_state',_215,_216,_217,_218,_219,_220,_221,_222,_223}> when 'true' -> + let <_46> = + call %% Line 358 + 'erlang':%% Line 358 + 'setelement' + (%% Line 358 + 7, EvalState, %% Line 358 + Unpurged) + in call 'erlang':'setelement' + (2, _46, _rec10) + ( <_224> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_214> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_40> when 'true' -> + primop 'match_fail' + ({'badmatch',_40}) + -| ['compiler_generated'] ) + end + ( <_39> when 'true' -> + primop 'match_fail' + ({'badmatch',_39}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_204> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 359 + <{'remove',{Mod,_X_PrePurgeMethod,PostPurgeMethod}},EvalState> when 'true' -> + do %% Line 362 + call 'code':'purge' + (Mod) + do %% Line 363 + call 'code':'delete' + (Mod) + %% Line 366 + ( case EvalState of + ( <( {'eval_state',_225,_226,_227,_228,_229,_rec12,_230,_231,_232} + -| ['compiler_generated'] )> when 'true' -> + let = + apply 'do_soft_purge'/3 + (Mod, PostPurgeMethod, _rec12) + in %% Line 367 + case EvalState of + <{'eval_state',_234,_235,_236,_237,_238,_239,_240,_241,_242}> when 'true' -> + call 'erlang':'setelement' + (7, EvalState, Unpurged) + ( <_243> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_233> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 368 + <{'purge',Modules},EvalState> when 'true' -> + let <_55> = + fun (_53) -> + %% Line 372 + call 'code':'purge' + (_53) + in do %% Line 372 + call 'lists':'foreach' + (_55, Modules) + %% Line 373 + EvalState + %% Line 374 + <{'suspend',Modules},EvalState> when 'true' -> + let = + apply %% Line 375 + 'get_supervised_procs'/0 + () + in let <_68> = + fun (_65,_64) -> + let <_350,_351> = + case _65 of + %% Line 379 + <{Mod,ModTimeout}> when 'true' -> + %% Line 380 + + %% Line 381 + when 'true' -> + %% Line 382 + + end + in let = + apply %% Line 384 + 'get_opt'/3 + (%% Line 384 + 'suspend_timeout', %% Line 384 + EvalState, ( _351 + -| ['compiler_generated'] )) + in let = + apply %% Line 385 + 'suspend'/3 + (( _350 + -| ['compiler_generated'] ), %% Line 385 + Procs, %% Line 385 + Timeout) + in %% Line 386 + [{( _350 + -| ['compiler_generated'] ),Pids}|_64] + in %% Line 388 + ( case EvalState of + ( <( {'eval_state',_244,_245,_rec14,_246,_247,_248,_249,_250,_251} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'lists':'foldl' + (_68, _rec14, %% Line 389 + Modules) + in %% Line 390 + case EvalState of + <{'eval_state',_253,_254,_255,_256,_257,_258,_259,_260,_261}> when 'true' -> + call 'erlang':'setelement' + (4, EvalState, NewSuspended) + ( <_262> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_252> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 391 + <{'resume',Modules},EvalState> when 'true' -> + let <_81> = + fun (_78,_77) -> + let <_76> = + fun (_74) -> + %% Line 394 + case _74 of + <{Mod2,Pids}> + when call 'erlang':'==' + (Mod2, + _78) -> + do %% Line 395 + apply 'resume'/1 + (Pids) + %% Line 396 + 'false' + %% Line 397 + <_263> when 'true' -> + %% Line 398 + 'true' + end + in %% Line 394 + call 'lists':'filter' + (_76, _77) + in %% Line 402 + ( case EvalState of + ( <( {'eval_state',_264,_265,_rec16,_266,_267,_268,_269,_270,_271} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'lists':'foldl' + (_81, _rec16, %% Line 403 + Modules) + in %% Line 404 + case EvalState of + <{'eval_state',_273,_274,_275,_276,_277,_278,_279,_280,_281}> when 'true' -> + call 'erlang':'setelement' + (4, EvalState, NewSuspended) + ( <_282> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_272> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 405 + <{'code_change',Modules},EvalState> when 'true' -> + %% Line 406 + apply 'eval'/2 + ({'code_change','up',Modules}, EvalState) + %% Line 407 + <{'code_change',Mode,Modules},EvalState> when 'true' -> + %% Line 408 + ( case EvalState of + ( <( {'eval_state',_283,_284,_rec18,_285,_286,_287,_288,_289,_290} + -| ['compiler_generated'] )> when 'true' -> + %% Line 409 + ( case EvalState of + ( <( {'eval_state',_292,_293,_294,_295,_296,_297,_rec19,_298,_299} + -| ['compiler_generated'] )> when 'true' -> + let = + apply %% Line 410 + 'get_opt'/3 + (%% Line 410 + 'code_change_timeout', %% Line 410 + EvalState, %% Line 410 + 'default') + in let <_98> = + fun (_96) -> + %% Line 411 + case _96 of + <{Mod,Extra}> when 'true' -> + let <_93> = + case %% Line 413 + call 'lists':'keysearch' + (Mod, 1, _rec19) of + %% Line 414 + <{'value',{_301,OldVsn,_X_NewVsn}}> + when let <_302> = + call 'erlang':'=:=' + (_301, Mod) + in let <_303> = + call %% Line 415 + 'erlang':%% Line 415 + '=:=' + (%% Line 415 + Mode, %% Line 415 + 'up') + in call 'erlang':'and' + (_302, _303) -> + %% Line 415 + OldVsn + %% Line 416 + <{'value',{_304,_X_OldVsn,NewVsn}}> + when let <_305> = + call 'erlang':'=:=' + (_304, Mod) + in let <_306> = + call %% Line 417 + 'erlang':%% Line 417 + '=:=' + (%% Line 417 + Mode, %% Line 417 + 'down') + in call 'erlang':'and' + (_305, _306) -> + %% Line 417 + {'down',NewVsn} + %% Line 418 + <_307> + when call 'erlang':'=:=' + (Mode, + 'up') -> + 'undefined' + %% Line 419 + <_308> when 'true' -> + {'down','undefined'} + end + in %% Line 421 + case call 'lists':'keysearch' + (Mod, 1, _rec18) of + %% Line 422 + <{'value',{_X_Mod,Pids}}> when 'true' -> + %% Line 423 + apply 'change_code'/5 + (Pids, Mod, _93, Extra, Timeout) + %% Line 424 + <_309> when 'true' -> + 'ok' + end + ( <_97> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_97}) + -| [{'function_name',{'-eval/2-fun-6-',1}}] ) + -| ['compiler_generated'] ) + end + in do %% Line 411 + call 'lists':'foreach' + (_98, %% Line 427 + Modules) + %% Line 428 + EvalState + -| ['compiler_generated'] ) + ( <_300> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_291> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 429 + <{'stop',Modules},EvalState> when 'true' -> + let = + apply %% Line 430 + 'get_supervised_procs'/0 + () + in let <_107> = + fun (_104,_103) -> + let = + apply %% Line 433 + 'stop'/2 + (_104, %% Line 433 + Procs) + in %% Line 434 + [{_104,Procs2}|_103] + in %% Line 436 + ( case EvalState of + ( <( {'eval_state',_310,_rec20,_311,_312,_313,_314,_315,_316,_317} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'lists':'foldl' + (_107, _rec20, %% Line 437 + Modules) + in %% Line 438 + case EvalState of + <{'eval_state',_319,_320,_321,_322,_323,_324,_325,_326,_327}> when 'true' -> + call 'erlang':'setelement' + (3, EvalState, NewStopped) + ( <_328> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_318> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 439 + <{'start',Modules},EvalState> when 'true' -> + let <_120> = + fun (_117,_116) -> + let <_115> = + fun (_113) -> + %% Line 442 + case _113 of + <{Mod2,Procs}> + when call 'erlang':'==' + (Mod2, + _117) -> + do %% Line 443 + apply 'start'/1 + (Procs) + %% Line 444 + 'false' + %% Line 445 + <_329> when 'true' -> + %% Line 446 + 'true' + end + in %% Line 442 + call 'lists':'filter' + (_115, _116) + in %% Line 450 + ( case EvalState of + ( <( {'eval_state',_330,_rec22,_331,_332,_333,_334,_335,_336,_337} + -| ['compiler_generated'] )> when 'true' -> + let = + call 'lists':'foldl' + (_120, _rec22, %% Line 451 + Modules) + in %% Line 452 + case EvalState of + <{'eval_state',_339,_340,_341,_342,_343,_344,_345,_346,_347}> when 'true' -> + call 'erlang':'setelement' + (3, EvalState, NewStopped) + ( <_348> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_338> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + %% Line 453 + <{'sync_nodes',Id,{M,F,A}},EvalState> when 'true' -> + let <_124> = + call %% Line 454 + 'erlang':%% Line 454 + 'apply' + (%% Line 454 + M, %% Line 454 + F, %% Line 454 + A) + in do %% Line 454 + apply 'sync_nodes'/2 + (Id, _124) + %% Line 455 + EvalState + %% Line 456 + <{'sync_nodes',Id,Nodes},EvalState> when 'true' -> + do %% Line 457 + apply 'sync_nodes'/2 + (Id, Nodes) + %% Line 458 + EvalState + %% Line 459 + <{'apply',{M,F,A}},EvalState> when 'true' -> + do %% Line 460 + call 'erlang':'apply' + (M, F, A) + %% Line 461 + EvalState + %% Line 462 + <'restart_emulator',_X_EvalState> when 'true' -> + %% Line 463 + call 'erlang':'throw' + ('restart_emulator') + %% Line 464 + <'restart_new_emulator',_X_EvalState> when 'true' -> + %% Line 465 + call 'erlang':'throw' + ('restart_new_emulator') + ( <_126,_125> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_126,_125}) + -| [{'function_name',{'eval',2}}] ) + -| ['compiler_generated'] ) + end +'get_opt'/3 = + %% Line 467 + fun (_0,_1,_2) -> + %% Line 468 + ( case _1 of + ( <( {'eval_state',_9,_10,_11,_12,_13,_14,_15,_16,_rec24} + -| ['compiler_generated'] )> when 'true' -> + case call 'lists':'keysearch' + (_0, 1, _rec24) of + %% Line 469 + <{'value',{_X_Tag,Value}}> when 'true' -> + Value + %% Line 470 + <'false'> when 'true' -> + _2 + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + ( <_17> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','eval_state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) +'suspend'/3 = + %% Line 481 + fun (_0,_1,_2) -> + let <_8> = + fun (_6) -> + %% Line 482 + case _6 of + <{_X_Sup,_X_Name,Pid,Mods}> when 'true' -> + %% Line 483 + case call 'lists':'member' + (_0, Mods) of + %% Line 484 + <'true'> when 'true' -> + let <_3> = + catch + %% Line 485 + apply 'sys_suspend'/2 + (Pid, _2) + in %% Line 485 + case _3 of + %% Line 486 + <'ok'> when 'true' -> + {'true',Pid} + %% Line 487 + <_12> when 'true' -> + do try + %% Line 490 + call 'sys':'resume' + (Pid) + of <_catch_value> -> + _catch_value + catch -> + 'ok' + %% Line 491 + 'false' + end + %% Line 493 + <'false'> when 'true' -> + %% Line 494 + 'false' + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end + ( <_7> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_7}) + -| [{'function_name',{'-suspend/3-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 482 + call 'lists':'zf' + (_8, _1) +'sys_suspend'/2 = + %% Line 499 + fun (_0,_1) -> + case <_0,_1> of + when 'true' -> + %% Line 500 + call 'sys':'suspend' + (Pid) + %% Line 501 + when 'true' -> + %% Line 502 + call 'sys':'suspend' + (Pid, Timeout) + end +'resume'/1 = + %% Line 504 + fun (_0) -> + let <_3> = + fun (_1) -> + catch + %% Line 505 + call 'sys':'resume' + (_1) + in %% Line 505 + call 'lists':'foreach' + (_3, _0) +'change_code'/5 = + %% Line 507 + fun (_0,_1,_2,_3,_4) -> + let = + fun (_6) -> + %% Line 509 + case apply 'sys_change_code'/5 + (_6, _1, _2, _3, _4) of + %% Line 510 + <'ok'> when 'true' -> + %% Line 511 + 'ok' + %% Line 512 + <{'error',Reason}> when 'true' -> + %% Line 513 + call 'erlang':'throw' + ({'code_change_failed',_6,_1,_2,Reason}) + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end + in %% Line 516 + call 'lists':'foreach' + (Fun, _0) +'sys_change_code'/5 = + %% Line 518 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + when 'true' -> + %% Line 519 + call 'sys':'change_code' + (Pid, Mod, Vsn, Extra) + %% Line 520 + when 'true' -> + %% Line 521 + call 'sys':'change_code' + (Pid, Mod, Vsn, Extra, Timeout) + end +'stop'/2 = + %% Line 523 + fun (_0,_1) -> + let <_7> = + fun (_5) -> + %% Line 524 + case _5 of + <{'undefined',_X_Name,_X_Pid,_X_Mods}> when 'true' -> + %% Line 525 + 'false' + %% Line 526 + <{Sup,Name,_X_Pid,Mods}> when 'true' -> + %% Line 527 + case call 'lists':'member' + (_0, Mods) of + %% Line 528 + <'true'> when 'true' -> + let <_2> = + catch + %% Line 529 + call 'supervisor':'terminate_child' + (%% Line 530 + Sup, %% Line 530 + Name) + in %% Line 529 + case _2 of + %% Line 531 + <'ok'> when 'true' -> + {'true',{Sup,Name}} + %% Line 532 + <_10> when 'true' -> + 'false' + end + %% Line 534 + <'false'> when 'true' -> + 'false' + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end + ( <_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6}) + -| [{'function_name',{'-stop/2-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 524 + call 'lists':'zf' + (_7, _1) +'start'/1 = + %% Line 539 + fun (_0) -> + let <_3> = + fun (_1) -> + %% Line 540 + case _1 of + <{Sup,Name}> when 'true' -> + catch + %% Line 541 + call 'supervisor':'restart_child' + (Sup, Name) + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'-start/1-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 540 + call 'lists':'foreach' + (_3, _0) +'get_supervised_procs'/0 = + %% Line 579 + fun () -> + let <_6> = + fun (_3,_2) -> + let <_1> = + call %% Line 584 + 'application_controller':%% Line 584 + 'get_master' + (_3) + in %% Line 582 + apply 'get_master_procs'/3 + (_3, _2, _1) + in let <_0> = + apply %% Line 587 + 'get_application_names'/0 + () + in %% Line 580 + call 'lists':'foldl' + (_6, %% Line 586 + [], _0) +'get_supervised_procs'/4 = + %% Line 589 + fun (_0,_1,_2,_3) -> + case <_0,_1,_2,_3> of + <_12,Root,Procs,{'ok',SupMod}> when 'true' -> + let <_4> = + apply %% Line 590 + 'maybe_supervisor_which_children'/3 + (%% Line 590 + Root, %% Line 590 + SupMod, %% Line 590 + Root) + in let <_5> = + apply %% Line 590 + 'get_procs'/2 + (_4, %% Line 590 + Root) + in %% Line 590 + call 'erlang':'++' + (_5, %% Line 591 + [{'undefined','undefined',Root,[SupMod|[]]}|Procs]) + %% Line 592 + when 'true' -> + do %% Line 593 + call 'error_logger':'error_msg' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[32|[99|[97|[110|[110|[111|[116|[32|[102|[105|[110|[100|[32|[116|[111|[112|[32|[115|[117|[112|[101|[114|[118|[105|[115|[111|[114|[32|[102|[111|[114|[32|[97|[112|[112|[108|[105|[99|[97|[116|[105|[111|[110|[32|[126|[119|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 594 + [Application|[]]) + let <_6> = + apply %% Line 595 + 'maybe_supervisor_which_children'/3 + (%% Line 595 + Root, %% Line 595 + Application, %% Line 595 + Root) + in let <_7> = + apply %% Line 595 + 'get_procs'/2 + (_6, %% Line 595 + Root) + in %% Line 595 + call 'erlang':'++' + (_7, Procs) + ( <_11,_10,_9,_8> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_11,_10,_9,_8}) + -| [{'function_name',{'get_supervised_procs',4}}] ) + -| ['compiler_generated'] ) + end +'get_application_names'/0 = + %% Line 597 + fun () -> + let <_3> = + fun (_1) -> + %% Line 598 + case _1 of + <{Application,_X_Name,_X_Vsn}> when 'true' -> + %% Line 599 + Application + ( <_2> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_2}) + -| [{'function_name',{'-get_application_names/0-fun-0-',1}}] ) + -| ['compiler_generated'] ) + end + in let <_0> = + call %% Line 601 + 'application':%% Line 601 + 'which_applications' + () + in %% Line 598 + call 'lists':'map' + (_3, _0) +'get_master_procs'/3 = + %% Line 603 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + + when call 'erlang':'is_pid' + (Pid) -> + %% Line 604 + case call 'application_master':'get_child' + (Pid) of + <{Root,_X_AppMod}> when 'true' -> + let <_4> = + apply %% Line 605 + 'get_supervisor_module'/1 + (%% Line 605 + Root) + in %% Line 605 + apply 'get_supervised_procs'/4 + (Application, Root, Procs, _4) + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end + %% Line 606 + <_8,Procs,_9> when 'true' -> + %% Line 607 + Procs + end +'get_procs'/2 = + %% Line 609 + fun (_0,_1) -> + case <_0,_1> of + <[{Name,Pid,'worker','dynamic'}|T],Sup> + when call 'erlang':'is_pid' + (Pid) -> + let = + apply %% Line 610 + 'maybe_get_dynamic_mods'/2 + (%% Line 610 + Name, %% Line 610 + Pid) + in let <_3> = + apply %% Line 611 + 'get_procs'/2 + (%% Line 611 + T, %% Line 611 + Sup) + in %% Line 611 + [{Sup,Name,Pid,Mods}|_3] + %% Line 612 + <[{Name,Pid,'worker',Mods}|T],Sup> + when let <_4> = + call 'erlang':'is_pid' + (Pid) + in let <_5> = + call 'erlang':'is_list' + (Mods) + in call 'erlang':'and' + (_4, _5) -> + let <_6> = + apply %% Line 613 + 'get_procs'/2 + (%% Line 613 + T, %% Line 613 + Sup) + in %% Line 613 + [{Sup,Name,Pid,Mods}|_6] + %% Line 614 + <[{Name,Pid,'supervisor',Mods}|T],Sup> + when call 'erlang':'is_pid' + (Pid) -> + let <_9> = + apply %% Line 615 + 'get_procs'/2 + (%% Line 615 + T, %% Line 615 + Sup) + in let <_7> = + apply %% Line 616 + 'maybe_supervisor_which_children'/3 + (%% Line 616 + Pid, %% Line 616 + Name, %% Line 616 + Pid) + in let <_8> = + apply %% Line 616 + 'get_procs'/2 + (_7, %% Line 616 + Pid) + in %% Line 615 + [{Sup,Name,Pid,Mods}|call 'erlang':'++' + (_9, _8)] + %% Line 617 + <[_X_H|T],Sup> when 'true' -> + %% Line 618 + apply 'get_procs'/2 + (T, Sup) + %% Line 619 + <_12,_X_Sup> when 'true' -> + %% Line 620 + [] + end +'maybe_supervisor_which_children'/3 = + %% Line 622 + fun (_0,_1,_2) -> + %% Line 623 + case apply 'get_proc_state'/1 + (_0) of + %% Line 624 + <'noproc'> when 'true' -> + do %% Line 627 + call 'error_logger':'warning_msg' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[32|[97|[32|[112|[114|[111|[99|[101|[115|[115|[32|[40|[126|[112|[41|[32|[101|[120|[105|[116|[101|[100|[32|[100|[117|[114|[105|[110|[103|[32|[115|[117|[112|[101|[114|[118|[105|[115|[105|[111|[110|[32|[116|[114|[101|[101|[32|[105|[110|[116|[101|[114|[114|[111|[103|[97|[116|[105|[111|[110|[46|[32|[67|[111|[110|[116|[105|[110|[117|[105|[110|[103|[32|[46|[46|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 629 + [_0|[]]) + %% Line 630 + [] + %% Line 632 + <'suspended'> when 'true' -> + do %% Line 633 + call 'error_logger':'error_msg' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[32|[97|[32|[119|[104|[105|[99|[104|[95|[99|[104|[105|[108|[100|[114|[101|[110|[32|[99|[97|[108|[108|[32|[116|[111|[32|[126|[112|[32|[40|[126|[119|[41|[32|[119|[97|[115|[32|[97|[118|[111|[105|[100|[101|[100|[46|[32|[84|[104|[105|[115|[32|[115|[117|[112|[101|[114|[118|[105|[115|[111|[114|[32|[105|[115|[32|[115|[117|[115|[112|[101|[110|[100|[101|[100|[32|[97|[110|[100|[32|[115|[104|[111|[117|[108|[100|[32|[108|[105|[107|[101|[108|[121|[32|[98|[101|[32|[117|[112|[103|[114|[97|[100|[101|[100|[32|[100|[105|[102|[102|[101|[114|[101|[110|[116|[108|[121|[46|[32|[69|[120|[105|[116|[105|[110|[103|[32|[46|[46|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 636 + [_1|[_2|[]]]) + %% Line 637 + call 'erlang':'error' + ('suspended_supervisor') + %% Line 639 + <'running'> when 'true' -> + let <_3> = + catch + %% Line 640 + call 'supervisor':'which_children' + (_2) + in %% Line 640 + case _3 of + %% Line 641 + + when call 'erlang':'is_list' + (_3) -> + %% Line 642 + Res + %% Line 643 + when 'true' -> + do %% Line 644 + call 'error_logger':'error_msg' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[32|[126|[112|[126|[110|[101|[114|[114|[111|[114|[32|[100|[117|[114|[105|[110|[103|[32|[97|[32|[119|[104|[105|[99|[104|[95|[99|[104|[105|[108|[100|[114|[101|[110|[32|[99|[97|[108|[108|[32|[116|[111|[32|[126|[112|[32|[40|[126|[119|[41|[46|[32|[91|[83|[116|[97|[116|[101|[58|[32|[114|[117|[110|[110|[105|[110|[103|[93|[32|[69|[120|[105|[116|[105|[110|[103|[32|[46|[46|[46|[32|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 647 + [Other|[_1|[_2|[]]]]) + %% Line 648 + call 'erlang':'error' + ('which_children_failed') + end + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'get_proc_state'/1 = + %% Line 652 + fun (_0) -> + %% Line 657 + try + call 'sys':'get_status' + (_0) + of <_1> -> + case _1 of + %% Line 659 + <{'status',_9,{'module',_10},[_11|[State|[_12|[_13|[_14|[]]]]]]}> + when let <_2> = + call 'erlang':'=:=' + (State, 'running') + in let <_3> = + call %% Line 660 + 'erlang':%% Line 660 + '=:=' + (%% Line 660 + State, %% Line 660 + 'suspended') + in call 'erlang':'or' + (_2, _3) -> + %% Line 661 + State + ( <_4> when 'true' -> + primop 'match_fail' + ({'try_clause',_4}) + -| ['compiler_generated'] ) + end + catch <_7,_6,_5> -> + %% Line 662 + case <_7,_6,_5> of + <( 'exit' + -| ['compiler_generated'] ),( {( 'noproc' + -| ['compiler_generated'] ),( {( 'sys' + -| ['compiler_generated'] ),( 'get_status' + -| ['compiler_generated'] ),( [_15|( [] + -| ['compiler_generated'] )] + -| ['compiler_generated'] )} + -| ['compiler_generated'] )} + -| ['compiler_generated'] ),_16> + when call 'erlang':'=:=' + (_15, + _0) -> + %% Line 663 + 'noproc' + ( <_17,_18,_19> when 'true' -> + primop 'raise' + (_19, _18) + -| ['compiler_generated'] ) + end +'maybe_get_dynamic_mods'/2 = + %% Line 666 + fun (_0,_1) -> + let <_3> = + catch + let <_2> = + call %% Line 667 + 'erlang':%% Line 667 + 'self' + () + in %% Line 667 + call 'gen':'call' + (_1, _2, 'get_modules') + in %% Line 667 + case _3 of + %% Line 668 + <{'ok',Res}> when 'true' -> + %% Line 669 + Res + %% Line 670 + when 'true' -> + do %% Line 671 + call 'error_logger':'error_msg' + ([114|[101|[108|[101|[97|[115|[101|[95|[104|[97|[110|[100|[108|[101|[114|[58|[32|[126|[112|[126|[110|[101|[114|[114|[111|[114|[32|[100|[117|[114|[105|[110|[103|[32|[97|[32|[103|[101|[116|[95|[109|[111|[100|[117|[108|[101|[115|[32|[99|[97|[108|[108|[32|[116|[111|[32|[126|[112|[32|[40|[126|[119|[41|[44|[32|[116|[104|[101|[114|[101|[32|[109|[97|[121|[32|[98|[101|[32|[97|[110|[32|[101|[114|[114|[111|[114|[32|[105|[110|[32|[105|[116|[39|[115|[32|[99|[104|[105|[108|[100|[115|[112|[101|[99|[46|[32|[69|[120|[105|[116|[105|[110|[103|[32|[46|[46|[46|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 675 + [Other|[_0|[_1|[]]]]) + %% Line 676 + call 'erlang':'error' + ('get_modules_failed') + end +'get_supervisor_module'/1 = + %% Line 683 + fun (_0) -> + let <_1> = + catch + %% Line 684 + call 'supervisor':'get_callback_module' + (_0) + in %% Line 684 + case _1 of + %% Line 685 + + when call 'erlang':'is_atom' + (_1) -> + %% Line 686 + {'ok',Module} + %% Line 687 + <_X_Other> when 'true' -> + do %% Line 688 + call 'io':'format' + ([126|[119|[58|[32|[114|[101|[97|[115|[111|[110|[58|[32|[126|[119|[126|[110]]]]]]]]]]]]]]]], [_0|[_X_Other|[]]]) + %% Line 689 + {'error','undefined'} + end +'do_soft_purge'/3 = + %% Line 703 + fun (_0,_1,_2) -> + let = + call %% Line 704 + 'code':%% Line 704 + 'soft_purge' + (_0) + in %% Line 705 + case call 'lists':'keymember' + (_0, 1, _2) of + %% Line 706 + <'true'> + when call 'erlang':'=:=' + (IsNoOldProcsLeft, + 'true') -> + call 'lists':'keydelete' + (_0, 1, _2) + %% Line 707 + <'true'> when 'true' -> + _2 + %% Line 708 + <'false'> + when call 'erlang':'=:=' + (IsNoOldProcsLeft, + 'true') -> + _2 + %% Line 709 + <'false'> when 'true' -> + [{_0,_1}|_2] + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end +'sync_nodes'/2 = + %% Line 718 + fun (_0,_1) -> + let <_2> = + call %% Line 719 + 'erlang':%% Line 719 + 'node' + () + in let = + call %% Line 719 + 'lists':%% Line 719 + 'delete' + (_2, _1) + in let <_7> = + fun (_5) -> + let <_4> = + call %% Line 721 + 'erlang':%% Line 721 + 'node' + () + in %% Line 721 + call 'erlang':'!' + ({'release_handler',_5}, {'sync_nodes',_0,_4}) + in do %% Line 720 + call 'lists':'foreach' + (_7, %% Line 723 + NNodes) + let <_10> = + fun (_8) -> + %% Line 725 + receive + %% Line 726 + <{'sync_nodes',_13,_14}> + when let <_15> = + call 'erlang':'=:=' + (_13, _0) + in let <_16> = + call 'erlang':'=:=' + (_14, _8) + in call 'erlang':'and' + (_15, _16) -> + %% Line 727 + 'ok' + %% Line 728 + <{'nodedown',_17}> + when call 'erlang':'=:=' + (_17, + _8) -> + %% Line 729 + call 'erlang':'throw' + ({'sync_error',{'nodedown',_8}}) + after 'infinity' -> + 'true' + in %% Line 724 + call 'lists':'foreach' + (_10, %% Line 732 + NNodes) +'add_vsns'/3 = + %% Line 734 + fun (_0,_1,_2) -> + let = + apply %% Line 735 + 'get_current_vsn'/1 + (_0) + in let = + apply %% Line 736 + 'get_vsn'/1 + (_1) + in %% Line 737 + case call 'lists':'keysearch' + (_0, 1, _2) of + %% Line 738 + <{'value',{_11,OldVsn0,NewVsn0}}> + when call 'erlang':'=:=' + (_11, + _0) -> + let <_6> = + apply %% Line 740 + 'replace_undefined'/2 + (%% Line 740 + OldVsn0, %% Line 740 + OldVsn) + in let <_5> = + apply %% Line 741 + 'replace_undefined'/2 + (%% Line 741 + NewVsn0, %% Line 741 + NewVsn) + in %% Line 739 + call 'lists':'keyreplace' + (_0, 1, _2, {_0,_6,_5}) + %% Line 742 + <'false'> when 'true' -> + %% Line 743 + [{_0,OldVsn,NewVsn}|_2] + ( <_7> when 'true' -> + primop 'match_fail' + ({'case_clause',_7}) + -| ['compiler_generated'] ) + end +'replace_undefined'/2 = + %% Line 746 + fun (_0,_1) -> + case <_0,_1> of + <'undefined',Vsn> when 'true' -> + Vsn + %% Line 747 + when 'true' -> + Vsn + end +'get_current_vsn'/1 = + %% Line 761 + fun (_0) -> + let = + call %% Line 762 + 'code':%% Line 762 + 'which' + (_0) + in %% Line 763 + case call 'erl_prim_loader':'get_file' + (File) of + %% Line 764 + <{'ok',Bin,_X_File2}> when 'true' -> + %% Line 765 + apply 'get_vsn'/1 + (Bin) + %% Line 766 + <'error'> when 'true' -> + %% Line 769 + 'undefined' + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'get_vsn'/1 = + %% Line 778 + fun (_0) -> + %% Line 779 + case call 'beam_lib':'version' + (_0) of + <{'ok',{_X_Mod,Vsn}}> when 'true' -> + %% Line 780 + case call 'misc_supp':'is_string' + (Vsn) of + %% Line 781 + <'true'> when 'true' -> + %% Line 782 + Vsn + %% Line 783 + <'false'> when 'true' -> + %% Line 786 + case Vsn of + %% Line 787 + <[VsnTerm|[]]> when 'true' -> + %% Line 788 + VsnTerm + %% Line 789 + <_5> when 'true' -> + %% Line 790 + Vsn + end + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('release_handler_1') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('release_handler_1', _0) +end \ No newline at end of file diff --git a/test/data/sasl/sasl.core b/test/data/sasl/sasl.core new file mode 100644 index 0000000..6e6c4c2 --- /dev/null +++ b/test/data/sasl/sasl.core @@ -0,0 +1,540 @@ +module 'sasl' ['init'/1, + 'module_info'/0, + 'module_info'/1, + 'pred'/1, + 'start'/2, + 'stop'/1] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[97|[115|[108|[46|[101|[114|[108]]]]]]]]]]]],1}], + %% Line 32 + 'behaviour' = + %% Line 32 + ['application'], + %% Line 34 + 'record' = + %% Line 34 + [{'state',[{'record_field',34,{'atom',34,'sasl_logger'}}|[{'record_field',34,{'atom',34,'error_logger_mf'}}]]}]] +'start'/2 = + %% Line 36 + fun (_0,_1) -> + case <_0,_1> of + <_8,[]> when 'true' -> + %% Line 37 + case apply 'get_logger_info'/0 + () of + <{Dest,Level}> when 'true' -> + let = + apply %% Line 38 + 'get_error_logger_mf'/0 + () + in do %% Line 39 + apply 'add_sasl_logger'/2 + (Dest, Level) + do %% Line 40 + apply 'add_error_logger_mf'/1 + (Mf) + let = {%% Line 41 + 'state',%% Line 41 + Dest,%% Line 41 + Mf} + in %% Line 42 + case call 'supervisor':'start_link' + ({'local','sasl_sup'}, 'sasl', []) of + %% Line 43 + <{'ok',Pid}> when 'true' -> + {'ok',Pid,State} + %% Line 44 + when 'true' -> + Error + end + ( <_2> when 'true' -> + primop 'match_fail' + ({'badmatch',_2}) + -| ['compiler_generated'] ) + end + ( <_7,_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_7,_6}) + -| [{'function_name',{'start',2}}] ) + -| ['compiler_generated'] ) + end +'stop'/1 = + %% Line 47 + fun (_0) -> + %% Line 48 + ( case _0 of + ( <( {'state',_rec0,_6} + -| ['compiler_generated'] )> when 'true' -> + do apply 'delete_sasl_logger'/1 + (_rec0) + %% Line 49 + ( case _0 of + ( <( {'state',_8,_rec1} + -| ['compiler_generated'] )> when 'true' -> + apply 'delete_error_logger_mf'/1 + (_rec1) + -| ['compiler_generated'] ) + ( <_9> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_7> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','state'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) +'get_logger_info'/0 = + %% Line 54 + fun () -> + %% Line 55 + case call 'application':'get_env' + ('kernel', 'logger_sasl_compatible') of + %% Line 56 + <{'ok','true'}> when 'true' -> + let <_1> = + apply %% Line 57 + 'get_logger_dest'/0 + () + in let <_0> = + apply %% Line 57 + 'get_logger_level'/0 + () + in %% Line 57 + {_1,_0} + %% Line 58 + <_3> when 'true' -> + %% Line 59 + {'std','undefined'} + end +'get_logger_dest'/0 = + %% Line 62 + fun () -> + %% Line 63 + case call 'application':'get_env' + ('sasl', 'sasl_error_logger') of + %% Line 64 + <{'ok','false'}> when 'true' -> + 'undefined' + %% Line 65 + <{'ok','tty'}> when 'true' -> + 'standard_io' + %% Line 66 + <{'ok',_@r0 = {'file',File}}> + when call 'erlang':'is_list' + (File) -> + _@r0 + %% Line 67 + <{'ok',_@r1 = {'file',File,Modes}}> + when let <_0> = + call 'erlang':'is_list' + (File) + in let <_1> = + call 'erlang':'is_list' + (Modes) + in call 'erlang':'and' + (_0, _1) -> + %% Line 68 + _@r1 + %% Line 69 + <{'ok',Bad}> when 'true' -> + call 'erlang':'exit' + ({'bad_config',{'sasl',{'sasl_logger_dest',Bad}}}) + %% Line 70 + <'undefined'> when 'true' -> + 'standard_io' + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'get_logger_level'/0 = + %% Line 73 + fun () -> + %% Line 74 + case call 'application':'get_env' + ('sasl', 'errlog_type') of + %% Line 75 + <{'ok','error'}> when 'true' -> + 'error' + %% Line 76 + <{'ok','progress'}> when 'true' -> + 'info' + %% Line 77 + <{'ok','all'}> when 'true' -> + 'info' + %% Line 78 + <{'ok',Bad}> when 'true' -> + call 'erlang':'exit' + ({'bad_config',{'sasl',{'errlog_type',Bad}}}) + %% Line 79 + <_1> when 'true' -> + 'info' + end +'get_error_logger_mf'/0 = + %% Line 82 + fun () -> + let <_0> = + catch + %% Line 83 + apply 'get_mf'/0 + () + in %% Line 83 + case _0 of + %% Line 84 + <{'EXIT',Reason}> when 'true' -> + %% Line 85 + call 'erlang':'exit' + (Reason) + %% Line 86 + when 'true' -> + %% Line 87 + Mf + end +'get_mf'/0 = + %% Line 90 + fun () -> + let = + apply %% Line 91 + 'get_mf_dir'/0 + () + in let = + apply %% Line 92 + 'get_mf_maxb'/0 + () + in let = + apply %% Line 93 + 'get_mf_maxf'/0 + () + in %% Line 94 + case of + %% Line 95 + <'undefined','undefined','undefined'> when 'true' -> + %% Line 96 + 'undefined' + %% Line 97 + <( 'undefined' + -| ['compiler_generated'] ),_4,_5> when 'true' -> + %% Line 98 + call 'erlang':'exit' + ({'missing_config',{'sasl','error_logger_mf_dir'}}) + %% Line 99 + <_6,( 'undefined' + -| ['compiler_generated'] ),_7> when 'true' -> + %% Line 100 + call 'erlang':'exit' + ({'missing_config',{'sasl','error_logger_mf_maxbytes'}}) + %% Line 101 + <_8,_9,( 'undefined' + -| ['compiler_generated'] )> when 'true' -> + %% Line 102 + call 'erlang':'exit' + ({'missing_config',{'sasl','error_logger_mf_maxfiles'}}) + %% Line 103 + <( _10 + -| ['compiler_generated'] ),( _11 + -| ['compiler_generated'] ),( _12 + -| ['compiler_generated'] )> when 'true' -> + ( {( _10 + -| ['compiler_generated'] ),( _11 + -| ['compiler_generated'] ),( _12 + -| ['compiler_generated'] )} + -| ['compiler_generated'] ) + end +'get_mf_dir'/0 = + %% Line 107 + fun () -> + %% Line 108 + case call 'application':'get_env' + ('sasl', 'error_logger_mf_dir') of + %% Line 109 + <{'ok','false'}> when 'true' -> + 'undefined' + %% Line 110 + <{'ok',Dir}> + when call 'erlang':'is_list' + (Dir) -> + Dir + %% Line 111 + <'undefined'> when 'true' -> + 'undefined' + %% Line 112 + <{'ok',Bad}> when 'true' -> + call 'erlang':'exit' + ({'bad_config',{'sasl',{'error_logger_mf_dir',Bad}}}) + ( <_0> when 'true' -> + primop 'match_fail' + ({'case_clause',_0}) + -| ['compiler_generated'] ) + end +'get_mf_maxb'/0 = + %% Line 115 + fun () -> + %% Line 116 + case call 'application':'get_env' + ('sasl', 'error_logger_mf_maxbytes') of + %% Line 117 + <{'ok',MaxB}> + when call 'erlang':'is_integer' + (MaxB) -> + MaxB + %% Line 118 + <'undefined'> when 'true' -> + 'undefined' + %% Line 119 + <{'ok',Bad}> when 'true' -> + call 'erlang':'exit' + ({'bad_config',{'sasl',{'error_logger_mf_maxbytes',Bad}}}) + ( <_0> when 'true' -> + primop 'match_fail' + ({'case_clause',_0}) + -| ['compiler_generated'] ) + end +'get_mf_maxf'/0 = + %% Line 122 + fun () -> + %% Line 123 + case call 'application':'get_env' + ('sasl', 'error_logger_mf_maxfiles') of + %% Line 124 + <{'ok',MaxF}> + when try + let <_0> = + call 'erlang':'is_integer' + (MaxF) + in let <_1> = + call 'erlang':'>' + (MaxF, 0) + in let <_2> = + call 'erlang':'<' + (MaxF, 256) + in let <_3> = + call 'erlang':'and' + (_1, _2) + in call 'erlang':'and' + (_0, _3) + of -> + Try + catch -> + 'false' -> + MaxF + %% Line 125 + <'undefined'> when 'true' -> + 'undefined' + %% Line 126 + <{'ok',Bad}> when 'true' -> + call 'erlang':'exit' + ({'bad_config',{'sasl',{'error_logger_mf_maxfiles',Bad}}}) + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end +'add_sasl_logger'/2 = + %% Line 129 + fun (_0,_1) -> + case <_0,_1> of + <'undefined',_X_Level> when 'true' -> + 'ok' + %% Line 130 + <'std','undefined'> when 'true' -> + 'ok' + %% Line 131 + when 'true' -> + do %% Line 134 + case Level of + %% Line 135 + <'info'> when 'true' -> + apply 'allow_progress'/0 + () + %% Line 136 + <_11> when 'true' -> + 'ok' + end + let <_6> = + ~{%% Line 147 + 'type'=>Dest}~ + in let <_7> = + ~{%% Line 139 + 'level'=>Level,%% Line 140 + 'filter_default'=>'stop',%% Line 141 + 'filters'=>%% Line 142 + [{'remote_gl',{fun 'logger_filters':'remote_gl'/2,'stop'}}|[{'sasl_domain',{fun 'logger_filters':'domain'/2,{'log','equal',['otp'|['sasl']]}}}]],%% Line 147 + 'config'=>_6,%% Line 148 + 'formatter'=>{'logger_formatter',~{'legacy_header'=>'true','single_line'=>'false'}~}}~ + in let <_12> = + call %% Line 138 + 'logger':%% Line 138 + 'add_handler' + (%% Line 138 + 'sasl', %% Line 138 + 'logger_std_h', _7) + in %% Line 138 + case _12 of + <'ok'> when 'true' -> + ( _12 + -| ['compiler_generated'] ) + ( <_8> when 'true' -> + primop 'match_fail' + ({'badmatch',_8}) + -| ['compiler_generated'] ) + end + end +'delete_sasl_logger'/1 = + %% Line 150 + fun (_0) -> + case _0 of + <'undefined'> when 'true' -> + 'ok' + %% Line 151 + <'std'> when 'true' -> + 'ok' + %% Line 152 + <_X_Type> when 'true' -> + do %% Line 153 + ( call ( 'logger' + -| ['result_not_wanted'] ):( 'remove_handler' + -| ['result_not_wanted'] ) + (( 'sasl' + -| ['result_not_wanted'] )) + -| ['result_not_wanted'] ) + %% Line 154 + 'ok' + end +'add_error_logger_mf'/1 = + %% Line 156 + fun (_0) -> + case _0 of + <'undefined'> when 'true' -> + 'ok' + %% Line 157 + <{Dir,MaxB,MaxF}> when 'true' -> + do %% Line 158 + apply 'allow_progress'/0 + () + let <_1> = 'pred'/1 + in let <_2> = + call %% Line 160 + 'log_mf_h':%% Line 160 + 'init' + (%% Line 160 + Dir, %% Line 160 + MaxB, %% Line 160 + MaxF, _1) + in %% Line 159 + call 'error_logger':'add_report_handler' + (%% Line 160 + 'log_mf_h', _2) + ( <_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_3}) + -| [{'function_name',{'add_error_logger_mf',1}}] ) + -| ['compiler_generated'] ) + end +'delete_error_logger_mf'/1 = + %% Line 162 + fun (_0) -> + case _0 of + <'undefined'> when 'true' -> + 'ok' + %% Line 163 + <_2> when 'true' -> + %% Line 164 + call 'error_logger':'delete_report_handler' + ('log_mf_h') + end +'pred'/1 = + %% Line 166 + fun (_0) -> + case _0 of + <{_X_Type,GL,_X_Msg}> + when try + let <_2> = + call 'erlang':'node' + (GL) + in let <_1> = + call 'erlang':'node' + () + in call 'erlang':'=/=' + (_2, _1) + of -> + Try + catch -> + 'false' -> + 'false' + %% Line 167 + <_4> when 'true' -> + 'true' + end +'allow_progress'/0 = + %% Line 169 + fun () -> + %% Line 170 + case call 'logger':'get_primary_config' + () of + <~{'level':=PL}~> when 'true' -> + %% Line 171 + case call 'logger':'compare_levels' + ('info', PL) of + %% Line 172 + <'lt'> when 'true' -> + let <_3> = + call 'logger':'set_primary_config' + ('level', 'info') + in case _3 of + <'ok'> when 'true' -> + ( _3 + -| ['compiler_generated'] ) + ( <_1> when 'true' -> + primop 'match_fail' + ({'badmatch',_1}) + -| ['compiler_generated'] ) + end + %% Line 173 + <_4> when 'true' -> + 'ok' + end + ( <_0> when 'true' -> + primop 'match_fail' + ({'badmatch',_0}) + -| ['compiler_generated'] ) + end +'init'/1 = + %% Line 179 + fun (_0) -> + case _0 of + <[]> when 'true' -> + %% Line 191 + {'ok',{{'one_for_one',0,1},[{'sasl_safe_sup',{'supervisor','start_link',[{'local','sasl_safe_sup'}|['sasl'|['safe']]]},'permanent','infinity','supervisor',['sasl']}|[{'release_handler',{'release_handler','start_link',[]},'permanent',2000,'worker',[]}]]}} + %% Line 192 + <'safe'> when 'true' -> + %% Line 197 + {'ok',{{'one_for_one',4,3600},[{'alarm_handler',{'alarm_handler','start_link',[]},'permanent',2000,'worker','dynamic'}]}} + ( <_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6}) + -| [{'function_name',{'init',1}}] ) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('sasl') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('sasl', _0) +end \ No newline at end of file diff --git a/test/data/sasl/sasl_report.core b/test/data/sasl/sasl_report.core new file mode 100644 index 0000000..c4e29e1 --- /dev/null +++ b/test/data/sasl/sasl_report.core @@ -0,0 +1,770 @@ +module 'sasl_report' ['format_report'/3, + 'module_info'/0, + 'module_info'/1, + 'write_report'/3] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[97|[115|[108|[95|[114|[101|[112|[111|[114|[116|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]],1}]] +'format_report'/3 = + %% Line 24 + fun (_0,_1,_2) -> + %% Line 25 + apply 'io_report'/4 + ('io_lib', _0, _1, _2) +'write_report'/3 = + %% Line 27 + fun (_0,_1,_2) -> + %% Line 28 + apply 'io_report'/4 + ('io', _0, _1, _2) +'io_report'/4 = + %% Line 30 + fun (_0,_1,_2,_3) -> + case <_0,_1,_2,_3> of + when 'true' -> + %% Line 31 + case apply 'is_my_error_report'/2 + (What, Type) of + %% Line 32 + <'true'> when 'true' -> + let = + apply %% Line 33 + 'write_head'/3 + (%% Line 33 + Type, %% Line 33 + Time, %% Line 33 + Pid) + in %% Line 34 + apply 'write_report2'/5 + (IO, Fd, Head, Type, Report) + %% Line 35 + <_12> when 'true' -> + 'true' + end + %% Line 37 + when 'true' -> + %% Line 38 + case apply 'is_my_info_report'/2 + (What, Type) of + %% Line 39 + <'true'> when 'true' -> + let = + apply %% Line 40 + 'write_head'/3 + (%% Line 40 + Type, %% Line 40 + Time, %% Line 40 + Pid) + in %% Line 41 + apply 'write_report2'/5 + (IO, Fd, Head, Type, Report) + %% Line 42 + <_13> when 'true' -> + 'true' + end + %% Line 44 + <_X_IO,_X_Fd,_14,_15> when 'true' -> + %% Line 45 + 'false' + end +'is_my_error_report'/2 = + %% Line 47 + fun (_0,_1) -> + case <_0,_1> of + <'all',Type> when 'true' -> + apply 'is_my_error_report'/1 + (Type) + %% Line 48 + <'error',Type> when 'true' -> + apply 'is_my_error_report'/1 + (Type) + %% Line 49 + <_4,_X_Type> when 'true' -> + 'false' + end +'is_my_error_report'/1 = + %% Line 51 + fun (_0) -> + case _0 of + <'supervisor_report'> when 'true' -> + 'true' + %% Line 52 + <'crash_report'> when 'true' -> + 'true' + %% Line 53 + <_2> when 'true' -> + 'false' + end +'is_my_info_report'/2 = + %% Line 55 + fun (_0,_1) -> + case <_0,_1> of + <'all',Type> when 'true' -> + apply 'is_my_info_report'/1 + (Type) + %% Line 56 + <'progress',Type> when 'true' -> + apply 'is_my_info_report'/1 + (Type) + %% Line 57 + <_4,_X_Type> when 'true' -> + 'false' + end +'is_my_info_report'/1 = + %% Line 59 + fun (_0) -> + case _0 of + <'progress'> when 'true' -> + 'true' + %% Line 60 + <_2> when 'true' -> + 'false' + end +'write_report2'/5 = + %% Line 62 + fun (_0,_1,_2,_3,_4) -> + case <_0,_1,_2,_3,_4> of + when 'true' -> + let = + apply %% Line 63 + 'sup_get'/2 + (%% Line 63 + 'supervisor', %% Line 63 + Report) + in let = + apply %% Line 64 + 'sup_get'/2 + (%% Line 64 + 'errorContext', %% Line 64 + Report) + in let = + apply %% Line 65 + 'sup_get'/2 + (%% Line 65 + 'reason', %% Line 65 + Report) + in let = + apply %% Line 66 + 'sup_get'/2 + (%% Line 66 + 'offender', %% Line 66 + Report) + in let = + apply %% Line 67 + 'encoding'/1 + (%% Line 67 + Fd) + in %% Line 68 + case apply 'supervisor_format'/2 + ([Name|[Context|[Reason|[Offender|[]]]]], Enc) of + <{FmtString,Args}> when 'true' -> + let = + call %% Line 69 + 'io_lib':%% Line 69 + 'format' + (%% Line 69 + FmtString, %% Line 69 + Args) + in %% Line 70 + apply 'write_report_action'/4 + (IO, Fd, Head, String) + ( <_10> when 'true' -> + primop 'match_fail' + ({'badmatch',_10}) + -| ['compiler_generated'] ) + end + %% Line 71 + when 'true' -> + let = + apply %% Line 72 + 'encoding'/1 + (%% Line 72 + Fd) + in let = + call %% Line 73 + 'error_logger':%% Line 73 + 'get_format_depth' + () + in let = + apply %% Line 74 + 'format_key_val'/3 + (%% Line 74 + Report, %% Line 74 + Encoding, %% Line 74 + Depth) + in %% Line 75 + apply 'write_report_action'/4 + (IO, Fd, Head, String) + %% Line 76 + when 'true' -> + let = + apply %% Line 77 + 'encoding'/1 + (%% Line 77 + Fd) + in let = + call %% Line 78 + 'error_logger':%% Line 78 + 'get_format_depth' + () + in let = + call %% Line 79 + 'proc_lib':%% Line 79 + 'format' + (%% Line 79 + Report, %% Line 79 + Encoding, %% Line 79 + Depth) + in %% Line 80 + apply 'write_report_action'/4 + (IO, Fd, Head, String) + ( <_22,_21,_20,_19,_18> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_22,_21,_20,_19,_18}) + -| [{'function_name',{'write_report2',5}}] ) + -| ['compiler_generated'] ) + end +'supervisor_format'/2 = + %% Line 82 + fun (_0,_1) -> + let <_2> = + call %% Line 83 + 'error_logger':%% Line 83 + 'get_format_depth' + () + in %% Line 83 + case apply 'p'/2 + (_1, _2) of + <{P,Tl}> when 'true' -> + %% Line 84 + case _0 of + <[A|[B|[C|[D|[]]]]]> when 'true' -> + let <_5> = + [%% Line 85 + C|%% Line 85 + call 'erlang':'++' + (Tl, [D|Tl])] + in let <_6> = + [%% Line 85 + B|%% Line 85 + call 'erlang':'++' + (Tl, _5)] + in let = + [%% Line 85 + A|%% Line 85 + call 'erlang':'++' + (Tl, _6)] + in let <_8> = + call %% Line 89 + 'erlang':%% Line 89 + '++' + (%% Line 89 + P, %% Line 89 + [10|[126|[110]]]) + in let <_9> = + call %% Line 89 + 'erlang':%% Line 89 + '++' + (%% Line 88 + [10|[32|[32|[32|[32|[32|[79|[102|[102|[101|[110|[100|[101|[114|[58|[32|[32|[32|[126|[56|[48|[46|[49|[56]]]]]]]]]]]]]]]]]]]]]]]], _8) + in let <_10> = + call %% Line 88 + 'erlang':%% Line 88 + '++' + (%% Line 88 + P, _9) + in let <_11> = + call %% Line 88 + 'erlang':%% Line 88 + '++' + (%% Line 87 + [10|[32|[32|[32|[32|[32|[82|[101|[97|[115|[111|[110|[58|[32|[32|[32|[32|[32|[126|[56|[48|[46|[49|[56]]]]]]]]]]]]]]]]]]]]]]]], _10) + in let <_12> = + call %% Line 87 + 'erlang':%% Line 87 + '++' + (%% Line 87 + P, _11) + in let <_13> = + call %% Line 87 + 'erlang':%% Line 87 + '++' + (%% Line 86 + [10|[32|[32|[32|[32|[32|[67|[111|[110|[116|[101|[120|[116|[58|[32|[32|[32|[32|[126]]]]]]]]]]]]]]]]]]], _12) + in let <_14> = + call %% Line 86 + 'erlang':%% Line 86 + '++' + (%% Line 86 + P, _13) + in let <_15> = + call %% Line 86 + 'erlang':%% Line 86 + '++' + (%% Line 86 + [32|[32|[32|[32|[32|[83|[117|[112|[101|[114|[118|[105|[115|[111|[114|[58|[32|[126]]]]]]]]]]]]]]]]]], _14) + in %% Line 86 + {_15,%% Line 90 + Args} + ( <_4> when 'true' -> + primop 'match_fail' + ({'badmatch',_4}) + -| ['compiler_generated'] ) + end + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end +'write_report_action'/4 = + %% Line 92 + fun (_0,_1,_2,_3) -> + let = + [_2|_3] + in %% Line 94 + case _0 of + %% Line 95 + <'io'> when 'true' -> + call 'io':'put_chars' + (_1, S) + %% Line 96 + <'io_lib'> when 'true' -> + S + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'format_key_val'/3 = + %% Line 99 + fun (_0,_1,_2) -> + %% Line 100 + case apply 'p'/2 + (_1, _2) of + <{P,Tl}> when 'true' -> + %% Line 101 + apply 'format_key_val1'/3 + (_0, P, Tl) + ( <_3> when 'true' -> + primop 'match_fail' + ({'badmatch',_3}) + -| ['compiler_generated'] ) + end +'format_key_val1'/3 = + %% Line 103 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[{Tag,Data}|Rep],P,Tl> when 'true' -> + let <_4> = + call %% Line 104 + 'erlang':%% Line 104 + '++' + (%% Line 104 + P, %% Line 104 + [10]) + in let <_5> = + call %% Line 104 + 'erlang':%% Line 104 + '++' + (%% Line 104 + [32|[32|[32|[32|[126|[49|[54|[119|[58|[32|[126]]]]]]]]]]], _4) + in let <_6> = + call %% Line 104 + 'io_lib':%% Line 104 + 'format' + (_5, %% Line 104 + [Tag|[Data|Tl]]) + in let <_3> = + apply %% Line 105 + 'format_key_val1'/3 + (%% Line 105 + Rep, %% Line 105 + P, %% Line 105 + Tl) + in %% Line 104 + call 'erlang':'++' + (_6, _3) + %% Line 106 + <_10,_11,_12> when 'true' -> + %% Line 107 + [] + end +'p'/2 = + %% Line 109 + fun (_0,_1) -> + let <_10,_11> = + case _1 of + %% Line 111 + <'unlimited'> when 'true' -> + <[112],[]> + %% Line 112 + <_9> when 'true' -> + <[80],[_1|[]]> + end + in let <_5> = + apply %% Line 114 + 'modifier'/1 + (_0) + in let

= + call %% Line 114 + 'erlang':%% Line 114 + '++' + (_5, ( _10 + -| ['compiler_generated'] )) + in %% Line 115 + {P,( _11 + -| ['compiler_generated'] )} +'encoding'/1 = + %% Line 117 + fun (_0) -> + let <_1> = + call %% Line 118 + 'io':%% Line 118 + 'getopts' + (_0) + in %% Line 118 + case call 'lists':'keyfind' + ('encoding', 1, _1) of + %% Line 119 + <'false'> when 'true' -> + 'latin1' + %% Line 120 + <{'encoding',Enc}> when 'true' -> + Enc + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'modifier'/1 = + %% Line 123 + fun (_0) -> + case _0 of + <'latin1'> when 'true' -> + [] + %% Line 124 + <_2> when 'true' -> + [116] + end +'sup_get'/2 = + %% Line 126 + fun (_0,_1) -> + %% Line 127 + case call 'lists':'keysearch' + (_0, 1, _1) of + %% Line 128 + <{'value',{_5,Value}}> when 'true' -> + %% Line 129 + Value + %% Line 130 + <_6> when 'true' -> + %% Line 131 + [] + end +'maybe_utc'/1 = + %% Line 134 + fun (_0) -> + %% Line 135 + case call 'application':'get_env' + ('sasl', 'utc_log') of + %% Line 136 + <{'ok','true'}> when 'true' -> + %% Line 137 + case call 'calendar':'local_time_to_universal_time_dst' + (_0) of + %% Line 138 + <[UTC|[]]> when 'true' -> + %% Line 139 + {'utc',UTC} + %% Line 140 + <[UTC1|[_X_UTC2|[]]]> when 'true' -> + %% Line 141 + {'utc',UTC1} + %% Line 142 + <[]> when 'true' -> + _0 + ( <_1> when 'true' -> + primop 'match_fail' + ({'case_clause',_1}) + -| ['compiler_generated'] ) + end + %% Line 145 + <_4> when 'true' -> + _0 + end +'write_head'/3 = + %% Line 149 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <'supervisor_report',Time,Pid> when 'true' -> + let <_3> = + apply %% Line 150 + 'maybe_utc'/1 + (%% Line 150 + Time) + in %% Line 150 + apply 'write_head1'/3 + ([83|[85|[80|[69|[82|[86|[73|[83|[79|[82|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]]]]]]], _3, Pid) + %% Line 151 + <'crash_report',Time,Pid> when 'true' -> + let <_4> = + apply %% Line 152 + 'maybe_utc'/1 + (%% Line 152 + Time) + in %% Line 152 + apply 'write_head1'/3 + ([67|[82|[65|[83|[72|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]], _4, Pid) + %% Line 153 + <'progress',Time,Pid> when 'true' -> + let <_5> = + apply %% Line 154 + 'maybe_utc'/1 + (%% Line 154 + Time) + in %% Line 154 + apply 'write_head1'/3 + ([80|[82|[79|[71|[82|[69|[83|[83|[32|[82|[69|[80|[79|[82|[84]]]]]]]]]]]]]]], _5, Pid) + ( <_8,_7,_6> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_8,_7,_6}) + -| [{'function_name',{'write_head',3}}] ) + -| ['compiler_generated'] ) + end +'write_head1'/3 = + %% Line 156 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + + when try + let <_4> = + call 'erlang':'node' + (Pid) + in let <_3> = + call 'erlang':'node' + () + in call 'erlang':'/=' + (_4, _3) + of -> + Try + catch -> + 'false' -> + let <_5> = + apply %% Line 158 + 'month'/1 + (%% Line 158 + Mo) + in let <_6> = + apply %% Line 158 + 't'/1 + (%% Line 158 + H) + in let <_7> = + apply %% Line 158 + 't'/1 + (%% Line 158 + Mi) + in let <_8> = + apply %% Line 158 + 't'/1 + (%% Line 158 + S) + in let <_9> = + call %% Line 158 + 'erlang':%% Line 158 + 'node' + (%% Line 158 + Pid) + in %% Line 157 + call 'io_lib':'format' + ([126|[110|[61|[126|[115|[61|[61|[61|[61|[32|[126|[112|[45|[126|[115|[45|[126|[112|[58|[58|[126|[115|[58|[126|[115|[58|[126|[115|[32|[85|[84|[67|[32|[40|[126|[112|[41|[32|[61|[61|[61|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 158 + [Type|[D|[_5|[Y|[_6|[_7|[_8|[_9|[]]]]]]]]]) + %% Line 159 + when 'true' -> + let <_10> = + apply %% Line 161 + 'month'/1 + (%% Line 161 + Mo) + in let <_11> = + apply %% Line 161 + 't'/1 + (%% Line 161 + H) + in let <_12> = + apply %% Line 161 + 't'/1 + (%% Line 161 + Mi) + in let <_13> = + apply %% Line 161 + 't'/1 + (%% Line 161 + S) + in %% Line 160 + call 'io_lib':'format' + ([126|[110|[61|[126|[115|[61|[61|[61|[61|[32|[126|[112|[45|[126|[115|[45|[126|[112|[58|[58|[126|[115|[58|[126|[115|[58|[126|[115|[32|[85|[84|[67|[32|[61|[61|[61|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 161 + [Type|[D|[_10|[Y|[_11|[_12|[_13|[]]]]]]]]) + %% Line 162 + + when try + let <_15> = + call 'erlang':'node' + (Pid) + in let <_14> = + call 'erlang':'node' + () + in call 'erlang':'/=' + (_15, _14) + of -> + Try + catch -> + 'false' -> + let <_16> = + apply %% Line 164 + 'month'/1 + (%% Line 164 + Mo) + in let <_17> = + apply %% Line 164 + 't'/1 + (%% Line 164 + H) + in let <_18> = + apply %% Line 164 + 't'/1 + (%% Line 164 + Mi) + in let <_19> = + apply %% Line 164 + 't'/1 + (%% Line 164 + S) + in let <_20> = + call %% Line 164 + 'erlang':%% Line 164 + 'node' + (%% Line 164 + Pid) + in %% Line 163 + call 'io_lib':'format' + ([126|[110|[61|[126|[115|[61|[61|[61|[61|[32|[126|[112|[45|[126|[115|[45|[126|[112|[58|[58|[126|[115|[58|[126|[115|[58|[126|[115|[32|[40|[126|[112|[41|[32|[61|[61|[61|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 164 + [Type|[D|[_16|[Y|[_17|[_18|[_19|[_20|[]]]]]]]]]) + %% Line 165 + when 'true' -> + let <_21> = + apply %% Line 167 + 'month'/1 + (%% Line 167 + Mo) + in let <_22> = + apply %% Line 167 + 't'/1 + (%% Line 167 + H) + in let <_23> = + apply %% Line 167 + 't'/1 + (%% Line 167 + Mi) + in let <_24> = + apply %% Line 167 + 't'/1 + (%% Line 167 + S) + in %% Line 166 + call 'io_lib':'format' + ([126|[110|[61|[126|[115|[61|[61|[61|[61|[32|[126|[112|[45|[126|[115|[45|[126|[112|[58|[58|[126|[115|[58|[126|[115|[58|[126|[115|[32|[61|[61|[61|[126|[110]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], %% Line 167 + [Type|[D|[_21|[Y|[_22|[_23|[_24|[]]]]]]]]) + ( <_27,_26,_25> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_27,_26,_25}) + -| [{'function_name',{'write_head1',3}}] ) + -| ['compiler_generated'] ) + end +'t'/1 = + %% Line 169 + fun (_0) -> + case _0 of + + when call 'erlang':'is_integer' + (_0) -> + let <_1> = + call %% Line 170 + 'erlang':%% Line 170 + 'integer_to_list' + (%% Line 170 + X) + in %% Line 170 + apply 't1'/1 + (_1) + %% Line 171 + <_3> when 'true' -> + %% Line 172 + [] + end +'t1'/1 = + %% Line 173 + fun (_0) -> + case _0 of + <_@r0 = [X|[]]> when 'true' -> + [48|_@r0] + %% Line 174 + when 'true' -> + X + end +'month'/1 = + %% Line 176 + fun (_0) -> + case _0 of + <1> when 'true' -> + [74|[97|[110]]] + %% Line 177 + <2> when 'true' -> + [70|[101|[98]]] + %% Line 178 + <3> when 'true' -> + [77|[97|[114]]] + %% Line 179 + <4> when 'true' -> + [65|[112|[114]]] + %% Line 180 + <5> when 'true' -> + [77|[97|[121]]] + %% Line 181 + <6> when 'true' -> + [74|[117|[110]]] + %% Line 182 + <7> when 'true' -> + [74|[117|[108]]] + %% Line 183 + <8> when 'true' -> + [65|[117|[103]]] + %% Line 184 + <9> when 'true' -> + [83|[101|[112]]] + %% Line 185 + <10> when 'true' -> + [79|[99|[116]]] + %% Line 186 + <11> when 'true' -> + [78|[111|[118]]] + %% Line 187 + <12> when 'true' -> + [68|[101|[99]]] + ( <_1> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_1}) + -| [{'function_name',{'month',1}}] ) + -| ['compiler_generated'] ) + end +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('sasl_report') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('sasl_report', _0) +end \ No newline at end of file diff --git a/test/data/sasl/sasl_report_file_h.core b/test/data/sasl/sasl_report_file_h.core new file mode 100644 index 0000000..9e1cf08 --- /dev/null +++ b/test/data/sasl/sasl_report_file_h.core @@ -0,0 +1,198 @@ +module 'sasl_report_file_h' ['handle_call'/2, + 'handle_event'/2, + 'handle_info'/2, + 'init'/1, + 'module_info'/0, + 'module_info'/1, + 'terminate'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[97|[115|[108|[95|[114|[101|[112|[111|[114|[116|[95|[102|[105|[108|[101|[95|[104|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]]],1}]] +'init'/1 = + %% Line 32 + fun (_0) -> + case _0 of + <{File,Modes0,Type}> + when call 'erlang':'is_list' + (Modes0) -> + do %% Line 33 + call 'erlang':'process_flag' + ('trap_exit', 'true') + let <_2> = + case %% Line 35 + call 'lists':'keymember' + ('encoding', 1, Modes0) of + %% Line 36 + <'true'> when 'true' -> + Modes0 + %% Line 37 + <'false'> when 'true' -> + [{'encoding','utf8'}|Modes0] + ( <_1> when 'true' -> + %% Line 35 + primop 'match_fail' + ({'case_clause',_1}) + -| ['compiler_generated'] ) + end + in let <_9> = + letrec + 'lc$^0'/1 = + %% Line 40 + fun (_6) -> + case _6 of + <[M|_5]> when 'true' -> + ( case call 'lists':'member' + (M, ['write'|['append'|['exclusive']]]) of + <'true'> when 'true' -> + let <_7> = + apply 'lc$^0'/1 + (_5) + in ( [M|_7] + -| ['compiler_generated'] ) + ( <'false'> when 'true' -> + apply 'lc$^0'/1 + (_5) + -| ['compiler_generated'] ) + ( <_8> when 'true' -> + primop 'match_fail' + ({'case_clause',_8}) + -| ['compiler_generated'] ) + end + -| ['list_comprehension'] ) + <[]> when 'true' -> + [] + ( <_16> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_16}) + -| [{'function_name',{'lc$^0',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 40 + apply 'lc$^0'/1 + (_2) + in let <_11> = + case _9 of + %% Line 41 + <[]> when 'true' -> + %% Line 42 + ['write'|_2] + %% Line 43 + <_15> when 'true' -> + _2 + end + in %% Line 46 + case call 'file':'open' + (File, _11) of + %% Line 47 + <{'ok',Fd}> when 'true' -> + %% Line 48 + {'ok',{Fd,File,Type}} + %% Line 49 + when 'true' -> + %% Line 50 + What + end + ( <_14> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_14}) + -| [{'function_name',{'init',1}}] ) + -| ['compiler_generated'] ) + end +'handle_event'/2 = + %% Line 53 + fun (_0,_1) -> + case <_0,_1> of + <{_X_Type,GL,_X_Msg},State> + when try + let <_3> = + call 'erlang':'node' + (GL) + in let <_2> = + call 'erlang':'node' + () + in call 'erlang':'/=' + (_3, _2) + of -> + Try + catch -> + 'false' -> + %% Line 54 + {'ok',State} + %% Line 55 + when 'true' -> + let <_4> = + apply %% Line 56 + 'tag_event'/1 + (%% Line 56 + Event) + in do %% Line 56 + ( call ( 'sasl_report' + -| ['result_not_wanted'] ):( 'write_report' + -| ['result_not_wanted'] ) + (Fd, Type, _4) + -| ['result_not_wanted'] ) + %% Line 57 + {'ok',_@r0} + %% Line 58 + <_8,State> when 'true' -> + %% Line 59 + {'ok',State} + end +'handle_info'/2 = + %% Line 61 + fun (_0,_1) -> + case <_0,_1> of + <{'EXIT',Fd,_X_Reason},{_4,_X_File,_X_Type}> + when call 'erlang':'=:=' + (_4, + Fd) -> + %% Line 62 + 'remove_handler' + %% Line 63 + <_5,State> when 'true' -> + %% Line 64 + {'ok',State} + end +'handle_call'/2 = + %% Line 66 + fun (_0,_1) -> + {'error','bad_query'} +'terminate'/2 = + %% Line 68 + fun (_0,_1) -> + case <_0,_1> of + <_5,{Fd,_X_File,_X_Type}> when 'true' -> + do %% Line 69 + ( call ( 'file' + -| ['result_not_wanted'] ):( 'close' + -| ['result_not_wanted'] ) + (Fd) + -| ['result_not_wanted'] ) + %% Line 70 + [] + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'terminate',2}}] ) + -| ['compiler_generated'] ) + end +'tag_event'/1 = + %% Line 72 + fun (_0) -> + let <_1> = + call %% Line 73 + 'calendar':%% Line 73 + 'local_time' + () + in %% Line 73 + {_1,_0} +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('sasl_report_file_h') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('sasl_report_file_h', _0) +end \ No newline at end of file diff --git a/test/data/sasl/sasl_report_tty_h.core b/test/data/sasl/sasl_report_tty_h.core new file mode 100644 index 0000000..123fb96 --- /dev/null +++ b/test/data/sasl/sasl_report_tty_h.core @@ -0,0 +1,91 @@ +module 'sasl_report_tty_h' ['handle_call'/2, + 'handle_event'/2, + 'handle_info'/2, + 'init'/1, + 'module_info'/0, + 'module_info'/1, + 'terminate'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[97|[115|[108|[95|[114|[101|[112|[111|[114|[116|[95|[116|[116|[121|[95|[104|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]],1}]] +'init'/1 = + %% Line 32 + fun (_0) -> + %% Line 34 + {'ok',_0} +'handle_event'/2 = + %% Line 36 + fun (_0,_1) -> + case <_0,_1> of + <{Type,GL,_X_Msg},_8> + when let <_9> = + call 'erlang':'=:=' + (_8, Type) + in let <_10> = + try + let <_3> = + call 'erlang':'node' + (GL) + in let <_2> = + call 'erlang':'node' + () + in call 'erlang':'/=' + (_3, _2) + of -> + Try + catch -> + 'false' + in call 'erlang':'and' + (_9, _10) -> + %% Line 37 + {'ok',Type} + %% Line 38 + when 'true' -> + let <_4> = + apply %% Line 39 + 'tag_event'/1 + (%% Line 39 + Event) + in do %% Line 39 + ( call ( 'sasl_report' + -| ['result_not_wanted'] ):( 'write_report' + -| ['result_not_wanted'] ) + (( 'standard_io' + -| ['result_not_wanted'] ), Type, _4) + -| ['result_not_wanted'] ) + %% Line 40 + {'ok',Type} + end +'handle_info'/2 = + %% Line 42 + fun (_0,_1) -> + {'ok',_1} +'handle_call'/2 = + %% Line 44 + fun (_0,_1) -> + {'error','bad_query'} +'terminate'/2 = + %% Line 46 + fun (_0,_1) -> + %% Line 47 + [] +'tag_event'/1 = + %% Line 49 + fun (_0) -> + let <_1> = + call %% Line 50 + 'calendar':%% Line 50 + 'local_time' + () + in %% Line 50 + {_1,_0} +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('sasl_report_tty_h') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('sasl_report_tty_h', _0) +end \ No newline at end of file diff --git a/test/data/sasl/systools.core b/test/data/sasl/systools.core new file mode 100644 index 0000000..e6f6578 --- /dev/null +++ b/test/data/sasl/systools.core @@ -0,0 +1,195 @@ +module 'systools' ['compile_rel'/3, + 'make_relup'/3, + 'make_relup'/4, + 'make_script'/1, + 'make_script'/2, + 'make_tar'/1, + 'make_tar'/2, + 'module_info'/0, + 'module_info'/1, + 'script2boot'/1, + 'script2boot'/3] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[46|[101|[114|[108]]]]]]]]]]]]]]]],1}], + %% Line 1 + 'file' = + %% Line 1 + [{[47|[85|[115|[101|[114|[115|[47|[102|[101|[110|[103|[108|[101|[101|[47|[72|[97|[109|[108|[101|[114|[47|[111|[116|[112|[45|[79|[84|[80|[45|[50|[51|[46|[48|[45|[114|[99|[49|[47|[108|[105|[98|[47|[115|[97|[115|[108|[47|[46|[46|[47|[115|[116|[100|[108|[105|[98|[47|[105|[110|[99|[108|[117|[100|[101|[47|[101|[114|[108|[95|[99|[111|[109|[112|[105|[108|[101|[46|[104|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 23 + 'record' = + %% Line 23 + [{'options',[{'typed_record_field',{'record_field',24,{'atom',24,'includes'},{'nil',24}},{'type',24,'list',[{'remote_type',24,[{'atom',24,'file'}|[{'atom',24,'filename'}|[[]]]]}]}}|[{'typed_record_field',{'record_field',26,{'atom',26,'outdir'},{'string',26,[46]}},{'remote_type',26,[{'atom',26,'file'}|[{'atom',26,'filename'}|[[]]]]}}|[{'typed_record_field',{'record_field',28,{'atom',28,'output_type'},{'atom',28,'undefined'}},{'type',28,'atom',[]}}|[{'typed_record_field',{'record_field',29,{'atom',29,'defines'},{'nil',29}},{'type',29,'list',[{'type',29,'union',[{'type',29,'atom',[]}|[{'type',29,'tuple',[{'type',29,'atom',[]}|[{'var',29,'_'}]]}]]}]}}|[{'typed_record_field',{'record_field',33,{'atom',33,'warning'},{'integer',33,1}},{'type',33,'non_neg_integer',[]}}|[{'typed_record_field',{'record_field',36,{'atom',36,'verbose'},{'atom',36,'false'}},{'type',36,'boolean',[]}}|[{'record_field',37,{'atom',37,'optimize'},{'integer',37,999}}|[{'typed_record_field',{'record_field',38,{'atom',38,'specific'},{'nil',38}},{'type',38,'list',[{'var',38,'_'}]}}|[{'typed_record_field',{'record_field',39,{'atom',39,'outfile'},{'string',39,[]}},{'remote_type',39,[{'atom',39,'file'}|[{'atom',39,'filename'}|[[]]]]}}|[{'typed_record_field',{'record_field',41,{'atom',41,'cwd'}},{'remote_type',41,[{'atom',41,'file'}|[{'atom',41,'filename'}|[[]]]]}}]]]]]]]]]]}], + %% Line 41 + 'file' = + %% Line 41 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[46|[101|[114|[108]]]]]]]]]]]]]]]],41}]] +'make_script'/1 = + %% Line 50 + fun (_0) -> + case _0 of + <[RelName|Opts]> + when call 'erlang':'is_atom' + (RelName) -> + %% Line 51 + apply 'make_script'/2 + ([RelName|[]], Opts) + %% Line 52 + when 'true' -> + apply 'make_script'/2 + (RelName, []) + end +'make_script'/2 = + %% Line 54 + fun (_0,_1) -> + %% Line 55 + call 'systools_make':'make_script' + (_0, _1) +'make_tar'/1 = + %% Line 65 + fun (_0) -> + apply 'make_tar'/2 + (_0, []) +'make_tar'/2 = + %% Line 67 + fun (_0,_1) -> + %% Line 68 + call 'systools_make':'make_tar' + (_0, _1) +'script2boot'/1 = + %% Line 73 + fun (_0) -> + let <_2> = + call %% Line 74 + 'erlang':%% Line 74 + '++' + (_0, %% Line 74 + [46|[115|[99|[114|[105|[112|[116]]]]]]]) + in let <_1> = + call %% Line 74 + 'erlang':%% Line 74 + '++' + (_0, %% Line 74 + [46|[98|[111|[111|[116]]]]]) + in %% Line 74 + case call 'systools_lib':'file_term2binary' + (_2, _1) of + %% Line 75 + <{'error',Error}> when 'true' -> + let <_3> = + call %% Line 76 + 'systools_make':%% Line 76 + 'format_error' + (%% Line 76 + Error) + in do %% Line 76 + call 'io':'format' + ([126|[116|[115]]], [_3|[]]) + %% Line 77 + 'error' + %% Line 78 + <_6> when 'true' -> + %% Line 79 + 'ok' + end +'script2boot'/3 = + %% Line 82 + fun (_0,_1,_2) -> + let = + call %% Line 83 + 'erlang':%% Line 83 + '++' + (_0, %% Line 83 + [46|[115|[99|[114|[105|[112|[116]]]]]]]) + in let = + call %% Line 84 + 'erlang':%% Line 84 + '++' + (_1, %% Line 84 + [46|[98|[111|[111|[116]]]]]) + in %% Line 85 + case call 'systools_lib':'file_term2binary' + (Input, Output) of + %% Line 86 + <{'error',Error}> when 'true' -> + let <_5> = + call %% Line 87 + 'systools_make':%% Line 87 + 'format_error' + (%% Line 87 + Error) + in do %% Line 87 + call 'io':'format' + ([126|[116|[115]]], [_5|[]]) + %% Line 88 + 'error' + %% Line 89 + <_10> when 'true' -> + %% Line 90 + 'ok' + end +'make_relup'/3 = + %% Line 98 + fun (_0,_1,_2) -> + %% Line 99 + call 'systools_relup':'mk_relup' + (_0, _1, _2, []) +'make_relup'/4 = + %% Line 100 + fun (_0,_1,_2,_3) -> + %% Line 101 + call 'systools_relup':'mk_relup' + (_0, _1, _2, _3) +'compile_rel'/3 = + %% Line 106 + fun (_0,_1,_2) -> + let <_3> = + apply %% Line 107 + 'translate_options'/1 + (_2) + in %% Line 107 + call 'systools_make':'make_script' + (_0, _1, _3) +'translate_options'/1 = + %% Line 109 + fun (_0) -> + %% Line 110 + ( case _0 of + ( <( {'options',_rec0,_6,_7,_8,_9,_10,_11,_12,_13,_14} + -| ['compiler_generated'] )> when 'true' -> + ( case _0 of + ( <( {'options',_16,_17,_18,_19,_20,_21,_22,_rec1,_23,_24} + -| ['compiler_generated'] )> when 'true' -> + [{'path',_rec0}|_rec1] + -| ['compiler_generated'] ) + ( <_25> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','options'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + ( <_15> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {'badrecord','options'} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('systools') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('systools', _0) +end \ No newline at end of file diff --git a/test/data/sasl/systools_lib.core b/test/data/sasl/systools_lib.core new file mode 100644 index 0000000..82b6e60 --- /dev/null +++ b/test/data/sasl/systools_lib.core @@ -0,0 +1,565 @@ +module 'systools_lib' ['file_term2binary'/2, + 'get_dirs'/1, + 'get_path'/1, + 'module_info'/0, + 'module_info'/1, + 'read_term'/1, + 'read_term_from_stream'/2, + 'werror'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[95|[108|[105|[98|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]],1}], + %% Line 1 + 'file' = + %% Line 1 + [{[47|[117|[115|[114|[47|[108|[111|[99|[97|[108|[47|[67|[101|[108|[108|[97|[114|[47|[101|[114|[108|[97|[110|[103|[47|[50|[50|[46|[50|[47|[108|[105|[98|[47|[101|[114|[108|[97|[110|[103|[47|[108|[105|[98|[47|[107|[101|[114|[110|[101|[108|[45|[54|[46|[53|[46|[49|[47|[105|[110|[99|[108|[117|[100|[101|[47|[102|[105|[108|[101|[46|[104|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 25 + 'record' = + %% Line 25 + [{'file_info',[{'typed_record_field',{'record_field',26,{'atom',26,'size'}},{'type',26,'union',[{'type',26,'non_neg_integer',[]}|[{'atom',26,'undefined'}]]}}|[{'typed_record_field',{'record_field',27,{'atom',27,'type'}},{'type',27,'union',[{'atom',27,'device'}|[{'atom',27,'directory'}|[{'atom',27,'other'}|[{'atom',27,'regular'}|[{'atom',27,'symlink'}|[{'atom',28,'undefined'}]]]]]]}}|[{'typed_record_field',{'record_field',29,{'atom',29,'access'}},{'type',29,'union',[{'atom',29,'read'}|[{'atom',29,'write'}|[{'atom',29,'read_write'}|[{'atom',29,'none'}|[{'atom',29,'undefined'}]]]]]}}|[{'typed_record_field',{'record_field',30,{'atom',30,'atime'}},{'type',30,'union',[{'remote_type',30,[{'atom',30,'file'}|[{'atom',30,'date_time'}|[[]]]]}|[{'type',30,'non_neg_integer',[]}|[{'atom',30,'undefined'}]]]}}|[{'typed_record_field',{'record_field',34,{'atom',34,'mtime'}},{'type',34,'union',[{'remote_type',34,[{'atom',34,'file'}|[{'atom',34,'date_time'}|[[]]]]}|[{'type',34,'non_neg_integer',[]}|[{'atom',34,'undefined'}]]]}}|[{'typed_record_field',{'record_field',36,{'atom',36,'ctime'}},{'type',36,'union',[{'remote_type',36,[{'atom',36,'file'}|[{'atom',36,'date_time'}|[[]]]]}|[{'type',36,'non_neg_integer',[]}|[{'atom',36,'undefined'}]]]}}|[{'typed_record_field',{'record_field',42,{'atom',42,'mode'}},{'type',42,'union',[{'type',42,'non_neg_integer',[]}|[{'atom',42,'undefined'}]]}}|[{'typed_record_field',{'record_field',46,{'atom',46,'links'}},{'type',46,'union',[{'type',46,'non_neg_integer',[]}|[{'atom',46,'undefined'}]]}}|[{'typed_record_field',{'record_field',49,{'atom',49,'major_device'}},{'type',49,'union',[{'type',49,'non_neg_integer',[]}|[{'atom',49,'undefined'}]]}}|[{'typed_record_field',{'record_field',55,{'atom',55,'minor_device'}},{'type',55,'union',[{'type',55,'non_neg_integer',[]}|[{'atom',55,'undefined'}]]}}|[{'typed_record_field',{'record_field',57,{'atom',57,'inode'}},{'type',57,'union',[{'type',57,'non_neg_integer',[]}|[{'atom',57,'undefined'}]]}}|[{'typed_record_field',{'record_field',58,{'atom',58,'uid'}},{'type',58,'union',[{'type',58,'non_neg_integer',[]}|[{'atom',58,'undefined'}]]}}|[{'typed_record_field',{'record_field',59,{'atom',59,'gid'}},{'type',59,'union',[{'type',59,'non_neg_integer',[]}|[{'atom',59,'undefined'}]]}}]]]]]]]]]]]]]}], + %% Line 62 + 'record' = + %% Line 62 + [{'file_descriptor',[{'typed_record_field',{'record_field',63,{'atom',63,'module'}},{'type',63,'module',[]}}|[{'typed_record_field',{'record_field',64,{'atom',64,'data'}},{'type',64,'term',[]}}]]}], + %% Line 31 + 'file' = + %% Line 31 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[95|[108|[105|[98|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]],31}]] +'file_term2binary'/2 = + %% Line 35 + fun (_0,_1) -> + %% Line 36 + case apply 'read_term'/1 + (_0) of + %% Line 37 + <{'ok',Term}> when 'true' -> + let <_2> = + call %% Line 38 + 'erlang':%% Line 38 + 'term_to_binary' + (%% Line 38 + Term) + in %% Line 38 + case call 'file':'write_file' + (_1, _2) of + %% Line 39 + <'ok'> when 'true' -> + 'ok' + %% Line 40 + <{'error',Error}> when 'true' -> + {'error',{'open',_1,Error}} + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end + %% Line 42 + when 'true' -> + %% Line 43 + Other + end +'read_term'/1 = + %% Line 53 + fun (_0) -> + %% Line 54 + case call 'file':'open' + (_0, ['read']) of + %% Line 55 + <{'ok',Stream}> when 'true' -> + let = + apply %% Line 56 + 'read_term_from_stream'/2 + (%% Line 56 + Stream, _0) + in %% Line 57 + case call 'file':'close' + (Stream) of + %% Line 58 + <'ok'> when 'true' -> + Res + %% Line 59 + <{'error',Error}> when 'true' -> + {'error',{'close',_0,Error}} + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end + %% Line 61 + <{'error',Error}> when 'true' -> + %% Line 62 + {'error',{'open',_0,Error}} + ( <_3> when 'true' -> + primop 'match_fail' + ({'case_clause',_3}) + -| ['compiler_generated'] ) + end +'read_term_from_stream'/2 = + %% Line 65 + fun (_0,_1) -> + let = + call %% Line 66 + 'epp':%% Line 66 + 'set_encoding' + (_0) + in %% Line 68 + case call 'io':'request' + (_0, {'get_until',Encoding,'','erl_scan','tokens',[1]}) of + %% Line 69 + <{'ok',Toks,_X_EndLine}> when 'true' -> + %% Line 70 + case call 'erl_parse':'parse_term' + (Toks) of + %% Line 71 + <_@r0 = {'ok',Term}> when 'true' -> + %% Line 72 + _@r0 + %% Line 73 + <{'error',Error}> when 'true' -> + %% Line 74 + {'error',{'parse',_1,Error}} + ( <_4> when 'true' -> + primop 'match_fail' + ({'case_clause',_4}) + -| ['compiler_generated'] ) + end + %% Line 76 + <{'error',_X_E,_X_EndLine}> when 'true' -> + %% Line 77 + {'error',{'read',_1}} + %% Line 78 + <{'eof',_X_EndLine}> when 'true' -> + %% Line 79 + {'error',{'read',_1}} + ( <_5> when 'true' -> + primop 'match_fail' + ({'case_clause',_5}) + -| ['compiler_generated'] ) + end +'get_dirs'/1 = + %% Line 95 + fun (_0) -> + case _0 of + + when call 'erlang':'is_list' + (_0) -> + let = + call %% Line 96 + 'filename':%% Line 96 + 'split' + (%% Line 96 + RegPath) + in let = + apply %% Line 97 + 'expand_names'/1 + (%% Line 97 + Names) + in catch + %% Line 98 + apply 'get_dirs'/3 + (ExpNames, [], 'true') + %% Line 99 + <_4> when 'true' -> + %% Line 100 + {'error','badarg'} + end +'get_path'/1 = + %% Line 102 + fun (_0) -> + case _0 of + + when call 'erlang':'is_list' + (_0) -> + let = + fun (_2) -> + %% Line 104 + case apply 'get_dirs'/1 + (_2) of + %% Line 105 + <{'ok',Dirs}> when 'true' -> + {'true',Dirs} + %% Line 106 + <_7> when 'true' -> + 'false' + end + in let <_5> = + call %% Line 109 + 'lists':%% Line 109 + 'zf' + (%% Line 109 + F, %% Line 109 + RegPath) + in %% Line 109 + apply 'flat'/2 + (_5, []) + %% Line 110 + <_8> when 'true' -> + %% Line 111 + [] + end +'expand_names'/1 = + %% Line 122 + fun (_0) -> + let <_5> = + fun (_3) -> + %% Line 123 + case _3 of + <[42]> when 'true' -> + %% Line 124 + {'true',[91|[94|[47|[93|[43]]]]]} + %% Line 125 + when 'true' -> + %% Line 126 + case call 'lists':'member' + (42, N) of + %% Line 127 + <'true'> when 'true' -> + let <_1> = + apply 'expand'/2 + (N, []) + in {'true',_1} + %% Line 128 + <_7> when 'true' -> + {'false',N} + end + end + in %% Line 123 + call 'lists':'map' + (_5, _0) +'expand'/2 = + %% Line 132 + fun (_0,_1) -> + case <_0,_1> of + <[42|T],Ack> when 'true' -> + let <_2> = + call %% Line 133 + 'erlang':%% Line 133 + '++' + (%% Line 133 + [42|[93|[47|[94|[91]]]]], %% Line 133 + Ack) + in %% Line 133 + apply 'expand'/2 + (T, _2) + %% Line 134 + <[H|T],Ack> when 'true' -> + %% Line 135 + apply 'expand'/2 + (T, [H|Ack]) + %% Line 136 + <[],Ack> when 'true' -> + %% Line 137 + call 'lists':'reverse' + (Ack) + ( <_4,_3> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_4,_3}) + -| [{'function_name',{'expand',2}}] ) + -| ['compiler_generated'] ) + end +'get_dirs'/3 = + %% Line 147 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <[{'false',Name}|T],F,Root> when 'true' -> + let <_3> = + apply %% Line 148 + 'add_dir'/3 + (%% Line 148 + Name, %% Line 148 + F, %% Line 148 + Root) + in %% Line 148 + apply 'get_dirs'/3 + (T, _3, 'false') + %% Line 149 + <[{'true',RegName}|T],F,Root> when 'true' -> + let <_4> = + apply %% Line 150 + 'add_dirs'/3 + (%% Line 150 + RegName, %% Line 150 + F, %% Line 150 + Root) + in %% Line 150 + apply 'get_dirs'/3 + (T, _4, 'false') + %% Line 151 + <[],F,_8> when 'true' -> + %% Line 152 + {'ok',F} + ( <_7,_6,_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_7,_6,_5}) + -| [{'function_name',{'get_dirs',3}}] ) + -| ['compiler_generated'] ) + end +'add_dir'/3 = + %% Line 154 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 155 + case apply 'dir_p'/1 + (Name) of + %% Line 156 + <'true'> when 'true' -> + [Name|[]] + %% Line 157 + <_12> when 'true' -> + [] + end + %% Line 159 + when 'true' -> + let <_8> = + fun (_6) -> + let = + call %% Line 161 + 'filename':%% Line 161 + 'join' + (%% Line 160 + _6, %% Line 161 + Name) + in %% Line 162 + case apply 'dir_p'/1 + (D) of + %% Line 163 + <'true'> when 'true' -> + {'true',D} + %% Line 164 + <_13> when 'true' -> + 'false' + end + in %% Line 160 + call 'lists':'zf' + (_8, %% Line 166 + Dirs) + end +'add_dirs'/3 = + %% Line 168 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + when 'true' -> + %% Line 169 + case apply 'regexp_match'/3 + (RegName, [46], 'true') of + %% Line 170 + <{'true',AddDirs}> when 'true' -> + AddDirs + %% Line 171 + <_11> when 'true' -> + [] + end + %% Line 173 + when 'true' -> + let = + fun (_4) -> + %% Line 175 + apply 'regexp_match'/3 + (RegName, _4, Root) + in let <_7> = + call %% Line 177 + 'lists':%% Line 177 + 'zf' + (%% Line 177 + Fun, %% Line 177 + Dirs) + in %% Line 177 + apply 'flat'/2 + (_7, []) + end +'regexp_match'/3 = + %% Line 186 + fun (_0,_1,_2) -> + %% Line 187 + case call 'file':'list_dir' + (_1) of + %% Line 188 + <{'ok',Files}> + when try + let <_3> = + call 'erlang':'length' + (Files) + in call 'erlang':'>' + (_3, 0) + of -> + Try + catch -> + 'false' -> + %% Line 189 + case call 're':'compile' + (_0, ['unicode']) of + %% Line 190 + <{'ok',MP}> when 'true' -> + let = + fun (_7) -> + %% Line 192 + case call 're':'run' + (_7, MP, [{'capture','first','list'}]) of + %% Line 193 + <{'match',[_16|[]]}> + when call 'erlang':'=:=' + (_16, + _7) -> + let = + apply %% Line 194 + 'join'/3 + (_1, _7, _2) + in %% Line 195 + case apply 'dir_p'/1 + (DirF) of + %% Line 196 + <'true'> when 'true' -> + %% Line 197 + {'true',DirF} + %% Line 198 + <_17> when 'true' -> + %% Line 199 + 'false' + end + %% Line 201 + <_18> when 'true' -> + %% Line 202 + 'false' + end + in let <_10> = + call %% Line 205 + 'lists':%% Line 205 + 'zf' + (%% Line 205 + FR, %% Line 205 + Files) + in %% Line 205 + {'true',_10} + %% Line 206 + <_19> when 'true' -> + %% Line 207 + 'false' + end + %% Line 209 + <_20> when 'true' -> + %% Line 210 + 'false' + end +'join'/3 = + %% Line 214 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <_6,F,'true'> when 'true' -> + F + %% Line 215 + when 'true' -> + call 'filename':'join' + (Dir, F) + end +'dir_p'/1 = + %% Line 217 + fun (_0) -> + %% Line 218 + case call 'file':'read_file_info' + (_0) of + %% Line 219 + <{'ok',Info = {'file_info',_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21}}> + when ( try + let <_5> = + call 'erlang':'element' + (3, Info) + in call 'erlang':'=:=' + (_5, 'directory') + of -> + Try + catch -> + 'false' + -| ['compiler_generated'] ) -> + 'true' + %% Line 220 + <_22> when 'true' -> + 'false' + end +'flat'/2 = + %% Line 224 + fun (_0,_1) -> + case <_0,_1> of + <[H|T],Ack> + when try + let <_2> = + call 'erlang':'hd' + (H) + in call 'erlang':'is_list' + (_2) + of -> + Try + catch -> + 'false' -> + let <_3> = + call %% Line 225 + 'lists':%% Line 225 + 'reverse' + (%% Line 225 + H) + in let <_4> = + call %% Line 225 + 'erlang':%% Line 225 + '++' + (_3, %% Line 225 + Ack) + in %% Line 225 + apply 'flat'/2 + (T, _4) + %% Line 226 + <[[]|T],Ack> when 'true' -> + %% Line 227 + apply 'flat'/2 + (T, Ack) + %% Line 228 + <[H|T],Ack> when 'true' -> + %% Line 229 + apply 'flat'/2 + (T, [H|Ack]) + %% Line 230 + <[],Ack> when 'true' -> + %% Line 231 + call 'lists':'reverse' + (Ack) + ( <_6,_5> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_6,_5}) + -| [{'function_name',{'flat',2}}] ) + -| ['compiler_generated'] ) + end +'werror'/2 = + %% Line 233 + fun (_0,_1) -> + %% Line 234 + ( case call 'lists':'member' + ('warnings_as_errors', _0) of + ( <( 'true' + -| ['compiler_generated'] )> when 'true' -> + call 'erlang':'=/=' + (_1, []) + -| ['compiler_generated'] ) + ( <( 'false' + -| ['compiler_generated'] )> when 'true' -> + 'false' + -| ['compiler_generated'] ) + ( <_2> when 'true' -> + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {( 'badarg' + -| ['compiler_generated'] ),_2} + -| ['compiler_generated'] )) + -| ['compiler_generated'] ) + -| ['compiler_generated'] ) + end + -| ['compiler_generated'] ) +'module_info'/0 = + fun () -> + call 'erlang':'get_module_info' + ('systools_lib') +'module_info'/1 = + fun (_0) -> + call 'erlang':'get_module_info' + ('systools_lib', _0) +end \ No newline at end of file diff --git a/test/data/sasl/systools_make.core b/test/data/sasl/systools_make.core new file mode 100644 index 0000000..a5c43b3 --- /dev/null +++ b/test/data/sasl/systools_make.core @@ -0,0 +1,8077 @@ +module 'systools_make' ['format_error'/1, + 'format_warning'/1, + 'get_release'/2, + 'get_release'/3, + 'get_release'/4, + 'make_hybrid_boot'/4, + 'make_script'/1, + 'make_script'/2, + 'make_script'/3, + 'make_tar'/1, + 'make_tar'/2, + 'module_info'/0, + 'module_info'/1, + 'pack_app'/1, + 'preloaded'/0, + 'read_application'/4, + 'read_release'/2] + attributes [%% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[95|[109|[97|[107|[101|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 1 + 'file' = + %% Line 1 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[46|[104|[114|[108]]]]]]]]]]]]]]]],1}], + %% Line 27 + 'record' = + %% Line 27 + [{'release',[{'record_field',29,{'atom',29,'name'}}|[{'record_field',30,{'atom',30,'vsn'}}|[{'record_field',31,{'atom',31,'erts_vsn'}}|[{'record_field',32,{'atom',32,'applications'}}|[{'record_field',35,{'atom',35,'incl_apps'}}]]]]]}], + %% Line 40 + 'record' = + %% Line 40 + [{'application',[{'record_field',41,{'atom',41,'name'}}|[{'record_field',42,{'atom',42,'type'},{'atom',42,'permanent'}}|[{'record_field',43,{'atom',43,'vsn'},{'string',43,[]}}|[{'record_field',44,{'atom',44,'id'},{'string',44,[]}}|[{'record_field',45,{'atom',45,'description'},{'string',45,[]}}|[{'record_field',46,{'atom',46,'modules'},{'nil',46}}|[{'record_field',49,{'atom',49,'uses'},{'nil',49}}|[{'record_field',51,{'atom',51,'includes'},{'nil',51}}|[{'record_field',53,{'atom',53,'regs'},{'nil',53}}|[{'record_field',56,{'atom',56,'env'},{'nil',56}}|[{'record_field',58,{'atom',58,'maxT'},{'atom',58,'infinity'}}|[{'record_field',60,{'atom',60,'maxP'},{'atom',60,'infinity'}}|[{'record_field',62,{'atom',62,'mod'},{'nil',62}}|[{'record_field',64,{'atom',64,'start_phases'}}|[{'record_field',67,{'atom',67,'dir'},{'string',67,[]}}]]]]]]]]]]]]]]]}], + %% Line 42 + 'file' = + %% Line 42 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[95|[109|[97|[107|[101|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]],42}], + %% Line 1 + 'file' = + %% Line 1 + [{[47|[117|[115|[114|[47|[108|[111|[99|[97|[108|[47|[67|[101|[108|[108|[97|[114|[47|[101|[114|[108|[97|[110|[103|[47|[50|[50|[46|[50|[47|[108|[105|[98|[47|[101|[114|[108|[97|[110|[103|[47|[108|[105|[98|[47|[107|[101|[114|[110|[101|[108|[45|[54|[46|[53|[46|[49|[47|[105|[110|[99|[108|[117|[100|[101|[47|[102|[105|[108|[101|[46|[104|[114|[108]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],1}], + %% Line 25 + 'record' = + %% Line 25 + [{'file_info',[{'typed_record_field',{'record_field',26,{'atom',26,'size'}},{'type',26,'union',[{'type',26,'non_neg_integer',[]}|[{'atom',26,'undefined'}]]}}|[{'typed_record_field',{'record_field',27,{'atom',27,'type'}},{'type',27,'union',[{'atom',27,'device'}|[{'atom',27,'directory'}|[{'atom',27,'other'}|[{'atom',27,'regular'}|[{'atom',27,'symlink'}|[{'atom',28,'undefined'}]]]]]]}}|[{'typed_record_field',{'record_field',29,{'atom',29,'access'}},{'type',29,'union',[{'atom',29,'read'}|[{'atom',29,'write'}|[{'atom',29,'read_write'}|[{'atom',29,'none'}|[{'atom',29,'undefined'}]]]]]}}|[{'typed_record_field',{'record_field',30,{'atom',30,'atime'}},{'type',30,'union',[{'remote_type',30,[{'atom',30,'file'}|[{'atom',30,'date_time'}|[[]]]]}|[{'type',30,'non_neg_integer',[]}|[{'atom',30,'undefined'}]]]}}|[{'typed_record_field',{'record_field',34,{'atom',34,'mtime'}},{'type',34,'union',[{'remote_type',34,[{'atom',34,'file'}|[{'atom',34,'date_time'}|[[]]]]}|[{'type',34,'non_neg_integer',[]}|[{'atom',34,'undefined'}]]]}}|[{'typed_record_field',{'record_field',36,{'atom',36,'ctime'}},{'type',36,'union',[{'remote_type',36,[{'atom',36,'file'}|[{'atom',36,'date_time'}|[[]]]]}|[{'type',36,'non_neg_integer',[]}|[{'atom',36,'undefined'}]]]}}|[{'typed_record_field',{'record_field',42,{'atom',42,'mode'}},{'type',42,'union',[{'type',42,'non_neg_integer',[]}|[{'atom',42,'undefined'}]]}}|[{'typed_record_field',{'record_field',46,{'atom',46,'links'}},{'type',46,'union',[{'type',46,'non_neg_integer',[]}|[{'atom',46,'undefined'}]]}}|[{'typed_record_field',{'record_field',49,{'atom',49,'major_device'}},{'type',49,'union',[{'type',49,'non_neg_integer',[]}|[{'atom',49,'undefined'}]]}}|[{'typed_record_field',{'record_field',55,{'atom',55,'minor_device'}},{'type',55,'union',[{'type',55,'non_neg_integer',[]}|[{'atom',55,'undefined'}]]}}|[{'typed_record_field',{'record_field',57,{'atom',57,'inode'}},{'type',57,'union',[{'type',57,'non_neg_integer',[]}|[{'atom',57,'undefined'}]]}}|[{'typed_record_field',{'record_field',58,{'atom',58,'uid'}},{'type',58,'union',[{'type',58,'non_neg_integer',[]}|[{'atom',58,'undefined'}]]}}|[{'typed_record_field',{'record_field',59,{'atom',59,'gid'}},{'type',59,'union',[{'type',59,'non_neg_integer',[]}|[{'atom',59,'undefined'}]]}}]]]]]]]]]]]]]}], + %% Line 62 + 'record' = + %% Line 62 + [{'file_descriptor',[{'typed_record_field',{'record_field',63,{'atom',63,'module'}},{'type',63,'module',[]}}|[{'typed_record_field',{'record_field',64,{'atom',64,'data'}},{'type',64,'term',[]}}]]}], + %% Line 44 + 'file' = + %% Line 44 + [{[115|[114|[99|[47|[115|[121|[115|[116|[111|[111|[108|[115|[95|[109|[97|[107|[101|[46|[101|[114|[108]]]]]]]]]]]]]]]]]]]]],44}], + %% Line 47 + 'compile' = + %% Line 47 + [{'inline',[{'badarg',2}]}]] +'make_script'/1 = + %% Line 75 + fun (_0) -> + case _0 of + + when call 'erlang':'is_list' + (_0) -> + %% Line 76 + apply 'make_script'/2 + (RelName, []) + %% Line 77 + when 'true' -> + let <_1> = + [%% Line 78 + RelName|%% Line 78 + ( [] + -| ['compiler_generated'] )] + in %% Line 139 + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {( 'badarg' + -| ['compiler_generated'] ),RelName} + -| ['compiler_generated'] ), _1) + -| ['compiler_generated'] ) + end +'make_script'/2 = + %% Line 80 + fun (_0,_1) -> + case <_0,_1> of + + when let <_2> = + call 'erlang':'is_list' + (RelName) + in let <_3> = + call 'erlang':'is_list' + (Flags) + in call 'erlang':'and' + (_2, _3) -> + %% Line 81 + case apply 'get_outdir'/1 + (Flags) of + %% Line 82 + <[]> when 'true' -> + %% Line 83 + apply 'make_script'/3 + (RelName, RelName, Flags) + %% Line 84 + when 'true' -> + let <_4> = + call %% Line 89 + 'filename':%% Line 89 + 'basename' + (%% Line 89 + RelName) + in let = + call %% Line 89 + 'filename':%% Line 89 + 'join' + (%% Line 89 + OutDir, _4) + in %% Line 90 + apply 'make_script'/3 + (RelName, Output, Flags) + end + ( <_8,_7> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_8,_7}) + -| [{'function_name',{'make_script',2}}] ) + -| ['compiler_generated'] ) + end +'make_script'/3 = + %% Line 93 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + + when try + let <_3> = + call 'erlang':'is_list' + (RelName) + in let <_4> = + call %% Line 94 + 'erlang':%% Line 94 + 'is_list' + (%% Line 94 + Output) + in let <_5> = + call %% Line 95 + 'erlang':%% Line 95 + 'is_list' + (%% Line 95 + Flags) + in let <_6> = + call 'erlang':'and' + (_4, _5) + in call 'erlang':'and' + (_3, _6) + of -> + Try + catch -> + 'false' -> + %% Line 96 + case apply 'check_args_script'/1 + (Flags) of + %% Line 97 + <[]> when 'true' -> + let = + apply %% Line 98 + 'get_path'/1 + (%% Line 98 + Flags) + in let = + apply %% Line 99 + 'mk_path'/1 + (%% Line 99 + Path0) + in let <_9> = + call %% Line 100 + 'code':%% Line 100 + 'get_path' + () + in let <_10> = + call %% Line 100 + 'erlang':%% Line 100 + '++' + (%% Line 100 + Path1, _9) + in let = + apply %% Line 100 + 'make_set'/1 + (_10) + in let <_13> = + call %% Line 101 + 'lists':%% Line 101 + 'member' + (%% Line 101 + 'src_tests', %% Line 101 + Flags) + in let <_12> = + apply %% Line 101 + 'xref_p'/1 + (%% Line 101 + Flags) + in let = {_13,_12} + in let <_15> = + apply %% Line 102 + 'machine'/1 + (%% Line 102 + Flags) + in %% Line 102 + case apply 'get_release'/4 + (RelName, Path, ModTestP, _15) of + %% Line 103 + <{'ok',Release,Appls,Warnings0}> when 'true' -> + let = + apply %% Line 104 + 'wsasl'/2 + (%% Line 104 + Flags, %% Line 104 + Warnings0) + in %% Line 105 + case call 'systools_lib':'werror' + (Flags, Warnings) of + %% Line 106 + <'true'> when 'true' -> + let <_21> = + letrec + 'lc$^0'/1 = + %% Line 107 + fun (_19) -> + case _19 of + <[{'warning',W}|_18]> when 'true' -> + let <_20> = + apply 'lc$^0'/1 + (_18) + in ( [W|_20] + -| ['compiler_generated'] ) + ( <[_17|_18]> when 'true' -> + apply 'lc$^0'/1 + (_18) + -| ['compiler_generated'] ) + <[]> when 'true' -> + [] + ( <_30> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_30}) + -| [{'function_name',{'lc$^0',1}}] ) + -| ['compiler_generated'] ) + end + in %% Line 107 + apply 'lc$^0'/1 + (Warnings) + in %% Line 108 + apply 'return'/3 + ({'error','systools_make',%% Line 109 + {'warnings_treated_as_errors',_21}}, %% Line 110 + Warnings, %% Line 111 + Flags) + %% Line 112 + <'false'> when 'true' -> + %% Line 113 + case apply 'generate_script'/4 + (Output, Release, Appls, Flags) of + %% Line 114 + <'ok'> when 'true' -> + %% Line 115 + apply 'return'/3 + ('ok', Warnings, Flags) + %% Line 116 + when 'true' -> + %% Line 117 + apply 'return'/3 + (Error, Warnings, Flags) + end + ( <_24> when 'true' -> + primop 'match_fail' + ({'case_clause',_24}) + -| ['compiler_generated'] ) + end + %% Line 120 + when 'true' -> + %% Line 121 + apply 'return'/3 + (Error, [], Flags) + end + %% Line 123 + when 'true' -> + let <_32> = + [%% Line 124 + RelName|%% Line 124 + ( [Flags|( [] + -| ['compiler_generated'] )] + -| ['compiler_generated'] )] + in %% Line 139 + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {( 'badarg' + -| ['compiler_generated'] ),ErrorVars} + -| ['compiler_generated'] ), _32) + -| ['compiler_generated'] ) + end + %% Line 127 + + when call 'erlang':'is_list' + (Flags) -> + let <_36> = + [%% Line 128 + RelName|%% Line 128 + ( [Flags|( [] + -| ['compiler_generated'] )] + -| ['compiler_generated'] )] + in %% Line 139 + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {( 'badarg' + -| ['compiler_generated'] ),RelName} + -| ['compiler_generated'] ), _36) + -| ['compiler_generated'] ) + %% Line 129 + when 'true' -> + let <_40> = + [%% Line 130 + RelName|%% Line 130 + ( [Flags|( [] + -| ['compiler_generated'] )] + -| ['compiler_generated'] )] + in %% Line 139 + ( call ( 'erlang' + -| ['compiler_generated'] ):( 'error' + -| ['compiler_generated'] ) + (( {( 'badarg' + -| ['compiler_generated'] ),Flags} + -| ['compiler_generated'] ), _40) + -| ['compiler_generated'] ) + end +'wsasl'/2 = + %% Line 132 + fun (_0,_1) -> + %% Line 133 + case call 'lists':'member' + ('no_warn_sasl', _0) of + %% Line 134 + <'true'> when 'true' -> + call 'lists':'delete' + ({'warning','missing_sasl'}, _1) + %% Line 135 + <'false'> when 'true' -> + _1 + ( <_2> when 'true' -> + primop 'match_fail' + ({'case_clause',_2}) + -| ['compiler_generated'] ) + end +'badarg'/2 = + %% Line 138 + fun (_0,_1) -> + %% Line 139 + call 'erlang':'error' + ({'badarg',_0}, _1) +'machine'/1 = + %% Line 141 + fun (_0) -> + %% Line 142 + case apply 'get_flag'/2 + ('machine', _0) of + %% Line 143 + <{'machine',Machine}> + when call 'erlang':'is_atom' + (Machine) -> + Machine + %% Line 144 + <_3> when 'true' -> + 'false' + end +'get_path'/1 = + %% Line 147 + fun (_0) -> + %% Line 148 + case apply 'get_flag'/2 + ('path', _0) of + %% Line 149 + <{'path',Path}> + when call 'erlang':'is_list' + (Path) -> + Path + %% Line 150 + <_3> when 'true' -> + [] + end +'get_outdir'/1 = + %% Line 153 + fun (_0) -> + %% Line 154 + case apply 'get_flag'/2 + ('outdir', _0) of + %% Line 155 + <{'outdir',OutDir}> + when call 'erlang':'is_list' + (OutDir) -> + %% Line 156 + OutDir + %% Line 157 + <_3> when 'true' -> + %% Line 158 + [] + end +'return'/3 = + %% Line 161 + fun (_0,_1,_2) -> + case <_0,_1,_2> of + <'ok',Warnings,Flags> when 'true' -> + %% Line 162 + case call 'lists':'member' + ('silent', Flags) of + %% Line 163 + <'true'> when 'true' -> + %% Line 164 + {'ok','systools_make',Warnings} + %% Line 165 + <_10> when 'true' -> + let <_3> = + apply %% Line 166 + 'format_warning'/1 + (%% Line 166 + Warnings) + in do %% Line 166 + call 'io':'format' + ([126|[116|[115]]], [_3|[]]) + %% Line 167 + 'ok' + end + %% Line 169 + <_@r0 = {'error',Mod,Error},_11,Flags> when 'true' -> + %% Line 170 + case call 'lists':'member' + ('silent', Flags) of + %% Line 171 + <'true'> when 'true' -> + %% Line 172 + _@r0 + %% Line 173 + <_12> when 'true' -> + let <_5> = + call %% Line 174 + Mod:%% Line 174 + 'format_error' + (%% Line 174 + Error) + in do %% Line 174 + call 'io':'format' + ([126|[116|[115]]], [_5|[]]) + %% Line 175 + 'error' + end + ( <_9,_8,_7> when 'true' -> + ( primop 'match_fail' + ({'function_clause',_9,_8,_7}) + -| [{'function_name',{'return',3}}] ) + -| ['compiler_generated'] ) + end +'make_hybrid_boot'/4 = + %% Line 195 + fun (_0,_1,_2,_3) -> + catch + %% Line 196 + apply 'do_make_hybrid_boot'/4 + (_0, _1, _2, _3) +'do_make_hybrid_boot'/4 = + %% Line 197 + fun (_0,_1,_2,_3) -> + %% Line 198 + case call 'erlang':'binary_to_term' + (_1) of + <{'script',{_X_RelName1,_X_RelVsn1},OldScript}> when 'true' -> + %% Line 199 + case call 'erlang':'binary_to_term' + (_2) of + <{'script',{NewRelName,_X_RelVsn2},NewScript}> when 'true' -> + let = + fun (_6) -> + %% Line 202 + case _6 of + <{'progress','kernel_load_completed'}> when 'true' -> + 'false' + %% Line 203 + <_41> when 'true' -> + 'true' + end + in %% Line 205 + case call 'lists':'splitwith' + (Fun1, OldScript) of + <{_X_OldKernelLoad,OldRest1}> when 'true' -> + %% Line 206 + case call 'lists':'splitwith' + (Fun1, NewScript) of + <{NewKernelLoad,NewRest1}> when 'true' -> + let = + fun (_11) -> + %% Line 208 + case _11 of + <{'progress','modules_loaded'}> when 'true' -> + 'false' + %% Line 209 + <_42> when 'true' -> + 'true' + end + in %% Line 211 + case call 'lists':'splitwith' + (Fun2, OldRest1) of + <{OldModLoad,OldRest2}> when 'true' -> + %% Line 212 + case call 'lists':'splitwith' + (Fun2, NewRest1) of + <{NewModLoad,NewRest2}> when 'true' -> + let = + fun (_16) -> + %% Line 214 + case _16 of + <{'kernelProcess',_43,_44}> when 'true' -> + 'false' + %% Line 215 + <_45> when 'true' -> + 'true' + end + in %% Line 217 + case call 'lists':'splitwith' + (Fun3, OldRest2) of + <{OldPaths,OldRest3}> when 'true' -> + %% Line 218 + case call 'lists':'splitwith' + (Fun3, NewRest2) of + <{NewPaths,NewRest3}> when 'true' -> + let = + fun (_21) -> + %% Line 220 + case _21 of + <{'progress','init_kernel_started'}> when 'true' -> + 'false' + %% Line 221 + <_46> when 'true' -> + 'true' + end + in %% Line 223 + case call 'lists':'splitwith' + (Fun4, OldRest3) of + <{_X_OldKernelProcs,OldApps}> when 'true' -> + %% Line 224 + case call 'lists':'splitwith' + (Fun4, NewRest3) of + <{NewKernelProcs,NewApps}> when 'true' -> + let = + apply %% Line 230 + 'get_regexp_path'/0 + () + in let = + apply %% Line 231 + 'replace_module_load'/3 + (%% Line 231 + OldModLoad, %% Line 231 + NewModLoad, %% Line 231 + MatchPaths) + in let = + apply %% Line 232 + 'replace_paths'/3 + (%% Line 232 + OldPaths, %% Line 232 + NewPaths, %% Line 232 + MatchPaths) + in %% Line 234 + case apply 'get_apps'/3 + (NewApps, 'undefined', 'undefined') of + <{Stdlib,Sasl}> when 'true' -> + let = + apply %% Line 235 + 'replace_apps'/3 + (%% Line 235 + OldApps, %% Line 235 + Stdlib, %% Line 235 + Sasl) + in let = + apply %% Line 236 + 'add_apply_upgrade'/2 + (%% Line 236 + Apps0, _3) + in let <_32> = + call %% Line 238 + 'erlang':%% Line 238 + '++' + (%% Line 238 + NewKernelProcs, %% Line 238 + Apps) + in let <_33> = + call %% Line 238 + 'erlang':%% Line 238 + '++' + (%% Line 238 + Paths, _32) + in let <_34> = + call %% Line 238 + 'erlang':%% Line 238 + '++' + (%% Line 238 + ModLoad, _33) + in let