sBool Document::OutputMake() { sBool ok = 1; for(auto sol : Solutions) { sChangeDir(sol->Path); for(auto pro : sol->Projects) if(!OutputMake(pro)) ok = 0; } return ok; }
void TypeDependenceChecker::OutputDependences() { SymbolSet new_file_set; unsigned i; for (i = 0; i < type_list.Length(); i++) { TypeSymbol* type = type_list[i]; type -> parents_closure = new SymbolSet; FileSymbol* file_symbol = type -> file_symbol; if (file_symbol && (! file_symbol -> IsZip())) new_file_set.AddElement(file_symbol); } for (i = 0; i < type_list.Length(); i++) { TypeSymbol* parent = type_list[i]; TypeSymbol* dependent; for (dependent = (TypeSymbol*) parent -> dependents_closure -> FirstElement(); dependent; dependent = (TypeSymbol*) parent -> dependents_closure -> NextElement()) { dependent -> parents_closure -> AddElement(parent); } } for (FileSymbol* symbol = (FileSymbol*) new_file_set.FirstElement(); symbol; symbol = (FileSymbol*) new_file_set.NextElement()) { OutputMake(symbol); } for (i = 0; i < type_list.Length(); i++) { TypeSymbol* type = type_list[i]; delete type -> parents_closure; type -> parents_closure = NULL; } }
void TypeDependenceChecker::OutputMake(FileSymbol* file_symbol) { // // // const char* name; char* buf = NULL; int length; if (control -> option.directory == NULL) { name = file_symbol -> FileName(); length = file_symbol -> FileNameLength() - (file_symbol -> IsJava() ? FileSymbol::java_suffix_length : FileSymbol::class_suffix_length); } else { name = file_symbol -> Utf8Name(); length = strlen(name); DirectorySymbol* dir_symbol = file_symbol -> OutputDirectory(); char* dir_name = dir_symbol -> DirectoryName(); int dir_length = strlen(dir_name); buf = new char[length + FileSymbol::class_suffix_length + dir_length + 2]; strcpy(buf, dir_name); #ifdef UNIX_FILE_SYSTEM buf[dir_length] = (char)U_SLASH; #elif defined(WIN32_FILE_SYSTEM) buf[dir_length] = (char)U_BACKSLASH; #endif strcpy(&buf[dir_length+1], name); name = buf; length = dir_length + 1 + length; } char* output_name = new char[length + FileSymbol::class_suffix_length + 1]; char* u_name = new char[length + strlen(StringConstant::U8S_DO_u) + 1]; strncpy(output_name, name, length); strncpy(u_name, name, length); strcpy(&output_name[length], FileSymbol::class_suffix); strcpy(&u_name[length], StringConstant::U8S_DO_u); // // // SymbolSet file_set; for (unsigned i = 0; i < file_symbol -> types.Length(); i++) { TypeSymbol* type = file_symbol -> types[i]; TypeSymbol* parent; for (parent = (TypeSymbol*) type -> parents_closure -> FirstElement(); parent; parent = (TypeSymbol*) type -> parents_closure -> NextElement()) { FileSymbol* symbol = parent -> file_symbol; if (symbol && (! symbol -> IsZip())) file_set.AddElement(symbol); } } file_set.RemoveElement(file_symbol); // // // Tuple<FileSymbol*> file_list(file_set.Size()); file_list.Next() = file_symbol; for (FileSymbol* symbol = (FileSymbol*) file_set.FirstElement(); symbol; symbol = (FileSymbol*) file_set.NextElement()) file_list.Next() = symbol; FILE* outfile = SystemFopen(u_name, "w"); if (outfile == NULL) Coutput << "*** Cannot open output Makefile " << u_name << endl; else { OutputMake(outfile, output_name, file_list); fclose(outfile); } delete [] output_name; delete [] u_name; if (control -> option.directory) delete [] buf; }