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

# · C++ · 251 lines · 236 code · 13 blank · 2 comment · 69 complexity · 381bfc8473fe06a4ae92f0c4efdd8900 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' || c == ',');
  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. stringstream 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, "\"", '"', returnString))
  150. returnval = NAME;
  151. else if (getValue(line, i, "{", '}', returnString))
  152. returnval = NAME;
  153. else if (getValue(line, i, "magnify=", returnString))
  154. returnval = MAGNIFY;
  155. else if (getValue(line, i, "mapbounds={", '}', returnString))
  156. returnval = MAP_BOUNDS;
  157. else if (getValue(line, i, "marker_color={", '}', returnString))
  158. returnval = MARKER_COLOR;
  159. else if (getValue(line, i, "marker_color=", returnString))
  160. {
  161. unsigned char RGB[3];
  162. parseColor(returnString, RGB);
  163. delete [] returnString;
  164. returnString = new char[32];
  165. snprintf(returnString, 32, "%d,%d,%d", RGB[0], RGB[1], RGB[2]);
  166. returnval = MARKER_COLOR;
  167. }
  168. else if (getValue(line, i, "marker_file=", returnString))
  169. returnval = MARKER_FILE;
  170. else if (getValue(line, i, "marker_font=", returnString))
  171. returnval = MARKER_FONT;
  172. else if (getValue(line, i, "map=", returnString))
  173. returnval = DAY_MAP;
  174. else if (getValue(line, i, "max_radius_for_label=", returnString))
  175. returnval = MAX_RAD_FOR_LABEL;
  176. else if (getValue(line, i, "min_radius_for_label=", returnString))
  177. returnval = MIN_RAD_FOR_LABEL;
  178. else if (getValue(line, i, "min_radius_for_markers=", returnString))
  179. returnval = MIN_RAD_FOR_MARKERS;
  180. else if (getValue(line, i, "night_map=", returnString))
  181. returnval = NIGHT_MAP;
  182. else if (getValue(line, i, "orbit={", '}', returnString))
  183. returnval = ORBIT;
  184. else if (getValue(line, i, "orbit_color={", '}', returnString))
  185. returnval = ORBIT_COLOR;
  186. else if (getValue(line, i, "position=", returnString))
  187. returnval = POSITION;
  188. else if (getValue(line, i, "radius=", returnString))
  189. returnval = RADIUS;
  190. else if (getValue(line, i, "random_origin=", returnString))
  191. returnval = RANDOM_ORIGIN;
  192. else if (getValue(line, i, "random_target=", returnString))
  193. returnval = RANDOM_TARGET;
  194. else if (getValue(line, i, "satellite_file=", returnString))
  195. returnval = SATELLITE_FILE;
  196. else if (getValue(line, i, "shade=", returnString))
  197. returnval = SHADE;
  198. else if (getValue(line, i, "spacing=", returnString))
  199. returnval = SPACING;
  200. else if (getValue(line, i, "specular_map=", returnString))
  201. returnval = SPECULAR_MAP;
  202. else if (getValue(line, i, "symbolsize=", returnString))
  203. returnval = SYMBOLSIZE;
  204. else if (getValue(line, i, "text_color={", '}', returnString))
  205. returnval = TEXT_COLOR;
  206. else if (strncmp(line+i, "timezone=", 9) == 0)
  207. {
  208. i += 9;
  209. int istart = i;
  210. while (line[i] == '/' || line[i] == ',' || !isDelimiter(line[i]))
  211. {
  212. if (isEndOfLine(line[i])) break;
  213. i++;
  214. }
  215. returnString = new char[i - istart + 1];
  216. strncpy(returnString, (line + istart), i - istart);
  217. returnString[i-istart] = '\0';
  218. returnval = TIMEZONE;
  219. }
  220. else if (getValue(line, i, "trail={", '}', returnString))
  221. returnval = TRAIL;
  222. else if (getValue(line, i, "transparent={", '}', returnString))
  223. returnval = TRANSPARENT;
  224. else if (getValue(line, i, "twilight=", returnString))
  225. returnval = TWILIGHT;
  226. else // assume it's a latitude/longitude value
  227. {
  228. int istart = i;
  229. skipPastToken(i, line);
  230. returnString = new char[i - istart + 1];
  231. strncpy(returnString, (line + istart), i - istart);
  232. returnString[i-istart] = '\0';
  233. returnval = LATLON;
  234. }
  235. return(returnval);
  236. }