1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
// deptool.c
// Copyright (C) 2002 by Brian Palmer <brianp@sginet.com>
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERROR_SUCCESS                0
#define    ERROR_NOTENOUGHPARAMS        1
#define ERROR_DEPENDFILENOTFOUND    2
#define    ERROR_OUTOFMEMORY            3
#define ERROR_READERROR                4
#define ERROR_WRITEERROR            5

int main(int argc, char *argv[])
{
    FILE*    DependFile;
    int        DependFileSize;
    char*    DependFileData;
    char*    NewDependFileData;
    int        CurIdx;
    int        CurIdx2;
    int        RuleDependencySplit = 0;

    // Make sure they passed enough command line parameters
    if (argc < 2)
    {
        printf("Usage: deptool srcfile.d\n");
        return ERROR_NOTENOUGHPARAMS;
    }

    // Try to open the dependency file
    DependFile = fopen(argv[1], "r+t");
    if (DependFile == NULL)
    {
        printf("deptool: No such dependency file: %s\n", argv[1]);
        return ERROR_DEPENDFILENOTFOUND;
    }

    // Get the file size
    fseek(DependFile, 0, SEEK_END);
    DependFileSize = ftell(DependFile);
    rewind(DependFile);

    // Allocate memory
    DependFileData = (char *)malloc(DependFileSize);
    NewDependFileData = (char *)malloc(DependFileSize * 3);
    if (!DependFileData || !NewDependFileData)
    {
        printf("deptool: Out of memory!\n");
        if (DependFileData != NULL)
            free(DependFileData);
        if (NewDependFileData != NULL)
            free(NewDependFileData);
        fclose(DependFile);
        return ERROR_OUTOFMEMORY;
    }
    memset(DependFileData, 0, DependFileSize);
    memset(NewDependFileData, 0, DependFileSize * 3);

    // Read in file data
    fread(DependFileData, 1, DependFileSize, DependFile);
    if (ferror(DependFile))
    {
        printf("deptool: Dependency file read error.\n");
        free(DependFileData);
        free(NewDependFileData);
        fclose(DependFile);
        return ERROR_READERROR;
    }

    // Loop through the dependency file data and
    // insert the rule for the dependency file itself
    for (CurIdx=0,CurIdx2=0; DependFileData[CurIdx]; CurIdx++,CurIdx2++)
    {
        // Find the first colon ':' in the file and insert
        // the rule right before it
        if (DependFileData[CurIdx] == ':')
        {
            NewDependFileData[CurIdx2] = ' ';
            CurIdx2++;
            strcat(&NewDependFileData[CurIdx2], argv[1]);
            CurIdx2 += strlen(argv[1]);
            NewDependFileData[CurIdx2] = ' ';
            CurIdx2++;
            strcat(NewDependFileData, &DependFileData[CurIdx]);
            CurIdx2 += 2;<--- CurIdx2 is assigned
            RuleDependencySplit = CurIdx + 2;
            break;
        }
        else
        {
            NewDependFileData[CurIdx2] = DependFileData[CurIdx];
        }
    }

    // Now loop through all the rule dependencies and
    // turn them into rules themselves
    strcat(NewDependFileData, "\n\n");
    CurIdx = RuleDependencySplit;
    CurIdx2 = strlen(NewDependFileData);<--- CurIdx2 is overwritten
    for (; DependFileData[CurIdx]; CurIdx++,CurIdx2++)
    {
        // If it's a line continuation char '\' then skip over it
        if (DependFileData[CurIdx] == '\\')
        {
            CurIdx2--;
            continue;
        }

        // If it's a new line char '\n' then insert a colon ':' to make it a rule
        if (DependFileData[CurIdx] == '\n')
        {
            NewDependFileData[CurIdx2] = ':';
            CurIdx2++;
        }

        NewDependFileData[CurIdx2] = DependFileData[CurIdx];
    }

    // Write out file data
    rewind(DependFile);
    fwrite(NewDependFileData, 1, strlen(NewDependFileData), DependFile);
    if (ferror(DependFile))
    {
        printf("deptool: Dependency file write error.\n");
        fclose(DependFile);
        free(DependFileData);
        free(NewDependFileData);
        return ERROR_WRITEERROR;
    }

    fclose(DependFile);
    free(DependFileData);
    free(NewDependFileData);
    return ERROR_SUCCESS;
}