History

the only constant is change.

Ge Wang committed 9 years ago

Commit 009ac191 parent b1e2669181 files · +0 −3911Browse files

Showing the changes to src/core/chuck_parse.cpp (1 of 181 files). Show all

Unified · Split

src/core/chuck_parse.cpp+230−0
@@ -0,0 +1,230 @@
1/*----------------------------------------------------------------------------
2 ChucK Concurrent, On-the-fly Audio Programming Language
3 Compiler and Virtual Machine
4
5 Copyright (c) 2004 Ge Wang and Perry R. Cook. All rights reserved.
6 http://chuck.stanford.edu/
7 http://chuck.cs.princeton.edu/
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22 U.S.A.
23-----------------------------------------------------------------------------*/
24
25//-----------------------------------------------------------------------------
26// file: chuck_parse.cpp
27// desc: chuck parser interface (using flex and bison)
28//
29// author: Ge Wang (ge@ccrma.stanford.edu | gewang@cs.princeton.edu)
30// date: Autumn 2002 - original in chuck_main.cpp
31// Autumn 2005 - this file
32//-----------------------------------------------------------------------------
33#include "chuck_parse.h"
34#include "chuck_errmsg.h"
35#include <string.h>
36using namespace std;
37
38
39// global
40static char g_filename[1024] = "";
41
42// external
43extern "C" {
44 extern FILE *yyin;
45}
46
47
48
49
50//-----------------------------------------------------------------------------
51// name: open_cat_ck()
52// desc: ...
53//-----------------------------------------------------------------------------
54FILE * open_cat_ck( c_str fname )
55{
56 FILE * fd = NULL;
57 if( !(fd = fopen( fname, "rb" )) )
58 if( !strstr( fname, ".ck" ) && !strstr( fname, ".CK" ) )
59 {
60 strcat( fname, ".ck" );
61 fd = fopen( fname, "rb" );
62 }
63 return fd;
64}
65
66
67
68//-----------------------------------------------------------------------------
69// name: win32_tmpfile()
70// desc: replacement for broken tmpfile() on Windows Vista + 7
71//-----------------------------------------------------------------------------
72#ifdef __PLATFORM_WIN32__
73
74#include <windows.h>
75
76FILE *win32_tmpfile()
77{
78 char tmp_path[MAX_PATH];
79 char file_path[MAX_PATH];
80 FILE * file = NULL;
81
82 if(GetTempPath(256, tmp_path) == 0)
83 return NULL;
84
85 if(GetTempFileName(tmp_path, "mA", 0, file_path) == 0)
86 return NULL;
87
88 file = fopen(file_path, "wb+D");
89
90 return file;
91}
92
93#endif
94
95
96
97//-----------------------------------------------------------------------------
98// name: chuck_parse()
99// desc: ...
100//-----------------------------------------------------------------------------
101t_CKBOOL chuck_parse( c_constr fname, FILE * fd, c_constr code )
102{
103 t_CKBOOL clo = FALSE;
104 t_CKBOOL ret = FALSE;
105
106 // sanity check
107 if( fd && code )
108 {
109 CK_FPRINTF_STDERR( "[chuck](via parser): (internal) both fd and code specified!\n" );
110 return FALSE;
111 }
112
113 // prepare code
114 if( code )
115 {
116 // !
117 assert( fd == NULL );
118 // generate temp file
119#ifdef __PLATFORM_WIN32__
120 fd = win32_tmpfile();
121#else
122 fd = tmpfile();
123#endif
124 // flag it to close
125 clo = TRUE;
126 // write
127 fwrite( code, sizeof(char), strlen(code), fd );
128 }
129
130 /*
131 // use code from memory buffer if its available
132 if( code )
133 {
134 // copy name
135 strcpy( g_filename, fname );
136 // reset
137 if( EM_reset( g_filename, NULL ) == FALSE ) goto cleanup;
138
139 // TODO: clean g_program
140 g_program = NULL;
141
142 // clean
143 yyrestart( NULL );
144
145 // load string (yy_scan_string will copy the C string)
146 YY_BUFFER_STATE ybs = yy_scan_string( code );
147 if( !ybs ) goto cleanup;
148
149 // parse
150 if( !( yyparse() == 0 ) ) goto cleanup;
151
152 // delete the lexer buffer
153 yy_delete_buffer( ybs );
154
155 }
156 */
157
158 // remember filename
159 strcpy( g_filename, fname );
160
161 // test it
162 if( !fd ) {
163 fd = open_cat_ck( g_filename );
164 if( !fd ) strcpy( g_filename, fname );
165 else clo = TRUE;
166 }
167
168 // reset
169 if( EM_reset( g_filename, fd ) == FALSE ) goto cleanup;
170
171 // lexer/parser
172 // TODO: if( yyin ) { fclose( yyin ); yyin = NULL; }
173
174 // if no fd, open
175 if( !fd ) { fd = fopen( g_filename, "r" ); if( fd ) clo = TRUE; }
176 // if still none
177 if( !fd ) { EM_error2( 0, "no such file or directory" ); goto cleanup; }
178 // set to beginning
179 else fseek( fd, 0, SEEK_SET );
180
181 // reset yyin to fd
182 yyrestart( fd );
183
184 // check
185 if( yyin == NULL ) goto cleanup;
186
187 // TODO: clean g_program
188 g_program = NULL;
189
190 // parse
191 if( !(yyparse( ) == 0) ) goto cleanup;
192
193 // flag success
194 ret = TRUE;
195
196cleanup:
197
198 // done
199 if( clo ) fclose( fd );
200
201 return ret;
202}
203
204
205
206
207//------------------------------------------------------------------------------
208// name: reset_parse()
209// desc: ...
210//------------------------------------------------------------------------------
211void reset_parse( )
212{
213 // empty file name
214 EM_change_file( NULL );
215}
216
217
218
219
220//-----------------------------------------------------------------------------
221// name: parseLine()
222// desc: ...
223//-----------------------------------------------------------------------------
224t_CKBOOL SyntaxQuery::parseLine( const std::string & line, SyntaxTokenList & tokens )
225{
226 // clear the token list
227 tokens.howmany = 0;
228
229 return TRUE;
230}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t