sdk: const correctness
[sdk] / compiler / libec / src / ecdefs.ec
index bee8169..909efc8 100644 (file)
@@ -21,6 +21,129 @@ import "dbpass"
 
 #include <stdio.h>
 
+#define yylloc _yylloc
+#include "grammar.h"
+#undef yylloc
+
+public enum TokenType
+{
+  identifier = IDENTIFIER,
+  constant = CONSTANT,
+  stringLiteral = STRING_LITERAL,
+  sizeOf = SIZEOF,
+  ptrOp = PTR_OP,
+  incOp = INC_OP,
+  decOp = DEC_OP,
+  leftOp = LEFT_OP,
+  rightOp = RIGHT_OP,
+  leOp = LE_OP,
+  geOp = GE_OP,
+  eqOp = EQ_OP,
+  neOp = NE_OP,
+  andOp = AND_OP,
+  orOp = OR_OP,
+  mulAssign = MUL_ASSIGN,
+  divAssign = DIV_ASSIGN,
+  modAssign = MOD_ASSIGN,
+  addAssign = ADD_ASSIGN,
+  subAssign = SUB_ASSIGN,
+  leftAssign = LEFT_ASSIGN,
+  rightAssign = RIGHT_ASSIGN,
+  andAssign = AND_ASSIGN,
+  xorAssign = XOR_ASSIGN,
+  orAssign = OR_ASSIGN,
+  typeName = TYPE_NAME,
+  _typedef = TYPEDEF,
+  _extern = EXTERN,
+  _static = STATIC,
+  _auto = AUTO,
+  _register = REGISTER,
+  _char = CHAR,
+  _short = SHORT,
+  _int = INT,
+  _uint = UINT,
+  _int64 = INT64,
+  _long = LONG,
+  _signed = SIGNED,
+  _unsigned = UNSIGNED,
+  _float = FLOAT,
+  _double = DOUBLE,
+  _const = CONST,
+  _volatile = VOLATILE,
+  _void = VOID,
+  _valist = VALIST,
+  _struct = STRUCT,
+  _union = UNION,
+  _enum = ENUM,
+  ellipsis = ELLIPSIS,
+  _case = CASE,
+  _default = DEFAULT,
+  _if = IF,
+  _switch = SWITCH,
+  _whilte = WHILE,
+  _do = DO,
+  _for = FOR,
+  _goto = GOTO,
+  _continue = CONTINUE,
+  _break = BREAK,
+  _return = RETURN,
+  ifx = IFX,
+  _else = ELSE,
+  _class = CLASS,
+  thisClass = THISCLASS,
+  className = CLASS_NAME,
+  _property = PROPERTY,
+  setProp = SETPROP,
+  getProp = GETPROP,
+  newOp = NEWOP,
+  _renew = RENEW,
+  _delete = DELETE,
+  _extDecl = EXT_DECL,
+  _extStorage = EXT_STORAGE,
+  _import = IMPORT,
+  _define = DEFINE,
+  _virtual = VIRTUAL,
+  attrib = ATTRIB,
+  _public = PUBLIC,
+  _priate = PRIVATE,
+  typedObject = TYPED_OBJECT,
+  anyObject = ANY_OBJECT,
+  _incref = _INCREF,
+  extension = EXTENSION,
+  ___asm = ASM,
+  _typeof = TYPEOF,
+  _watch = WATCH,
+  stopWatching = STOPWATCHING,
+  fireWatchers = FIREWATCHERS,
+  _watchable = WATCHABLE,
+  classDesigner = CLASS_DESIGNER,
+  classNoExpansion = CLASS_NO_EXPANSION,
+  classFixed = CLASS_FIXED,
+  isPropSet = ISPROPSET,
+  classDefaultProperty = CLASS_DEFAULT_PROPERTY,
+  propertyCategory = PROPERTY_CATEGORY,
+  classData = CLASS_DATA,
+  classProperty = CLASS_PROPERTY,
+  subClass = SUBCLASS,
+  nameSpace = NAMESPACE,
+  new0Op = NEW0OP,
+  renew0Op = RENEW0,
+  vaArg = VAARG,
+  dbTable = DBTABLE,
+  dbField = DBFIELD,
+  dbIndex = DBINDEX,
+  databaseOpen = DATABASE_OPEN,
+  alignOf = ALIGNOF,
+  attribDep = ATTRIB_DEP,
+  _attrib = __ATTRIB,
+  BOOL = BOOL,
+  _BOOL = _BOOL,
+  complex = _COMPLEX,
+  imaginary = _IMAGINARY,
+  _restrict = RESTRICT,
+  _thread = THREAD
+};
+
 enum Order { ascending, descending };
 
 public class DBTableDef : struct
@@ -28,7 +151,7 @@ public class DBTableDef : struct
 public:
    char * name;
    Symbol symbol;
-   OldList * definitions;   
+   OldList * definitions;
    AccessMode declMode;
 }
 
@@ -74,14 +197,16 @@ public void SetMainModule(ModuleImport moduleImport) { mainModule = moduleImport
 File fileInput;
 public void SetFileInput(File file) { fileInput = file; }
 char * symbolsDir = null;
-public void SetSymbolsDir(char * s) { 
+public void SetSymbolsDir(const char * s) {
    delete symbolsDir;
    symbolsDir = CopyString(s);
-} public char * GetSymbolsDir() { return symbolsDir ? symbolsDir : ""; }
-char * outputFile;
-public void SetOutputFile(char * s) { outputFile = s; } public char * GetOutputFile() { return outputFile; }
-char * sourceFile;
-public void SetSourceFile(char * s) { sourceFile = s; } public char * GetSourceFile() { return sourceFile; }
+} public const char * GetSymbolsDir() { return symbolsDir ? symbolsDir : ""; }
+const char * outputFile;
+public void SetOutputFile(const char * s) { outputFile = s; } public const char * GetOutputFile() { return outputFile; }
+const char * sourceFile;
+public void SetSourceFile(const char * s) { sourceFile = s; } public const char * GetSourceFile() { return sourceFile; }
+const char * i18nModuleName;
+public void SetI18nModuleName(const char * s) { i18nModuleName = s; } public const char * GetI18nModuleName() { return i18nModuleName; }
 
 public void SetGlobalContext(Context context) { globalContext = context; } public Context GetGlobalContext() { return globalContext; }
 public void SetTopContext(Context context) { topContext = context; } public Context GetTopContext() { return topContext; }
@@ -93,6 +218,54 @@ public void SetDefines(OldList * list) { defines = list; }
 bool outputLineNumbers = true;
 public void SetOutputLineNumbers(bool value) { outputLineNumbers = value; }
 
+public void FixModuleName(char *moduleName)
+{
+   ChangeCh(moduleName, '.', '_');
+   ChangeCh(moduleName, ' ', '_');
+   ChangeCh(moduleName, '-', '_');
+   ChangeCh(moduleName, '&', '_');
+}
+
+// todo support %var% variables for windows and $var for linux?
+public char * PassArg(char * output, const char * input)
+{
+#ifdef __WIN32__
+//define windowsFileNameCharsNeedEscaping = " !%&'()+,;=[]^`{}~"; // "#$-.@_" are ok
+   const char * escChars = " !\"%&'()+,;=[]^`{}~"; // windowsFileNameCharsNeedEscaping;
+   const char * escCharsQuoted = "\"";
+#else
+//define linuxFileNameCharsNeedEscaping = " !\"$&'()*:;<=>?[\\`{|"; // "#%+,-.@]^_}~" are ok
+   const char * escChars = " !\"$&'()*:;<=>?[\\`{|"; // linuxFileNameCharsNeedEscaping;
+   const char * escCharsQuoted = "\"()$";
+#endif
+   bool quoting = false;
+   char *o = output;
+   const char *i = input, *l = input;
+#ifdef __WIN32__
+   while(*l && !strchr(escChars, *l)) l++;
+   if(*l) quoting = true;
+#else
+   if(*i == '-')
+   {
+      l++;
+      while(*l && !strchr(escChars, *l)) l++;
+      if(*l) quoting = true;
+      *o++ = *i++;
+   }
+#endif
+   if(quoting)
+      *o++ = '\"';
+   while(*i)
+   {
+      if(strchr(quoting ? escCharsQuoted : escChars, *i))
+         *o++ = '\\';
+      *o++ = *i++;
+   }
+   if(quoting)
+      *o++ = '\"';
+   *o = '\0';
+   return o;
+}
 /*public Module GetPrivateModule()
 {
    return privateModule;
@@ -125,7 +298,7 @@ public struct CodePosition
 {
 public:
    int line, charPos, pos;
-   bool included;
+   int included;
 
    void AdjustDelete(BufferLocation start, BufferLocation end)
    {
@@ -143,7 +316,7 @@ public:
             if(line - 1 > end.y)
                line -= end.y - start.y;
             // Location is the last touched line
-            else 
+            else
             {
                if(charPos - 1 >= end.x)
                {
@@ -174,7 +347,7 @@ public:
             if(charPos - 1 > start.x || (charPos - 1 == start.x /*&& (numLines ? true : false)*/))
             {
                line += numLines;
-               //charPos - 1 += numLines ? end.x : (end.x - start.x);            
+               //charPos - 1 += numLines ? end.x : (end.x - start.x);
                charPos += end.x - start.x;
             }
          }
@@ -189,7 +362,7 @@ public:
 
    bool Inside(int line, int charPos)
    {
-      return (start.line < line || (start.line == line && start.charPos <= charPos)) && 
+      return (start.line < line || (start.line == line && start.charPos <= charPos)) &&
              (end.line > line || (end.line == line && end.charPos >= charPos));
    }
 };
@@ -229,16 +402,17 @@ public:
 };
 
 public enum ExpressionType
-{ 
+{
    identifierExp, instanceExp, constantExp, stringExp, opExp,
    bracketsExp, indexExp, callExp, memberExp, pointerExp, typeSizeExp,
    castExp, conditionExp, newExp, renewExp, classSizeExp,
-   dummyExp, dereferenceErrorExp, symbolErrorExp, classMemberSymbolErrorExp,
-   structMemberSymbolErrorExp, memoryErrorExp, unknownErrorExp,
-   noDebuggerErrorExp, debugStateErrorExp,
+   dummyExp, dereferenceErrorExp, symbolErrorExp,
+   memberSymbolErrorExp, memoryErrorExp, unknownErrorExp,
+   noDebuggerErrorExp,
    extensionCompoundExp, classExp, classDataExp, new0Exp, renew0Exp,
    dbopenExp, dbfieldExp, dbtableExp, dbindexExp, extensionExpressionExp, extensionInitializerExp,
-   vaArgExp, arrayExp, typeAlignExp
+   vaArgExp, arrayExp, typeAlignExp,
+   memberPropertyErrorExp, functionCallErrorExp, divideBy0ErrorExp
 };
 
 public enum MemberType
@@ -257,7 +431,7 @@ public class TemplateParameter : struct
 public:
    TemplateParameter prev, next;
    Location loc;
-   
+
    TemplateParameterType type;
    Identifier identifier;
    union
@@ -266,9 +440,9 @@ public:
       TemplateMemberType memberType;   // For identifier
    };
    TemplateArgument defaultArgument;
-    
+
    // For type parameters
-   char * dataTypeString;
+   const char * dataTypeString;
    Type baseType;
 }
 
@@ -284,7 +458,7 @@ public class TemplateArgument : struct
 public:
    TemplateArgument prev, next;
    Location loc;
-   
+
    Identifier name;
    TemplateParameterType type;
    union
@@ -322,7 +496,7 @@ public:
          Identifier id;
          OldList * list;
          OldList * baseSpecs;
-         OldList * definitions;
+         OldList/*<ClassDef>*/ * definitions;
          bool addNameSpace;
          Context ctx;
          ExtDecl extDeclStruct;
@@ -382,7 +556,11 @@ public:
       };
       Statement compound;
       Instantiation instance;
-      char * string;
+      struct
+      {
+         char * string;
+         bool intlString;
+      };
       OldList * list;
       struct
       {
@@ -481,6 +659,7 @@ public:
    bool addedThis;
    bool needCast;
    bool thisPtr;
+   bool opDestType;
 
    void Clear()
    {
@@ -499,6 +678,7 @@ public:
       addedThis = false;
       needCast = false;
       thisPtr = false;
+      opDestType = false;
    }
 };
 
@@ -521,7 +701,7 @@ class Pointer : struct
 
 public enum DeclaratorType
 {
-   structDeclarator, identifierDeclarator, bracketsDeclarator, arrayDeclarator, 
+   structDeclarator, identifierDeclarator, bracketsDeclarator, arrayDeclarator,
    functionDeclarator, pointerDeclarator, extendedDeclarator, extendedDeclaratorEnd
 };
 
@@ -576,6 +756,7 @@ public:
       OldList * list;
    };
    bool isConstant;
+   Identifier id;
 };
 
 public class InitDeclarator : struct
@@ -614,10 +795,11 @@ class AsmField : struct
    Location loc;
    char * command;
    Expression expression;
+   Identifier symbolic;
 };
 
 public enum StmtType { labeledStmt, caseStmt, compoundStmt,
-               expressionStmt, ifStmt, switchStmt, whileStmt, doWhileStmt, 
+               expressionStmt, ifStmt, switchStmt, whileStmt, doWhileStmt,
                forStmt, gotoStmt, continueStmt, breakStmt, returnStmt, asmStmt, badDeclarationStmt,
                fireWatchersStmt, stopWatchingStmt, watchStmt, forEachStmt
              };
@@ -652,7 +834,7 @@ public:
       {
          OldList * exp;
          Statement stmt;
-         Statement elseStmt;                  
+         Statement elseStmt;
       } ifStmt;
       struct
       {
@@ -781,7 +963,7 @@ public:
    Class _class;
    OldList attached;    // For IDE
    AccessMode declMode;
-   
+
    // COMPILING DATA
    Type type;
    Symbol propSet;
@@ -850,7 +1032,7 @@ public:
 };
 
 public enum ClassDefType
-{ 
+{
    functionClassDef, defaultPropertiesClassDef, declarationClassDef, propertyClassDef,
    propertyWatchClassDef, classDesignerClassDef, classNoExpansionClassDef, classFixedClassDef,
    designerDefaultPropertyClassDef, classDataClassDef, classPropertyClassDef, classPropertyValueClassDef,
@@ -869,9 +1051,13 @@ public:
    Statement setStmt;
    Statement issetStmt;
    Symbol symbol;
-   bool conversion;
-   bool isWatchable;
    Expression category;
+   struct
+   {
+      bool conversion:1;
+      bool isWatchable:1;
+      bool isDBProp:1;
+   };
 };
 
 public class ClassDef : struct
@@ -984,7 +1170,7 @@ public:
    char * constructorName, * structName, * className, * destructorName;
 
    ModuleImport module;
-   ClassImport _import;  
+   ClassImport _import;
    Location nameLoc;
    bool isParam;
    bool isRemote;
@@ -1010,7 +1196,7 @@ public:
    OldList methods;
    OldList properties;
    bool itself;
-   bool isRemote;
+   int isRemote;
 };
 
 public class FunctionImport : struct
@@ -1050,11 +1236,11 @@ public:
 
 // For the .sym file:
 public enum TypeKind
-{ 
+{
    voidType, charType, shortType, intType, int64Type, longType, floatType,
    doubleType, classType, structType, unionType, functionType, arrayType, pointerType,
    ellipsisType, enumType, methodType, vaListType, /*typedObjectType, anyObjectType, classPointerType, */ dummyType,
-   subClassType, templateType, thisClassType, intPtrType
+   subClassType, templateType, thisClassType, intPtrType, intSizeType, _BoolType
 };
 
 public class Type : struct
@@ -1083,7 +1269,7 @@ public:
       struct
       {
          Method method;
-         Class methodClass;
+         Class methodClass;      // Clarify what this is!
          Class usedClass;
       };
 
@@ -1100,29 +1286,35 @@ public:
       Type type;
       TemplateParameter templateParameter;
    };
-   bool isSigned;
    TypeKind kind;
-   bool constant;
    uint size;
    char * name;
    char * typeName;
-   bool count;
-   bool truth;
 
    ClassObjectType classObjectType;
-   bool byReference;
-
-   bool extraParam;
    int alignment;
-   bool directClassAccess;
-   bool computing;
-   bool dllExport;
    uint offset;
-   bool keepCast;
-   bool passAsTemplate;
    int bitFieldCount;
-
-   char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+   int count;
+
+   bool isSigned:1;
+   bool constant:1;
+   bool truth:1;
+   bool byReference:1;
+   bool extraParam:1;      // Clarify this... One thing it is used for is adaptive method with their own type explicitly specified
+   bool directClassAccess:1;     // Need to clarify this if this had the same intended purpose as declaredWithStruct
+   bool computing:1;
+   bool keepCast:1;
+   bool passAsTemplate:1;
+   bool dllExport:1;
+   bool attrStdcall:1;
+   bool declaredWithStruct:1;
+   bool typedByReference:1;      // Originally typed by reference, regardless of class type
+   bool casted:1;
+   // TODO: Add _Complex & _Imaginary support
+   // bool complex:1, imaginary:1;
+
+   const char * OnGetString(char * tempString, void * fieldData, bool * needClass)
    {
       Type type = (Type)this;
       tempString[0] = '\0';
@@ -1133,9 +1325,9 @@ public:
 
    void OnFree()
    {
-      
+
    }
-};            
+};
 
 public struct Operand
 {
@@ -1171,14 +1363,14 @@ public:
    bool (* Mul)(Expression, Operand, Operand);
    bool (* Div)(Expression, Operand, Operand);
    bool (* Mod)(Expression, Operand, Operand);
-   
+
    // unary arithmetic
    bool (* Neg)(Expression, Operand);
-   
+
    // unary arithmetic increment and decrement
    bool (* Inc)(Expression, Operand);
    bool (* Dec)(Expression, Operand);
-   
+
    // binary arithmetic assignment
    bool (* Asign)(Expression, Operand, Operand);
    bool (* AddAsign)(Expression, Operand, Operand);
@@ -1186,7 +1378,7 @@ public:
    bool (* MulAsign)(Expression, Operand, Operand);
    bool (* DivAsign)(Expression, Operand, Operand);
    bool (* ModAsign)(Expression, Operand, Operand);
-   
+
    // binary bitwise
    bool (* BitAnd)(Expression, Operand, Operand);
    bool (* BitOr)(Expression, Operand, Operand);
@@ -1194,31 +1386,31 @@ public:
    bool (* LShift)(Expression, Operand, Operand);
    bool (* RShift)(Expression, Operand, Operand);
    bool (* BitNot)(Expression, Operand);
-   
+
    // binary bitwise assignment
    bool (* AndAsign)(Expression, Operand, Operand);
    bool (* OrAsign)(Expression, Operand, Operand);
    bool (* XorAsign)(Expression, Operand, Operand);
    bool (* LShiftAsign)(Expression, Operand, Operand);
    bool (* RShiftAsign)(Expression, Operand, Operand);
-   
+
    // unary logical negation
    bool (* Not)(Expression, Operand);
-   
+
    // binary logical equality
    bool (* Equ)(Expression, Operand, Operand);
    bool (* Nqu)(Expression, Operand, Operand);
-   
+
    // binary logical
    bool (* And)(Expression, Operand, Operand);
    bool (* Or)(Expression, Operand, Operand);
-   
+
    // binary logical relational
    bool (* Grt)(Expression, Operand, Operand);
    bool (* Sma)(Expression, Operand, Operand);
    bool (* GrtEqu)(Expression, Operand, Operand);
    bool (* SmaEqu)(Expression, Operand, Operand);
-   
+
    bool (* Cond)(Expression, Operand, Operand, Operand);
 };
 
@@ -1226,7 +1418,7 @@ define MAX_INCLUDE_DEPTH = 30;
 
 #include <stdarg.h>
 
-void Compiler_Error(char * format, ...)
+void Compiler_Error(const char * format, ...)
 {
    if(inCompiler)
    {
@@ -1254,7 +1446,7 @@ void Compiler_Error(char * format, ...)
          */
 #ifdef _DEBUG
          if(!yylloc.start.line)
-            printf("");
+            printf("no line");
 #endif
 
          //printf("(%d, %d) : error: ", yylloc.start.line, yylloc.start.charPos);
@@ -1278,24 +1470,30 @@ void Compiler_Error(char * format, ...)
 int numWarnings;
 public int GetNumWarnings() { return numWarnings; }
 
-void Compiler_Warning(char * format, ...)
+void Compiler_Warning(const char * format, ...)
 {
    if(inCompiler)
    {
       va_list args;
       char string[10000];
+      char fileName[MAX_FILENAME];
 
       if(yylloc.start.included)
       {
+         String include = GetIncludeFileFromID(yylloc.start.included);
          GetWorkingDir(string, sizeof(string));
-         PathCat(string, GetIncludeFileFromID(yylloc.start.included));
+         PathCat(string, include);
       }
       else
       {
          GetWorkingDir(string, sizeof(string));
          PathCat(string, sourceFile);
       }
-      
+
+      // Skip these warnings from MinGW-w64 GCC 4.8 in intrin-impl.h
+      GetLastDirectory(string, fileName);
+      if(!strcmp(fileName, "intrin-impl.h")) return;
+
       printf(string);
 
       //printf("(%d, %d) : warning: ", yylloc.start.line, yylloc.start.charPos);
@@ -1312,7 +1510,7 @@ void Compiler_Warning(char * format, ...)
 bool parseError;
 bool skipErrors;
 
-int yyerror(char * s)
+int yyerror()
 {
    if(!skipErrors)
    {