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