X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/10b959e3729a77b95ab15614d1bdce74da327d8b..f5ba273ecd799f652736ce2bc830283787302a56:/src/common/wxexpr.cpp?ds=sidebyside diff --git a/src/common/wxexpr.cpp b/src/common/wxexpr.cpp index bb046c5fa8..bbfce13288 100644 --- a/src/common/wxexpr.cpp +++ b/src/common/wxexpr.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -20,13 +20,11 @@ #pragma hdrstop #endif -#include #include #include #include #include "wx/utils.h" - #include "wx/expr.h" #include "wx/wxexpr.h" @@ -34,11 +32,10 @@ extern "C" void add_expr(char *); extern "C" void LexFromFile(FILE *fd); extern "C" void LexFromString(char *buf); + wxExprDatabase *thewxExprDatabase = NULL; wxExprErrorHandler currentwxExprErrorHandler; -IMPLEMENT_DYNAMIC_CLASS(wxExprDatabase, wxList) - wxExpr::wxExpr(const wxString& functor) { type = wxExprList; @@ -58,10 +55,10 @@ wxExpr::wxExpr(wxExprType the_type, const wxString& word_or_string) switch (the_type) { case wxExprWord: - value.word = copystring((const char *)word_or_string); + value.word = copystring((const wxChar *)word_or_string); break; case wxExprString: - value.string = copystring((const char *)word_or_string); + value.string = copystring((const wxChar *)word_or_string); break; case wxExprList: last = NULL; @@ -76,7 +73,7 @@ wxExpr::wxExpr(wxExprType the_type, const wxString& word_or_string) next = NULL; } -wxExpr::wxExpr(wxExprType the_type, char *word_or_string, bool allocate) +wxExpr::wxExpr(wxExprType the_type, wxChar *word_or_string, bool allocate) { type = the_type; @@ -109,7 +106,7 @@ wxExpr::wxExpr(long the_integer) next = NULL; } -wxExpr::wxExpr(float the_real) +wxExpr::wxExpr(double the_real) { type = wxExprReal; value.real = the_real; @@ -251,7 +248,7 @@ wxExpr *wxExpr::GetAttributeValueNode(const wxString& word) const // Use only fo { wxExpr *secondNode = firstNode->next; if ((secondNode->type == wxExprWord) && - (strcmp((const char *)word, secondNode->value.word) == 0)) + (wxStrcmp((const wxChar *)word, secondNode->value.word) == 0)) { return expr; } @@ -278,12 +275,12 @@ wxExpr *wxExpr::AttributeValue(const wxString& word) const // Use only for a cla wxString wxExpr::Functor(void) const // Use only for a clause { if ((type != wxExprList) || !value.first) - return wxString(""); + return wxString(wxT("")); if (value.first->type == wxExprWord) return wxString(value.first->value.word); else - return wxString(""); + return wxString(wxT("")); } bool wxExpr::IsFunctor(const wxString& f) const // Use only for a clause @@ -292,7 +289,7 @@ bool wxExpr::IsFunctor(const wxString& f) const // Use only for a clause return FALSE; return (value.first->type == wxExprWord && - (strcmp((const char *)f, value.first->value.word) == 0)); + (wxStrcmp((const wxChar *)f, value.first->value.word) == 0)); } // Return nth argument of a clause (starting from 1) @@ -361,7 +358,7 @@ void wxExpr::DeleteAttributeValue(const wxString& attribute) { wxExpr *secondNode = firstNode->next; if ((secondNode->type == wxExprWord) && - (strcmp((const char *)attribute, secondNode->value.word) == 0)) + (wxStrcmp((const wxChar *)attribute, secondNode->value.word) == 0)) { wxExpr *nextExpr = expr->next; delete expr; @@ -393,7 +390,7 @@ void wxExpr::AddAttributeValue(const wxString& attribute, wxExpr *val) // DeleteAttributeValue(attribute); wxExpr *patt = new wxExpr(wxExprWord, attribute); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr = new wxExpr(wxExprList); @@ -417,7 +414,7 @@ void wxExpr::AddAttributeValue(const wxString& attribute, long val) wxExpr *patt = new wxExpr(wxExprWord, attribute); wxExpr *pval = new wxExpr(val); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr = new wxExpr(wxExprList); @@ -428,7 +425,7 @@ void wxExpr::AddAttributeValue(const wxString& attribute, long val) Append(listExpr); } -void wxExpr::AddAttributeValue(const wxString& attribute, float val) +void wxExpr::AddAttributeValue(const wxString& attribute, double val) { if (type != wxExprList) { @@ -439,7 +436,7 @@ void wxExpr::AddAttributeValue(const wxString& attribute, float val) // DeleteAttributeValue(attribute); wxExpr *patt = new wxExpr(wxExprWord, attribute); wxExpr *pval = new wxExpr(val); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr = new wxExpr(wxExprList); @@ -462,7 +459,7 @@ void wxExpr::AddAttributeValueString(const wxString& attribute, const wxString& wxExpr *patt = new wxExpr(wxExprWord, attribute); wxExpr *pval = new wxExpr(wxExprString, val); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr = new wxExpr(wxExprList); @@ -485,7 +482,7 @@ void wxExpr::AddAttributeValueWord(const wxString& attribute, const wxString& va wxExpr *patt = new wxExpr(wxExprWord, attribute); wxExpr *pval = new wxExpr(wxExprWord, val); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr = new wxExpr(wxExprList); @@ -510,7 +507,7 @@ void wxExpr::AddAttributeValue(const wxString& attribute, wxList *val) wxExpr *patt = new wxExpr(wxExprWord, attribute); wxExpr *pval = new wxExpr(val); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr = new wxExpr(wxExprList); @@ -546,7 +543,7 @@ void wxExpr::AddAttributeValueStringList(const wxString& attribute, wxList *stri // Now make an (=, Att, Value) triple wxExpr *patt = new wxExpr(wxExprWord, attribute); - wxExpr *pequals = new wxExpr(wxExprWord, "="); + wxExpr *pequals = new wxExpr(wxExprWord, wxT("=")); wxExpr *listExpr2 = new wxExpr(wxExprList); @@ -584,6 +581,18 @@ bool wxExpr::GetAttributeValue(const wxString& att, long& var) const } bool wxExpr::GetAttributeValue(const wxString& att, float& var) const +{ + wxExpr *expr = AttributeValue(att); + if (expr && (expr->Type() == wxExprInteger || expr->Type() == wxExprReal)) + { + var = (float) expr->RealValue(); + return TRUE; + } + else + return FALSE; +} + +bool wxExpr::GetAttributeValue(const wxString& att, double& var) const { wxExpr *expr = AttributeValue(att); if (expr && (expr->Type() == wxExprInteger || expr->Type() == wxExprReal)) @@ -644,18 +653,18 @@ bool wxExpr::GetAttributeValueStringList(const wxString& att, wxList *var) const } // Compatibility -void wxExpr::AssignAttributeValue(char *att, char **var) const +void wxExpr::AssignAttributeValue(wxChar *att, wxChar **var) const { wxString str; if (GetAttributeValue(att, str)) { if (*var) delete[] *var; - *var = copystring((const char *) str); + *var = copystring((const wxChar *) str); } } -void wxExpr::WriteClause(ostream& stream) // Write this expression as a top-level clause +void wxExpr::WriteClause(FILE* stream) // Write this expression as a top-level clause { if (type != wxExprList) return; @@ -664,23 +673,24 @@ void wxExpr::WriteClause(ostream& stream) // Write this expression as a top-lev if (node) { node->WriteExpr(stream); - stream << "("; + fprintf( stream, "(" ); node = node->next; bool first = TRUE; while (node) { if (!first) - stream << " "; + fprintf( stream, " " ); node->WriteExpr(stream); node = node->next; - if (node) stream << ",\n"; + if (node) + fprintf( stream, ",\n" ); first = FALSE; } - stream << ").\n\n"; + fprintf( stream, ").\n\n" ); } } -void wxExpr::WriteExpr(ostream& stream) // Write as any other subexpression +void wxExpr::WriteExpr(FILE* stream) // Write as any other subexpression { // This seems to get round an optimizer bug when // using Watcom C++ 10a in WIN32 compilation mode. @@ -697,89 +707,87 @@ void wxExpr::WriteExpr(ostream& stream) // Write as any other subexpression { case wxExprInteger: { - stream << value.integer; + fprintf( stream, "%ld", value.integer ); break; } case wxExprReal: { - float f = value.real; -/* Now the parser can cope with this. - // Prevent printing in 'e' notation. Any better way? - if (fabs(f) < 0.00001) - f = 0.0; -*/ - char buf[40]; - sprintf(buf, "%.6g", f); - stream << buf; + double f = value.real; + fprintf( stream, "%.6g", f); break; } case wxExprString: { - stream << "\""; + fprintf( stream, "\"" ); int i; - int len = strlen(value.string); + const wxWX2MBbuf val = wxConvLibc.cWX2MB(value.string); + int len = strlen(val); for (i = 0; i < len; i++) { - char ch = value.string[i]; + char ch = val[i]; if (ch == '"' || ch == '\\') - stream << "\\"; - stream << ch; + fprintf( stream, "\\" ); + char tmp[2]; + tmp[0] = ch; + tmp[1] = 0; + fprintf( stream, tmp ); } - - stream << "\""; + fprintf( stream, "\"" ); break; } case wxExprWord: { bool quote_it = FALSE; - int len = strlen(value.word); - if ((len == 0) || (len > 0 && (value.word[0] > 64 && value.word[0] < 91))) + const wxWX2MBbuf val = wxConvLibc.cWX2MB(value.word); + int len = strlen(val); + if ((len == 0) || (len > 0 && (val[0] > 64 && val[0] < 91))) quote_it = TRUE; else { int i; for (i = 0; i < len; i++) - if ((!isalpha(value.word[i])) && (!isdigit(value.word[i])) && - (value.word[i] != '_')) + if ((!isalpha(val[i])) && (!isdigit(val[i])) && + (val[i] != '_')) { quote_it = TRUE; i = len; } } if (quote_it) - stream << "'"; + fprintf( stream ,"'" ); - stream << value.word; + fprintf( stream, (const char*) val ); if (quote_it) - stream << "'"; + fprintf( stream, "'" ); break; } case wxExprList: { if (!value.first) - stream << "[]"; + fprintf( stream, "[]" ); else { wxExpr *expr = value.first; - if ((expr->Type() == wxExprWord) && (strcmp(expr->WordValue(), "=") == 0)) + if ((expr->Type() == wxExprWord) && (wxStrcmp(expr->WordValue(), wxT("=")) == 0)) { wxExpr *arg1 = expr->next; wxExpr *arg2 = arg1->next; arg1->WriteExpr(stream); - stream << " = "; + fprintf( stream, " = " ); arg2->WriteExpr(stream); } else { - stream << "["; + fprintf( stream, "[" ); while (expr) { expr->WriteExpr(stream); expr = expr->next; - if (expr) stream << ", "; + if (expr) + fprintf( stream, ", " ); } - stream << "]"; + fprintf( stream, "]" ); } } break; @@ -788,50 +796,12 @@ void wxExpr::WriteExpr(ostream& stream) // Write as any other subexpression } } -void wxExpr::WriteLispExpr(ostream& stream) -{ - switch (type) - { - case wxExprInteger: - { - stream << value.integer; - break; - } - case wxExprReal: - { - stream << value.real; - break; - } - case wxExprString: - { - stream << "\"" << value.string << "\""; - break; - } - case wxExprWord: - { - stream << value.word; - break; - } - case wxExprList: - { - wxExpr *expr = value.first; - - stream << "("; - while (expr) - { - expr->WriteLispExpr(stream); - expr = expr->next; - if (expr) stream << " "; - } - - stream << ")"; - break; - } - case wxExprNull: break; - } -} +/* + * wxExpr 'database' (list of expressions) + */ + +IMPLEMENT_DYNAMIC_CLASS(wxExprDatabase, wxList) -// wxExpr 'database' (list of expressions) wxExprDatabase::wxExprDatabase(wxExprErrorHandler handler) { position = NULL; @@ -924,7 +894,7 @@ wxExpr *wxExprDatabase::FindClause(const wxString& word, long val) return found; } -wxExpr *wxExprDatabase::FindClause(const wxString& word, float val) +wxExpr *wxExprDatabase::FindClause(const wxString& word, double val) { wxExpr *found = NULL; while (position && !found) @@ -969,12 +939,12 @@ void wxExprDatabase::Append(wxExpr *clause) wxExpr *expr = clause->AttributeValue(attribute_to_hash); if (expr) { - long functor_key = hash_table->MakeKey((char *)(const char *)functor); + long functor_key = hash_table->MakeKey(WXSTRINGCAST functor); long value_key = 0; if (expr && expr->Type() == wxExprString) { - value_key = hash_table->MakeKey((char *)(const char *)expr->StringValue()); - hash_table->Put(functor_key + value_key, (char *)(const char *)expr->StringValue(), (wxObject *)clause); + value_key = hash_table->MakeKey(WXSTRINGCAST expr->StringValue()); + hash_table->Put(functor_key + value_key, WXSTRINGCAST expr->StringValue(), (wxObject *)clause); } else if (expr && expr->Type() == wxExprInteger) { @@ -988,7 +958,7 @@ void wxExprDatabase::Append(wxExpr *clause) wxExpr *wxExprDatabase::HashFind(const wxString& functor, long value) const { - long key = hash_table->MakeKey((char *)(const char *)functor) + value; + long key = hash_table->MakeKey(WXSTRINGCAST functor) + value; // The key alone isn't guaranteed to be unique: // must supply value too. Let's assume the value of the @@ -998,8 +968,8 @@ wxExpr *wxExprDatabase::HashFind(const wxString& functor, long value) const wxExpr *wxExprDatabase::HashFind(const wxString& functor, const wxString& value) const { - long key = hash_table->MakeKey((char *)(const char *)functor) + hash_table->MakeKey((char *)(const char *)value); - return (wxExpr *)hash_table->Get(key, (char *)(const char *)value); + long key = hash_table->MakeKey(WXSTRINGCAST functor) + hash_table->MakeKey(WXSTRINGCAST value); + return (wxExpr *)hash_table->Get(key, WXSTRINGCAST value); } void wxExprDatabase::ClearDatabase(void) @@ -1022,7 +992,7 @@ bool wxExprDatabase::Read(const wxString& filename) { noErrors = 0; - FILE *f = fopen((const char *)filename, "r"); + FILE *f = fopen(filename.fn_str(), "r"); if (f) { thewxExprDatabase = this; @@ -1045,7 +1015,8 @@ bool wxExprDatabase::ReadFromString(const wxString& buffer) noErrors = 0; thewxExprDatabase = this; - LexFromString((char *)(const char *)buffer); + const wxWX2MBbuf buf = buffer.mb_str(); + LexFromString(wxMBSTRINGCAST buf); yyparse(); wxExprCleanUp(); return (noErrors == 0); @@ -1053,13 +1024,17 @@ bool wxExprDatabase::ReadFromString(const wxString& buffer) bool wxExprDatabase::Write(const wxString& fileName) { - ofstream str((char *)(const char *)fileName); - if (str.bad()) + FILE *stream = fopen( fileName.fn_str(), "w+" ); + + if (!stream) return FALSE; - return Write(str); + + bool success = Write(stream); + fclose(stream); + return success; } -bool wxExprDatabase::Write(ostream& stream) +bool wxExprDatabase::Write(FILE *stream) { noErrors = 0; wxNode *node = First(); @@ -1072,19 +1047,6 @@ bool wxExprDatabase::Write(ostream& stream) return (noErrors == 0); } -void wxExprDatabase::WriteLisp(ostream& stream) -{ - noErrors = 0; - wxNode *node = First(); - while (node) - { - wxExpr *expr = (wxExpr *)node->Data(); - expr->WriteLispExpr(stream); - stream << "\n\n"; - node = node->Next(); - } -} - void add_expr(wxExpr * expr) { thewxExprDatabase->Append(expr); @@ -1112,19 +1074,19 @@ bool wxExprIsFunctor(wxExpr *expr, const wxString& functor) * */ -char *make_integer(char *str) +char *wxmake_integer(char *str) { wxExpr *x = new wxExpr(atol(str)); return (char *)x; } -char *make_real(char *str1, char *str2) +char *wxmake_real(char *str1, char *str2) { char buf[50]; sprintf(buf, "%s.%s", str1, str2); - float f = (float)atof(buf); + double f = (double)atof(buf); wxExpr *x = new wxExpr(f); return (char *)x; @@ -1132,19 +1094,19 @@ char *make_real(char *str1, char *str2) // extern "C" double exp10(double); -char *make_exp(char *str1, char *str2) +char *wxmake_exp(char *str1, char *str2) { double mantissa = (double)atoi(str1); double exponent = (double)atoi(str2); double d = mantissa * pow(10.0, exponent); - wxExpr *x = new wxExpr((float)d); + wxExpr *x = new wxExpr(d); return (char *)x; } -char *make_exp2(char *str1, char *str2, char *str3) +char *wxmake_exp2(char *str1, char *str2, char *str3) { char buf[50]; @@ -1154,45 +1116,46 @@ char *make_exp2(char *str1, char *str2, char *str3) double d = mantissa * pow(10.0, exponent); - wxExpr *x = new wxExpr((float)d); + wxExpr *x = new wxExpr(d); return (char *)x; } -char *make_word(char *str) +char *wxmake_word(char *str) { wxExpr *x = new wxExpr(wxExprWord, str); return (char *)x; } -char *make_string(char *str) +char *wxmake_string(char *str) { - char *s, *t; + wxChar *s, *t; int len, i; + const wxMB2WXbuf sbuf = wxConvLibc.cMB2WX(str); - str++; /* skip leading quote */ - len = strlen(str) - 1; /* ignore trailing quote */ +// str++; /* skip leading quote */ + len = wxStrlen(sbuf) - 1; /* ignore trailing quote */ - s = new char[len + 1]; + s = new wxChar[len + 1]; t = s; - for(i=0; i