Subversion Repositories FixDeps

Rev

Rev 24 | Rev 33 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

// This file is part of !FixDeps.
// Copyright © 2003-2005 Graham Shaw.
// Distribution and use are subject to the GNU General Public License,
// a copy of which may be found in the file !FixDeps.Copyright.

#include <string>
#include <iostream>

#include "limits.h"
#include "unixlib/local.h"

string translate(string filename)
{
        char buffer[PATH_MAX];
        int filetype=0xfff;
        __riscosify_std(filename.c_str(),1,buffer,sizeof(buffer),&filetype);
        filename=buffer;
        string::size_type i=filename.find(':');
        while (i!=string::npos)
        {
                filename.replace(i,1,"<58>");
                i=filename.find(':',i);
        }
        return filename;
}

int main(int argc,const char* argv[])
{
        if (argc<2)
        {
                cerr << "fixdeps (version 0.1.0)" << endl;
                cerr << "usage: fixdeps <stem>" << endl;
                return 0;
        }
        string stem(argv[1]);
        string objfile=stem+string(".o");
        string depfile=stem+string(".d");
        string target_ro=string("o.")+stem+string(":");
        string target_ux=stem+string(".o")+string(":");

        bool in_rule=false;
        while (cin)
        {
                string line;
                getline(cin,line);
                string::size_type length=line.length();
                while (length&&isspace(line[length-1])) --length;
                bool cont=(length&&(line[length-1]=='\\'));
                if (cont) --length;
                line.resize(length);

                if (!in_rule)
                {
                        if (line.substr(0,target_ro.length())==target_ro)
                        {
                                cout << objfile << " " << depfile << ":";
                                line.erase(0,target_ro.length());
                                in_rule=true;
                        }
                        else if (line.substr(0,target_ux.length())==target_ux)
                        {
                                cout << objfile << " " << depfile << ":";
                                line.erase(0,target_ux.length());
                                in_rule=true;
                        }
                }

                if (in_rule)
                {
                        unsigned int i=0;
                        while ((i!=line.length())&&(isspace(line[i]))) ++i;
                        while (i!=line.length())
                        {
                                unsigned int j=i;
                                while ((i!=line.length())&&(!isspace(line[i]))) ++i;
                                cout << " " << translate(line.substr(j,i-j));
                                while ((i!=line.length())&&(isspace(line[i]))) ++i;
                        }
                }
                else
                {
                        cout << line;
                }

                if (cont)
                {
                        cout << " \\";
                }
                else
                {
                        in_rule=false;
                }

                cout << endl;
        }
        return 0;
}