Constructing a suitable gitignore file for a simple inweb project.

§1. This is an extremely simple use of Preprocessor (in foundation).

void Git::write_gitignore(web *W, filename *prototype, filename *F) {
    linked_list *L = NEW_LINKED_LIST(preprocessor_macro);
    Preprocessor::new_macro(L, I"basics", NULL, Git::basics_expander, NULL);
    text_stream *header = Str::new();
    WRITE_TO(header, "# This gitignore was automatically written by inweb -gitignore\n");
    WRITE_TO(header, "# and is not intended for human editing\n\n");
    WRITE_TO(STDOUT, "(Read script from %f)\n", prototype);
    Preprocessor::preprocess(prototype, F, header, L, NULL_GENERAL_POINTER, '#', ISO_ENC);
}

§2. Our one non-standard macro simply includes a file of standing material which is the same as the default .giscript file anyway:

void Git::basics_expander(preprocessor_macro *mm, preprocessor_state *PPS,
    text_stream **parameter_values, preprocessor_loop *loop, text_file_position *tfp) {
    filename *prototype = Filenames::in(path_to_inweb_materials, I"default.giscript");
    TextFiles::read(prototype, FALSE, "can't open basic .gitignore file",
        TRUE, Preprocessor::scan_line, NULL, PPS);
    WRITE_TO(STDOUT, "(Read basics.giscript from inweb/");
    Pathnames::to_text_relative(STDOUT, path_to_inweb, path_to_inweb_materials);
    WRITE_TO(STDOUT, ")\n");
}