1 #include "nvparse_errors.h"
2 #include "nvparse_externs.h"
3 #include <string.h>
4 #include <string>
5 #include <ctype.h>
6
7 using namespace std;
8
9
10 namespace
11 {
12 void LoadProgram( GLenum target, GLuint id, char *instring );
13 }
14
15
is_vsp10(const char * s)16 bool is_vsp10(const char * s)
17 {
18 return ! strncmp(s, "!!VSP1.0", 8);
19 }
20
vsp10_init(char * s)21 bool vsp10_init(char * s)
22 {
23 static bool vpinit = false;
24 if (vpinit == false )
25 {
26 /*
27 if(! glh_init_extensions("GL_NV_vertex_program"))
28 {
29 errors.set("unable to initialize GL_NV_vertex_program");
30 return false;
31 }
32 else
33 {
34 */
35 vpinit = true;
36 /*
37 }
38 */
39 }
40
41 errors.reset();
42 line_number = 1;
43 myin = s;
44
45 return true;
46 }
47
vsp10_parse(int vpsid)48 int vsp10_parse(int vpsid)
49 {
50 LoadProgram( GL_VERTEX_STATE_PROGRAM_NV, vpsid, myin );
51 return 0;
52 }
53
54 namespace
55 {
56 //.----------------------------------------------------------------------------.
57 //| Function : LoadProgram |
58 //| Description: Load a program into GL, and report any errors encountered. |
59 //.----------------------------------------------------------------------------.
LoadProgram(GLenum target,GLuint id,char * instring)60 void LoadProgram( GLenum target, GLuint id, char *instring )
61 {
62 GLint errPos;
63 GLenum errCode;
64
65 int len = strlen(instring);
66 glLoadProgramNV( target, id, len, (const GLubyte *) instring );
67 if ( (errCode = glGetError()) != GL_NO_ERROR )
68 {
69 glGetIntegerv( GL_PROGRAM_ERROR_POSITION_NV, &errPos );
70
71 int nlines = 1;
72 int nchar = 1;
73 int i;
74 for ( i = 0; i < errPos; i++ )
75 {
76 if ( instring[i] == '\n' )
77 {
78 nlines++;
79 nchar = 1;
80 }
81 else
82 {
83 nchar++;
84 }
85 }
86 int start = 0;
87 int end = 0;
88 int flag = ((instring[errPos]==';') | (instring[errPos-1]==';')) ? 1 : 0;
89 for ( i = errPos; i >= 0; i-- )
90 {
91 start = i;
92 if ( flag && (start >= errPos-1) )
93 continue;
94 if ( instring[i] == ';' )
95 {
96 if ( !flag )
97 {
98 start = i+1;
99 if ( instring[start] == '\n' )
100 start++;
101 }
102 break;
103 }
104 }
105 for ( i = errPos; i < len; i++ )
106 {
107 end = i;
108 if ( instring[i] == ';' && end > start)
109 {
110 break;
111 }
112 }
113 if ( errPos - start > 30 )
114 {
115 start = errPos - 30;
116 }
117 if ( end - errPos > 30 )
118 {
119 end = errPos + 30;
120 }
121
122 char substring[96];
123 memset( substring, 0, 96 );
124 strncpy( substring, &(instring[start]), end-start+1 );
125 char str[256];
126 //sprintf( str, "error at line %d character %d\n \"%s\"\n", nlines, nchar, substring );
127 sprintf( str, "error at line %d character %d\n\"%s\"\n", nlines, nchar, substring );
128 int width = errPos-start;
129 for ( i = 0; i < width; i++ )
130 {
131 strcat( str, " " );
132 }
133 strcat( str, "|\n" );
134 for ( i = 0; i < width; i++ )
135 {
136 strcat( str, " " );
137 }
138 strcat( str, "^\n" );
139
140 errors.set( str );
141 }
142 }
143 }
144 /*
145 else if(!strncmp(instring, "!!VSP1.0", 8))
146 {
147 if (vpinit == 0 )
148 {
149 if(! glh_init_extensions("GL_NV_vertex_program"))
150 {
151 errors.set("unable to initialize GL_NV_vertex_program");
152 free(instring);
153 return;
154 }
155 else
156 {
157 vpinit = 1;
158 }
159 }
160
161 errors.reset();
162 line_number = 1;
163
164 va_list ap;
165 va_start(ap, input_string);
166 int vpsid = va_arg(ap,int);
167 va_end(ap);
168
169 if ( glGetError() != GL_NO_ERROR )
170 {
171 errors.set( "Previous GL_ERROR prior to vertex state program parsing." );
172 }
173
174 LoadProgram( GL_VERTEX_STATE_PROGRAM_NV, vpsid, instring );
175 }
176 */
177