/// Process a "path:" scheme use command. bool use_path(ast_t* use, const char* locator, ast_t* name, pass_opt_t* options) { (void)name; const char* libpath = quoted_locator(options, use, locator); if(libpath == NULL) return false; ast_t* p = ast_nearest(use, TK_PROGRAM); program_t* prog = (program_t*)ast_data(p); pony_assert(prog->lib_args == NULL); // Not yet built args if(strlist_find(prog->libpaths, libpath) != NULL) // Ignore duplicate return true; prog->libpaths = strlist_append(prog->libpaths, libpath); return true; }
void program_lib_build_args(ast_t* program, const char* path_preamble, const char* global_preamble, const char* global_postamble, const char* lib_premable, const char* lib_postamble) { assert(program != NULL); assert(ast_id(program) == TK_PROGRAM); assert(global_preamble != NULL); assert(global_postamble != NULL); assert(lib_premable != NULL); assert(lib_postamble != NULL); program_t* data = (program_t*)ast_data(program); assert(data != NULL); assert(data->lib_args == NULL); // Not yet built args // Start with an arbitrary amount of space data->lib_args_alloced = 256; data->lib_args = (char*)malloc(data->lib_args_alloced); data->lib_args[0] = '\0'; data->lib_args_size = 0; // Library paths defined in the source code. for(strlist_t* p = data->libpaths; p != NULL; p = strlist_next(p)) { const char* libpath = strlist_data(p); append_to_args(data, path_preamble); append_to_args(data, libpath); append_to_args(data, " "); } // Library paths from the command line and environment variable. for(strlist_t* p = package_paths(); p != NULL; p = strlist_next(p)) { const char* libpath = quoted_locator(NULL, strlist_data(p)); if(libpath == NULL) continue; append_to_args(data, path_preamble); append_to_args(data, libpath); append_to_args(data, " "); } // Library names. append_to_args(data, global_preamble); for(strlist_t* p = data->libs; p != NULL; p = strlist_next(p)) { const char* lib = strlist_data(p); bool amble = !is_path_absolute(lib); if(amble) append_to_args(data, lib_premable); append_to_args(data, lib); if(amble) append_to_args(data, lib_postamble); append_to_args(data, " "); } append_to_args(data, global_postamble); }