Pol  Revision:cb584c9
compctx.cpp
Go to the documentation of this file.
1 
7 #include "compctx.h"
8 
9 #include <cstring>
10 #include <ctype.h>
11 
12 #include <format/format.h>
13 
14 namespace Pol
15 {
16 namespace Bscript
17 {
18 namespace
19 {
23 int eatToEndOfLine( CompilerContext& ctx )
24 {
25  const char* t = ctx.s;
26 
27  while ( *t && ( *t != '\r' ) && ( *t != '\n' ) )
28  t++;
29 
30  ctx.s = t;
31  return 0;
32 }
33 
39 int eatToCommentEnd( CompilerContext& ctx )
40 {
41  CompilerContext tmp( ctx );
42 
43  while ( tmp.s[0] )
44  {
45  if ( strncmp( tmp.s, "*/", 2 ) == 0 )
46  {
47  tmp.s += 2;
48  ctx = tmp;
49  return 0;
50  }
51  else if ( strncmp( tmp.s, "/*", 2 ) == 0 ) // nested comment
52  {
53  tmp.s += 2;
54  int res = eatToCommentEnd( tmp );
55  if ( res )
56  return res;
57  }
58  else if ( strncmp( tmp.s, "//", 2 ) == 0 ) // nested eol-comment
59  {
60  int res = eatToEndOfLine( tmp );
61  if ( res )
62  return res;
63  }
64  if ( tmp.s[0] == '\n' )
65  ++tmp.line;
66  tmp.s++;
67  }
68  return -1;
69 }
70 } // namespace
71 
73  : s( NULL ), line( 1 ), filename( "" ), s_begin( NULL ), dbg_filenum( 0 )
74 {
75 }
76 
77 CompilerContext::CompilerContext( const std::string& filename, int dbg_filenum, const char* s )
78  : s( s ), line( 1 ), filename( filename ), s_begin( s ), dbg_filenum( dbg_filenum )
79 {
80 }
81 
83 
84 
85 = default;
86 
88 = default;
89 
94 {
95  while ( isspace( s[0] ) )
96  {
97  if ( s[0] == '\n' )
98  ++line;
99  s++;
100  }
101 }
102 
104 {
105  CompilerContext tctx( *this );
106  for ( ;; )
107  {
108  while ( tctx.s[0] && isspace( tctx.s[0] ) )
109  {
110  // FIXME: if (tctx.s[0] == '\t')
111  // FIXME: contains_tabs = true;
112  if ( tctx.s[0] == '\n' )
113  ++tctx.line;
114  tctx.s++; // wow neat, already take care of newlines
115  }
116 
117  if ( !tctx.s[0] )
118  {
119  ( *this ) = tctx;
120  return 1;
121  }
122 
123  // look for comments
124  if ( strncmp( tctx.s, "/*", 2 ) == 0 ) // got a start of comment
125  {
126  int res;
127  tctx.s += 2;
128  res = eatToCommentEnd( tctx );
129  if ( res )
130  return res;
131  }
132  else if ( strncmp( tctx.s, "//", 2 ) == 0 ) // comment, one line only
133  {
134  int res;
135  res = eatToEndOfLine( tctx );
136  if ( res )
137  return res;
138  }
139  else
140  {
141  break;
142  }
143  }
144 
145  ( *this ) = tctx;
146 
147  return 0;
148 }
149 
150 void CompilerContext::printOn( std::ostream& os ) const
151 {
152  os << "File: " << filename << ", Line " << line << std::endl;
153 }
154 
155 void CompilerContext::printOn( fmt::Writer& writer ) const
156 {
157  writer << "File: " << filename << ", Line " << line << "\n";
158 }
159 
160 void CompilerContext::printOnShort( std::ostream& os ) const
161 {
162  os << filename << ", Line " << line << std::endl;
163 }
164 
165 void CompilerContext::printOnShort( fmt::Writer& writer ) const
166 {
167  writer << filename << ", Line " << line << "\n";
168 }
169 }
170 }
void printOn(std::ostream &os) const
Definition: compctx.cpp:150
CompilerContext & operator=(const CompilerContext &)
void printOnShort(std::ostream &os) const
Definition: compctx.cpp:160
Definition: berror.cpp:12