ultimatepp/uppsrc/docpp/Pre.cpp
mdelfede d2b54f7989 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

95 lines
1.7 KiB
C++

#include "docpp.h"
String SSpaces(const char *txt)
{
String r;
while(*txt)
if(*txt == ' ') {
while((byte)*txt <= ' ' && *txt) txt++;
r.Cat(' ');
}
else
r.Cat(*txt++);
return r;
}
void SLPos(SrcFile& res)
{
res.linepos.Add(res.text.GetLength());
}
SrcFile PreProcess(Stream& in)
{
SrcFile res;
bool include = true;
while(!in.IsEof()) {
String ln = in.GetLine();
SLPos(res);
while(*ln.Last() == '\\') {
ln.Trim(ln.GetLength() - 1);
ln.Cat(in.GetLine());
SLPos(res);
}
const char *rm = ln;
while(*rm == ' ' || *rm == '\t') rm++;
if(*rm == '#') {
if(rm[1] == 'd' && rm[2] == 'e' && rm[3] == 'f' &&
rm[4] == 'i' && rm[5] == 'n' && rm[6] == 'e' && !iscid(rm[7])) {
const char *s = rm + 8;
while(*s == ' ') s++;
String macro;
while(iscid(*s))
macro.Cat(*s++);
if(*s == '(') {
while(*s != ')' && *s)
macro.Cat(*s++);
macro << ')';
}
res.text << '#' << AsCString(SSpaces(macro));
}
}
else {
String cmd;
while(*rm) {
if(rm[0] == '/' && rm[1] == '/') {
cmd = rm + 2;
break;
}
if(rm[0] == '/' && rm[1] == '*') {
rm += 2;
for(;;) {
if(*rm == '\0') {
if(in.IsEof()) break;
SLPos(res);
ln = in.GetLine();
rm = ~ln;
}
if(rm[0] == '*' && rm[1] == '/') {
rm += 2;
break;
}
rm++;
}
if(include)
res.text.Cat(' ');
}
else {
if(include)
res.text.Cat(*rm);
rm++;
}
}
if(include)
res.text << ' ';
if(cmd[0] == '$') {
if(cmd[1] == '-') include = false;
if(cmd[1] == '+') include = true;
if(cmd[1]) {
res.text.Cat(~cmd + 2);
res.text.Cat(' ');
}
}
}
}
return res;
}