Advertisement
KeinMitleid

Trainwreck Code

Jul 10th, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. // ===========================
  2. // VMF::getToken()
  3. // Gets next token in file
  4. // ===========================
  5.  
  6. string VMF::getToken(int& bracketsDeep, bool& error)
  7. {
  8.     bool withinQuotes = false;
  9.     string token;
  10.  
  11.     while (true)
  12.     {
  13.         // Get next character.
  14.         char ch = file.get();
  15.  
  16.         // If end-of-file has been found, act accordingly and return token.
  17.         if (file.eof())
  18.         {
  19.             if (bracketsDeep != 0) { error = true; }
  20.             else if (withinQuotes) { error = true; }
  21.             return token;
  22.         }
  23.  
  24.         // If \" is found, end parsing.
  25.         if (ch == '\\' && file.peek() == '\"') { error = true; break; }
  26.  
  27.         // If token is enclosed in quotes, look for characters and act accordingly.
  28.         if (withinQuotes == true)
  29.         {
  30.             if (ch == '\"') { return token; }
  31.             else if (ch == '\n') { error = true; return token; }
  32.         }
  33.  
  34.         // If token isn't enclosed in quotes, look for characters and act accordingly.
  35.         else if (withinQuotes == false)
  36.         {
  37.             if (ch == '\"')
  38.             {
  39.                 if (token.length() == 0) { withinQuotes = true; continue; }
  40.                 else { file.unget(); return token; }
  41.             }
  42.             else if (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t')
  43.             {
  44.                 if (token.length() == 0) { continue; }
  45.                 else { return token; }
  46.             }
  47.             else if (ch == '{' || ch == '}')
  48.             {
  49.                 if (token.length() == 0) { token = ch; return token; }
  50.                 else { file.unget(); return token;  }
  51.             }
  52.             else if (ch == '/' && file.peek() == '/')
  53.             {
  54.                 while (file.get() != '\n' && !file.eof()) {}
  55.                 if (token.length() == 0) { continue; }
  56.                 else { return token; }
  57.             }
  58.             else if (ch == '\\') { error = true; break; }
  59.         }
  60.  
  61.         token.push_back(ch);
  62.     }
  63. }
  64.  
  65. // ========================
  66. // VMF::parse()
  67. // Parses the VMF file.
  68. // ========================
  69.  
  70. bool VMF::parse()
  71. {
  72.     int bracketsDeep = 0;
  73.     bool isOdd = false;
  74.     bool error = false;
  75.  
  76.     while (true)
  77.     {
  78.         // Get first token. If bracket, act accordingly. Check for validity.
  79.         string thisToken = getToken(bracketsDeep, error);
  80.         if (file.eof())
  81.         {
  82.             if (isOdd == false) { break; }
  83.             else { error = true; break; }
  84.         }
  85.         if (thisToken == "}") { --bracketsDeep; isOdd = false; continue; }
  86.         isOdd = true;
  87.         if (thisToken == "{") { error = true; }
  88.         if (error) { break; }
  89.  
  90.         // Get second token. If bracket, act accordingly. Check for validity.
  91.         string nextToken = getToken(bracketsDeep, error);
  92.         cout << thisToken << " " << nextToken << endl;
  93.         if (file.eof())
  94.         {
  95.             if (isOdd == false) { break; }
  96.             else { error = true; break; }
  97.         }
  98.         if (nextToken == "{") { ++bracketsDeep; isOdd = false; continue; }
  99.         isOdd = false;
  100.         if (nextToken == "}") { error = true; }
  101.         if (error) { break; }
  102.     }
  103.  
  104.     return error;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement