X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/d83803733e0994c59ed12d7b6b4acf2ea55a5f10..0559abf83c4cc9bbd896b69dfaae1e8422521479:/Syntax.hpp diff --git a/Syntax.hpp b/Syntax.hpp index f34c412..5599f7e 100644 --- a/Syntax.hpp +++ b/Syntax.hpp @@ -33,6 +33,18 @@ #include "Location.hpp" #include "Options.hpp" #include "Pooling.hpp" +#include "String.hpp" + +double CYCastDouble(const char *value, size_t size); +double CYCastDouble(const char *value); +double CYCastDouble(CYUTF8String value); + +void CYNumerify(std::ostringstream &str, double value); +void CYStringify(std::ostringstream &str, const char *data, size_t size, bool c = false); + +// XXX: this really should not be here ... :/ +void *CYPoolFile(CYPool &pool, const char *path, size_t *psize); +CYUTF8String CYPoolFileUTF8String(CYPool &pool, const char *path); struct CYContext; @@ -1951,23 +1963,19 @@ struct CYTypeError : virtual void Output(CYOutput &out) const; }; -struct CYTypeVoid : - CYTypeSpecifier -{ - CYTypeVoid() { - } - - virtual CYTarget *Replace(CYContext &context); - virtual void Output(CYOutput &out) const; +enum CYTypeSigning { + CYTypeNeutral, + CYTypeSigned, + CYTypeUnsigned, }; -struct CYTypeReference : +struct CYTypeCharacter : CYTypeSpecifier { - CYIdentifier *name_; + CYTypeSigning signing_; - CYTypeReference(CYIdentifier *name) : - name_(name) + CYTypeCharacter(CYTypeSigning signing) : + signing_(signing) { } @@ -1975,60 +1983,67 @@ struct CYTypeReference : virtual void Output(CYOutput &out) const; }; -struct CYTypeVariable : +struct CYTypeIntegral : CYTypeSpecifier { - CYIdentifier *name_; + CYTypeSigning signing_; + int length_; - CYTypeVariable(CYIdentifier *name) : - name_(name) + CYTypeIntegral(CYTypeSigning signing, int length = 1) : + signing_(signing), + length_(length) { } - CYTypeVariable(const char *name) : - name_(new($pool) CYIdentifier(name)) - { + CYTypeIntegral *Long() { + if (length_ != 1 && length_ != 2) + return NULL; + ++length_; + return this; } - virtual CYTarget *Replace(CYContext &context); - virtual void Output(CYOutput &out) const; -}; + CYTypeIntegral *Short() { + if (length_ != 1) + return NULL; + --length_; + return this; + } -struct CYTypeUnsigned : - CYTypeSpecifier -{ - CYTypeSpecifier *specifier_; + CYTypeIntegral *Signed() { + if (signing_ != CYTypeNeutral) + return NULL; + signing_ = CYTypeSigned; + return this; + } - CYTypeUnsigned(CYTypeSpecifier *specifier) : - specifier_(specifier) - { + CYTypeIntegral *Unsigned() { + if (signing_ != CYTypeNeutral) + return NULL; + signing_ = CYTypeUnsigned; + return this; } virtual CYTarget *Replace(CYContext &context); virtual void Output(CYOutput &out) const; }; -struct CYTypeSigned : +struct CYTypeVoid : CYTypeSpecifier { - CYTypeSpecifier *specifier_; - - CYTypeSigned(CYTypeSpecifier *specifier) : - specifier_(specifier) - { + CYTypeVoid() { } virtual CYTarget *Replace(CYContext &context); virtual void Output(CYOutput &out) const; }; -struct CYTypeLong : +struct CYTypeReference : CYTypeSpecifier { - CYTypeSpecifier *specifier_; + CYIdentifier *name_; - CYTypeLong(CYTypeSpecifier *specifier) : - specifier_(specifier) + CYTypeReference(CYIdentifier *name) : + name_(name) { } @@ -2036,13 +2051,18 @@ struct CYTypeLong : virtual void Output(CYOutput &out) const; }; -struct CYTypeShort : +struct CYTypeVariable : CYTypeSpecifier { - CYTypeSpecifier *specifier_; + CYIdentifier *name_; - CYTypeShort(CYTypeSpecifier *specifier) : - specifier_(specifier) + CYTypeVariable(CYIdentifier *name) : + name_(name) + { + } + + CYTypeVariable(const char *name) : + name_(new($pool) CYIdentifier(name)) { }