void line_source(unsigned int line, std::ostream& o)
{
- char * fnamebuf;
- char * token;
-
if (iFlag)
{
return;
}
+
o << "#line " << line << " \"";
- if( fileName != NULL ) {
- fnamebuf = strdup( fileName );
- } else {
- fnamebuf = strdup( "<stdin>" );
+
+ if (fileName == NULL)
+ {
+ o << "<stdin>";
}
- token = strtok( fnamebuf, "\\" );
- for(;;) {
- o << token;
- token = strtok( NULL, "\\" );
- if( token == NULL ) break;
- o << "\\\\";
+
+ std::string fname(fileName);
+
+ for (size_t p = 0; p < fname.length(); ++p)
+ {
+ if (fname[p] == '\\')
+ {
+ fname.insert(++p, "\\");
+ }
}
- o << "\"\n";
+ o << fname << "\"\n";
++oline;
- free( fnamebuf );
}
void parse(std::istream& i, std::ostream &o){
{
extern const char *fileName;
-extern char *outputFileName;
+extern const char *outputFileName;
extern bool bFlag;
extern bool dFlag;
extern bool eFlag;
{
const char *fileName = 0;
-char *outputFileName = 0;
+const char *outputFileName = 0;
bool bFlag = false;
bool dFlag = false;
bool eFlag = false;
return 2;
case 'V': {
- int v1, v2, v3;
- char version[16];
- sscanf(PACKAGE_VERSION, "%d.%d.%d", &v1, &v2, &v3);
- sprintf(version, "%02d%02d%02d", v1, v2, v3);
- cout << version << "\n";
+ string vernum(PACKAGE_VERSION);
+
+ if (vernum[1] == '.')
+ {
+ vernum.insert(0, "0");
+ }
+ vernum.erase(2, 1);
+ if (vernum[3] == '.')
+ {
+ vernum.insert(2, "0");
+ }
+ vernum.erase(4, 1);
+ if (vernum.length() < 6 || vernum[5] < '0' || vernum[5] > '9')
+ {
+ vernum.insert(4, "0");
+ }
+ vernum.resize(6);
+ cout << vernum << endl;
return 2;
}
if (outputFileName == 0 || (fileName[0] == '-' && fileName[1] == '\0'))
{
- outputFileName = strdup("<stdout>");
+ outputFileName = "<stdout>";
output = &cout;
}
else
output = &outputFile;
int len = strlen(outputFileName);
- char *src, *dst, *tmp = (char*)malloc((len+1)*2);
+ char *tmp = (char*)malloc((len+1)*2);
+ char *dst = tmp;
- for (src = outputFileName, dst = tmp; *src; ++src)
+ for (const char *src = outputFileName; *src; ++src)
{
if (*src == '\\')
{
}
parse(*input, *output);
- free(outputFileName);
return 0;
}
void line_source(unsigned int line, std::ostream& o)
{
- char * fnamebuf;
- char * token;
-
if (iFlag)
{
return;
}
+
o << "#line " << line << " \"";
- if( fileName != NULL ) {
- fnamebuf = strdup( fileName );
- } else {
- fnamebuf = strdup( "<stdin>" );
+
+ if (fileName == NULL)
+ {
+ o << "<stdin>";
}
- token = strtok( fnamebuf, "\\" );
- for(;;) {
- o << token;
- token = strtok( NULL, "\\" );
- if( token == NULL ) break;
- o << "\\\\";
+
+ std::string fname(fileName);
+
+ for (size_t p = 0; p < fname.length(); ++p)
+ {
+ if (fname[p] == '\\')
+ {
+ fname.insert(++p, "\\");
+ }
}
- o << "\"\n";
+ o << fname << "\"\n";
++oline;
- free( fnamebuf );
}
void parse(std::istream& i, std::ostream &o){