在字符串中查找制表符和/或空格分隔的单词(makefile中目标的依赖性)

时间:2018-09-30 02:55:17

标签: c data-structures makefile text-files

我想用C编写一个程序,该程序在makefile中占一行,并以几种方式对其进行处理:

  1. 如果该行包含冒号,则假定它是目标行,并且在冒号之前存在目标名称。
  2. 在目标行上,我们将目标存储为以空值结尾的字符串形式的 targetName
  3. 然后在目标行上,在冒号之后的目标行中查找所有依赖项。冒号后,依赖关系之间或行尾可能出现零个或多个空格字符(空格和制表符),但我们仅对以下字符串感兴趣: 一种。识别磁盘上的现有文件, b。确定其他目标,或者 C。识别基于Web的URL。

要从makefile处理的行可能看起来像这样:

calcmarks.o : calcmarks.c calcmarks.h    globals.o

calcmarks.o是目标的名称,calcmarks.ccalcmarks.hglobals.o都是依赖项的名称,前两个是磁盘上的文件,最终依赖性是另一个目标。我们将calcmarks.o存储在变量 targetName 中,然后选择合适的数据结构来存储其他依赖项。我想以某种方式存储依赖项的名称,这样我以后可以方便地检查任何依赖项的修改日期,并将其与目标的修改日期进行比较,以查看该依赖项是否比最近修改了。目标。

这是到目前为止我能想到的代码。本质上,此函数采用文件指针和要重建的目标,并最终将其重建。

// filePtr is the text file pointer after going through processVariables
// Target is the name of the target isolated from the command line interface (requested by user)
void processTarget (FILE* filePtr , char target[]) {
    // Holds line by line
    char buffer[1000];

    // Holds name of target with no whitespace
    char targetName[1000];

    // Boolean to check if the target was indeed found
    bool targetFound = false;

    while (fgets(buffer , sizeof(buffer) , filePtr) != NULL) {
        int i;
        for (i = 0; buffer[i] != '\0'; i++) {
            // Copying a potential target name until we find a colon
            if (buffer[i] == ':') {
                // Don't copy the colon, so terminate the string
                targetName[i] = '\0';
                targetFound = true;
                break;
            }
            targetName[i] = buffer[i];
        }
        // If the previous loop encountered a target name via the existance of a semicolon
        if (targetFound) {
            // If the target name is the same as the required target
            if (target == targetName) {
                // Test for 0 dependencies
                if (buffer[i + 1] == '\0') continue; // End of string

                int j;
                for (j = i + 1; j != '\0'; j++) {
                    // Processing the line after the colon
                }
            }
        }
    }
}

还请注意,依赖项的数量是可变的。因此,如果我要初始化一个结构来存储它们的名称,我将不知道size参数。

如何在冒号后搜索依赖项,忽略空格,并将依赖项的名称存储在数据结构中?


编辑:感谢@JonathanLeffler的澄清:除基于Web的URL外,此项目必须识别的依赖项不会比下面提供的行难得多。

0 个答案:

没有答案