/tags/xplanet-1.1.0/src/parse.cpp

# · C++ · 255 lines · 240 code · 13 blank · 2 comment · 89 complexity · a37e73dd2e268a4beb5d6b44f1ac6005 MD5 · raw file

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <sstream>
  4. #include <string>
  5. using namespace std;
  6. #include "keywords.h"
  7. #include "xpUtil.h"
  8. extern void
  9. parseColor(string color, unsigned char RGB[3]);
  10. bool
  11. isDelimiter(char c)
  12. {
  13. return(c == ' ' || c == '\t');
  14. }
  15. bool
  16. isEndOfLine(char c)
  17. {
  18. // 13 is DOS end-of-line, 28 is the file separator
  19. return(c == '#' || c == '\0' || c == 13 || c == 28);
  20. }
  21. static void
  22. skipPastToken(int &i, const char *line, const char endChar)
  23. {
  24. while (line[i] != endChar)
  25. {
  26. if (isEndOfLine(line[i]))
  27. {
  28. ostringstream errStr;
  29. errStr << "Malformed line:\n\t" << line << "\n";
  30. xpWarn(errStr.str(), __FILE__, __LINE__);
  31. return;
  32. }
  33. i++;
  34. }
  35. }
  36. static void
  37. skipPastToken(int &i, const char *line)
  38. {
  39. while (!isDelimiter(line[i]))
  40. {
  41. if (isEndOfLine(line[i])) return;
  42. i++;
  43. }
  44. }
  45. static bool
  46. getValue(const char *line, int &i, const char *key, const char endChar,
  47. char *&returnstring)
  48. {
  49. const unsigned int length = strlen(key);
  50. if (strncmp(line + i, key, length) == 0)
  51. {
  52. i += length;
  53. int istart = i;
  54. skipPastToken(i, line, endChar);
  55. returnstring = new char[i - istart + 1];
  56. strncpy(returnstring, (line + istart), i - istart);
  57. returnstring[i-istart] = '\0';
  58. i++;
  59. return(true);
  60. }
  61. return(false);
  62. }
  63. static bool
  64. getValue(const char *line, int &i, const char *key, char *&returnstring)
  65. {
  66. const unsigned int length = strlen(key);
  67. if (strncmp(line + i, key, length) == 0)
  68. {
  69. i += length;
  70. int istart = i;
  71. skipPastToken(i, line);
  72. returnstring = new char[i - istart + 1];
  73. strncpy(returnstring, (line + istart), i - istart);
  74. returnstring[i-istart] = '\0';
  75. i++;
  76. return(true);
  77. }
  78. return(false);
  79. }
  80. // This routine returns the next token in the line and its type.
  81. int
  82. parse(int &i, const char *line, char *&returnString)
  83. {
  84. if (i >= (int) strlen(line)) return(ENDOFLINE);
  85. if (returnString != NULL)
  86. xpWarn("returnString is not NULL!\n", __FILE__, __LINE__);
  87. int returnVal = UNKNOWN;
  88. if (isDelimiter(line[i]))
  89. {
  90. i++;
  91. returnVal = DELIMITER;
  92. }
  93. else if (isEndOfLine(line[i]))
  94. returnVal = ENDOFLINE;
  95. else if (getValue(line, i, "align=", returnString))
  96. returnVal = ALIGN;
  97. else if (getValue(line, i, "arc_color={", '}', returnString))
  98. returnVal = ARC_COLOR;
  99. else if (getValue(line, i, "arc_color=", returnString))
  100. {
  101. unsigned char RGB[3];
  102. parseColor(returnString, RGB);
  103. delete [] returnString;
  104. returnString = new char[32];
  105. snprintf(returnString, 32, "%d,%d,%d", RGB[0], RGB[1], RGB[2]);
  106. returnVal = ARC_COLOR;
  107. }
  108. else if (getValue(line, i, "arc_file=", returnString))
  109. returnVal = ARC_FILE;
  110. else if (getValue(line, i, "[", ']', returnString))
  111. returnVal = BODY;
  112. else if (getValue(line, i, "altcirc=", returnString))
  113. returnVal = CIRCLE;
  114. else if (getValue(line, i, "circle=", returnString))
  115. returnVal = CIRCLE;
  116. else if (getValue(line, i, "cloud_gamma=", returnString))
  117. returnVal = CLOUD_GAMMA;
  118. else if (getValue(line, i, "cloud_map=", returnString))
  119. returnVal = CLOUD_MAP;
  120. else if (getValue(line, i, "cloud_threshold=", returnString))
  121. returnVal = CLOUD_THRESHOLD;
  122. else if (getValue(line, i, "color={", '}', returnString))
  123. returnVal = COLOR;
  124. else if (getValue(line, i, "color=", returnString))
  125. {
  126. unsigned char RGB[3];
  127. parseColor(returnString, RGB);
  128. delete [] returnString;
  129. returnString = new char[32];
  130. snprintf(returnString, 32, "%d,%d,%d", RGB[0], RGB[1], RGB[2]);
  131. returnVal = COLOR;
  132. }
  133. else if (getValue(line, i, "draw_orbit=", returnString))
  134. returnVal = DRAW_ORBIT;
  135. else if (getValue(line, i, "font=", returnString))
  136. returnVal = FONT;
  137. else if (getValue(line, i, "fontsize=", returnString))
  138. returnVal = FONTSIZE;
  139. else if (getValue(line, i, "grid=", returnString))
  140. returnVal = GRID;
  141. else if (getValue(line, i, "grid1=", returnString))
  142. returnVal = GRID1;
  143. else if (getValue(line, i, "grid2=", returnString))
  144. returnVal = GRID2;
  145. else if (getValue(line, i, "grid_color=", returnString))
  146. returnVal = GRID_COLOR;
  147. else if (getValue(line, i, "image=", returnString))
  148. returnVal = IMAGE;
  149. else if (getValue(line, i, "lang=", returnString))
  150. returnVal = LANGUAGE;
  151. else if (getValue(line, i, "magnify=", returnString))
  152. returnVal = MAGNIFY;
  153. else if (getValue(line, i, "mapbounds={", '}', returnString))
  154. returnVal = MAP_BOUNDS;
  155. else if (getValue(line, i, "marker_color={", '}', returnString))
  156. returnVal = MARKER_COLOR;
  157. else if (getValue(line, i, "marker_color=", returnString))
  158. {
  159. unsigned char RGB[3];
  160. parseColor(returnString, RGB);
  161. delete [] returnString;
  162. returnString = new char[32];
  163. snprintf(returnString, 32, "%d,%d,%d", RGB[0], RGB[1], RGB[2]);
  164. returnVal = MARKER_COLOR;
  165. }
  166. else if (getValue(line, i, "marker_file=", returnString))
  167. returnVal = MARKER_FILE;
  168. else if (getValue(line, i, "marker_font=", returnString))
  169. returnVal = MARKER_FONT;
  170. else if (getValue(line, i, "map=", returnString))
  171. returnVal = DAY_MAP;
  172. else if (getValue(line, i, "max_radius_for_label=", returnString))
  173. returnVal = MAX_RAD_FOR_LABEL;
  174. else if (getValue(line, i, "min_radius_for_label=", returnString))
  175. returnVal = MIN_RAD_FOR_LABEL;
  176. else if (getValue(line, i, "min_radius_for_markers=", returnString))
  177. returnVal = MIN_RAD_FOR_MARKERS;
  178. else if (getValue(line, i, "\"", '"', returnString))
  179. returnVal = NAME;
  180. else if (getValue(line, i, "{", '}', returnString))
  181. returnVal = NAME;
  182. else if (getValue(line, i, "night_map=", returnString))
  183. returnVal = NIGHT_MAP;
  184. else if (getValue(line, i, "orbit={", '}', returnString))
  185. returnVal = ORBIT;
  186. else if (getValue(line, i, "orbit_color={", '}', returnString))
  187. returnVal = ORBIT_COLOR;
  188. else if (getValue(line, i, "relative_to=", returnString))
  189. returnVal = ORIGIN;
  190. else if (getValue(line, i, "position=", returnString))
  191. returnVal = POSITION;
  192. else if (getValue(line, i, "radius=", returnString))
  193. returnVal = RADIUS;
  194. else if (getValue(line, i, "random_origin=", returnString))
  195. returnVal = RANDOM_ORIGIN;
  196. else if (getValue(line, i, "random_target=", returnString))
  197. returnVal = RANDOM_TARGET;
  198. else if (getValue(line, i, "satellite_file=", returnString))
  199. returnVal = SATELLITE_FILE;
  200. else if (getValue(line, i, "shade=", returnString))
  201. returnVal = SHADE;
  202. else if (getValue(line, i, "spacing=", returnString))
  203. returnVal = SPACING;
  204. else if (getValue(line, i, "specular_map=", returnString))
  205. returnVal = SPECULAR_MAP;
  206. else if (getValue(line, i, "symbolsize=", returnString))
  207. returnVal = SYMBOLSIZE;
  208. else if (getValue(line, i, "text_color={", '}', returnString))
  209. returnVal = TEXT_COLOR;
  210. else if (strncmp(line+i, "timezone=", 9) == 0)
  211. {
  212. i += 9;
  213. int istart = i;
  214. while (line[i] == '/' || line[i] == ',' || !isDelimiter(line[i]))
  215. {
  216. if (isEndOfLine(line[i])) break;
  217. i++;
  218. }
  219. returnString = new char[i - istart + 1];
  220. strncpy(returnString, (line + istart), i - istart);
  221. returnString[i-istart] = '\0';
  222. returnVal = TIMEZONE;
  223. }
  224. else if (getValue(line, i, "trail={", '}', returnString))
  225. returnVal = TRAIL;
  226. else if (getValue(line, i, "transparent={", '}', returnString))
  227. returnVal = TRANSPARENT;
  228. else if (getValue(line, i, "twilight=", returnString))
  229. returnVal = TWILIGHT;
  230. else // assume it's a latitude/longitude value
  231. {
  232. int istart = i;
  233. skipPastToken(i, line);
  234. returnString = new char[i - istart + 1];
  235. strncpy(returnString, (line + istart), i - istart);
  236. returnString[i-istart] = '\0';
  237. returnVal = LATLON;
  238. }
  239. return(returnVal);
  240. }