00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include "vuParser.h"
00005
00006
00007
00008
00009
00010 vuParser::vuParser()
00011 {
00012 m_Buffer = 0;
00013 m_Pos = 0;
00014 m_Len = 0;
00015 }
00016
00017
00018
00019
00020
00021 vuParser::~vuParser()
00022 {
00023 if (m_Buffer) delete [] m_Buffer;
00024 }
00025
00026
00027
00028
00029
00030 void vuParser::readBuffer(const char* filename)
00031 {
00032 ifstream ifp;
00033 int len;
00034
00035 #ifdef IS_NOCREATE_NEEDED
00036 ifp.open(filename, ios::in|ios::binary|ios::nocreate);
00037 #else
00038
00039
00040 ifp.open(filename, ios::in|ios::binary);
00041 #endif
00042 if (!ifp.is_open()) throw ("Could not open the input file.");
00043
00044
00045 ifp.seekg(0, ios::end);
00046 len = ifp.tellg();
00047 ifp.seekg(0, ios::beg);
00048
00049 if (m_Buffer)
00050 delete [] m_Buffer;
00051 m_Buffer = new char[len+1];
00052 ifp.read(m_Buffer, len);
00053 m_Buffer[len] = 0;
00054 ifp.close();
00055
00056 m_Pos = 0;
00057 }
00058
00059
00060
00061
00062
00063 void vuParser::FixBuffer(void)
00064 {
00065 dword i;
00066 dword j;
00067 dword len;
00068 char* tmp;
00069
00070 i = 0;
00071 len = 1;
00072 tmp = m_Buffer;
00073 while(tmp[i] != 0)
00074 {
00075 if ((tmp[i]=='{') || (tmp[i]=='}') ||
00076 (tmp[i]=='(') || (tmp[i]==')') ||
00077 (tmp[i]=='[') || (tmp[i]==']') ||
00078 (tmp[i]==',') || (tmp[i]==';'))
00079 len += 3;
00080 else
00081 ++len;
00082 ++i;
00083 }
00084
00085 m_Buffer = new char[len];
00086 m_Len = len;
00087
00088 i = 0;
00089 j = 0;
00090 while(tmp[i] != 0)
00091 {
00092 if ((tmp[i]=='{') || (tmp[i]=='}') ||
00093 (tmp[i]=='(') || (tmp[i]==')') ||
00094 (tmp[i]=='[') || (tmp[i]==']') ||
00095 (tmp[i]==',') || (tmp[i]==';'))
00096 {
00097 m_Buffer[j++] = ' ';
00098 m_Buffer[j++] = tmp[i];
00099 m_Buffer[j++] = ' ';
00100 }
00101 else
00102 m_Buffer[j++] = tmp[i];
00103 ++i;
00104 }
00105
00106 delete [] tmp;
00107 }
00108
00109
00110
00111
00112
00113 bool vuParser::readToken(char token, bool eat)
00114 {
00115 int len = 0;
00116 vuString stoken = token;
00117 stoken += " %n";
00118 sscanf(&m_Buffer[m_Pos],stoken,&len);
00119 if (eat) m_Pos += len;
00120 return (len > 0);
00121 }
00122
00123
00124
00125
00126
00127 bool vuParser::finished()
00128 {
00129 return (m_Pos>=m_Len);
00130 }
00131
00132
00133
00134
00135 bool vuParser::readString(const char* s)
00136 {
00137 char str[1024];
00138 int ret, len=0;
00139 strcpy(str, s);
00140 strcat(str, "%n");
00141 ret = sscanf(&m_Buffer[m_Pos], str, &len);
00142 if ((ret!=EOF) && (len!=0))
00143 {
00144 m_Pos += len;
00145 return true;
00146 }
00147 return false;
00148 }
00149
00150
00151
00152
00153 bool vuParser::readString(const char* prefix, char* s)
00154 {
00155 char str[1024];
00156 int i=0;
00157 strcpy(str, prefix);
00158 strcat(str, " \"");
00159 if (readString(str))
00160 {
00161 while((m_Buffer[m_Pos]!='"') && m_Buffer[m_Pos])
00162 s[i++] = m_Buffer[m_Pos++];
00163 s[i] = 0;
00164 if (m_Buffer[m_Pos]=='"')
00165 {
00166 ++m_Pos;
00167 return true;
00168 }
00169 }
00170 return false;
00171 }
00172
00173
00174
00175
00176 bool vuParser::readNumber(const char* prefix, float& t)
00177 {
00178 char str[1024];
00179 int ret, len=0;
00180 strcpy(str, prefix);
00181 strcat(str, " %f%n");
00182 ret = sscanf(&m_Buffer[m_Pos], str, (float*)&t, &len);
00183 if ((ret == 1) && (len!=0))
00184 {
00185 m_Pos += len;
00186 return true;
00187 }
00188 return false;
00189 }