io.cpp

changeset 0
c51cce84a9ac
child 4
758302636564
equal deleted inserted replaced
-1:000000000000 0:c51cce84a9ac
1 #include <vector>
2
3 #include "common.h"
4 #include "io.h"
5 #include "ldtypes.h"
6 #include "misc.h"
7
8 // =============================================================================
9 // IO_FindLoadedFile (str)
10 //
11 // Returns a pointer to the first found open file with the given name.
12 // =============================================================================
13 OpenFile* IO_FindLoadedFile (str name) {
14 OpenFile* file;
15
16 for (uint i = 0; i < g_LoadedFiles.size(); i++) {
17 file = g_LoadedFiles[i];
18 if (!file->filename.icompare (name))
19 return file;
20 }
21
22 return NULL;
23 }
24
25 // =============================================================================
26 // IO_ParseLDFile (str)
27 //
28 // Opens the given file and parses the LDraw code within.
29 // =============================================================================
30 OpenFile* IO_ParseLDFile (str path) {
31 FILE* fp = fopen (path.chars (), "r");
32
33 if (!fp) {
34 printf ("Couldn't open %s!\n", path.chars ());
35 return NULL;
36 }
37
38 OpenFile* load = new OpenFile;
39 load->filename = path;
40
41 vector<str> lines;
42
43 {
44 char line[1024];
45 while (fgets (line, sizeof line, fp)) {
46 // Trim the trailing newline
47 str zLine = line;
48 while (zLine[~zLine - 1] == '\n' || zLine[~zLine - 1] == '\r')
49 zLine -= 1;
50
51 lines.push_back (zLine);
52 }
53 }
54
55 fclose (fp);
56
57 for (ulong i = 0; i < lines.size(); ++i)
58 load->objects.push_back (ParseLine (lines[i]));
59
60 g_LoadedFiles.push_back (load);
61 return g_LoadedFiles[g_LoadedFiles.size() - 1];
62 }
63
64 // =============================================================================
65 // ParseLine (str)
66 //
67 // Parses a string line containing an LDraw object and returns the object parsed.
68 // =============================================================================
69 LDObject* ParseLine (str zLine) {
70 str zNoWhitespace = zLine;
71 StripWhitespace (zNoWhitespace);
72 if (!~zNoWhitespace) {
73 // Line was empty, or only consisted of whitespace
74 return new LDEmpty;
75 }
76
77 char c = zLine[0];
78 vector<str> tokens = zLine / " ";
79 printf ("line: %s\n", zLine.chars());
80
81 switch (c - '0') {
82 case 0:
83 {
84 // Comment
85 LDComment* obj = new LDComment;
86 obj->zText = zLine.substr (1, -1);
87 printf ("\t-> comment (%s)\n", obj->zText.chars());
88 return obj;
89 }
90
91 case 1:
92 {
93 // Subfile
94 LDSubfile* obj = new LDSubfile;
95 obj->dColor = atoi (tokens[1]);
96 obj->vPosition = ParseVertex (zLine, 2); // 2 - 4
97
98 for (short i = 0; i < 9; ++i)
99 obj->faMatrix[i] = atof (tokens[i + 5]); // 5 - 13
100
101 obj->zFileName = tokens[14];
102 return obj;
103 }
104
105 case 2:
106 {
107 // Line
108 LDLine* obj = new LDLine;
109 obj->dColor = GetWordInt (zLine, 1);
110 for (short i = 0; i < 2; ++i)
111 obj->vaCoords[i] = ParseVertex (zLine, 2 + (i * 3)); // 2 - 7
112 return obj;
113 }
114
115 case 3:
116 {
117 // Triangle
118 LDTriangle* obj = new LDTriangle;
119 obj->dColor = GetWordInt (zLine, 1);
120
121 for (short i = 0; i < 3; ++i)
122 obj->vaCoords[i] = ParseVertex (zLine, 2 + (i * 3)); // 2 - 10
123
124 return obj;
125 }
126
127 case 4:
128 {
129 // Quadrilateral
130 LDQuad* obj = new LDQuad;
131 obj->dColor = GetWordInt (zLine, 1);
132
133 for (short i = 0; i < 4; ++i)
134 obj->vaCoords[i] = ParseVertex (zLine, 2 + (i * 3)); // 2 - 13
135
136 return obj;
137 }
138
139 case 5:
140 {
141 // Conditional line
142 LDCondLine* obj = new LDCondLine;
143 obj->dColor = GetWordInt (zLine, 1);
144
145 for (short i = 0; i < 2; ++i)
146 obj->vaCoords[i] = ParseVertex (zLine, 2 + (i * 3)); // 2 - 7
147
148 for (short i = 0; i < 2; ++i)
149 obj->vaControl[i] = ParseVertex (zLine, 8 + (i * 3)); // 8 - 13
150 return obj;
151 }
152
153 default:
154 {
155 // Strange line we couldn't parse
156 LDGibberish* obj = new LDGibberish;
157 obj->zContent = zLine;
158 return obj;
159 }
160 }
161 }

mercurial