/** * Module for the common literals to analyse the constant * propogation */ module php/strategy/const-prop/analysis/common/literals strategies /** * Extracting integer */ literal-const-prop(main|) = ?LNumber(Deci(i)) ; where( val := PHPInteger(<string-to-int> i)) ; add-php-simple-value(|val) literal-const-prop(main|) = ?LNumber(Octa(i)) ; where ( i' := <explode-string;take-until(?56 <+ ?57);implode-string> i //drop everything after a 8 or 9 ; val := PHPInteger(<oct-string-to-int> i') ) ; add-php-simple-value(|val) literal-const-prop(main|) = ?LNumber(Hexa(i)) ; where( i' := <explode-string;drop(|2);implode-string> i //dropping leading 0x ; val := PHPInteger(<hex-string-to-int> i') ) ; add-php-simple-value(|val) strategies /** * Extracting float */ literal-const-prop(main|) = ?DNumber(i) ; where( val := PHPFloat(<string-to-real> i) ) ; add-php-simple-value(|val) strategies /** * Extracting boolean */ literal-const-prop(main|) = ?True() ; add-php-simple-value(|PHPBoolean(True())) literal-const-prop(main|) = ?False() ; add-php-simple-value(|PHPBoolean(False())) strategies /** * Extracting null */ literal-const-prop(main|) = Null() ; add-php-simple-value(|PHPNull()) strategies /** * Extracting string value */ literal-const-prop(main|) = ( ?ConstantEncapsedString(SingleQuoted(parts)) <+ ?ConstantEncapsedString(DoubleQuoted(parts)) <+ ?ConstantEncapsedString(HereDoc(_,parts,_)) ) ; where( parts' := <map(eval-part(main))> parts ; val := PHPString(<concat-strings> parts') ) ; add-php-simple-value(|val) // Processing of strings rules eval-part(main): Literal(str) -> str eval-part(main): Escape(esc) -> str where str := <eval-asc-char> esc eval-part(main): esc@Variable(_) -> str where str := <main; get-simple-raw-string-value> esc rules // Hexachars eval-part(main): HexaChar(b1) -> str where res := <hex-chars-to-int> [ b1 ] ; str := <implode-string> [res] eval-part(main): HexaChar(b1,b2) -> str where res := <hex-chars-to-int> [ b1, b2 ] ; str := <implode-string> [res] // Octachars eval-part(main): OctaChar(b1) -> str where res := <oct-chars-to-int> [ b1 ] ; str := <implode-string> [res] eval-part(main): OctaChar(b1,b2) -> str where res := <oct-chars-to-int> [ b1, b2] ; str := <implode-string> [res] eval-part(main): OctaChar(b1,b2,b3) -> str where res := <oct-chars-to-int> [ b1, b2, b3 ] ; str := <implode-string> [res] //ascii characters rules eval-asc-char : 34 -> "\"" eval-asc-char : 36 -> "$" eval-asc-char : 39 -> "'" eval-asc-char : 48 -> 0 eval-asc-char : 49 -> 1 eval-asc-char : 50 -> 2 eval-asc-char : 51 -> 3 eval-asc-char : 52 -> 4 eval-asc-char : 53 -> 5 eval-asc-char : 54 -> 6 eval-asc-char : 55 -> 7 eval-asc-char : 56 -> 8 eval-asc-char : 57 -> 9 eval-asc-char : 92 -> "\\" eval-asc-char : 96 -> "`" eval-asc-char : 110 -> "\n" eval-asc-char : 114 -> "\r" eval-asc-char : 116 -> "\t"