/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright 1997-2002, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Kernel: file.c * * %Identification * Written by: K.N. * Date: Sep 25, 1998 * Origin: Risoe * Release: McStas 1.6 * Version: 1.3 * * Code to handle files and command line arguments. * * $Id: file.c,v 1.17 2005/03/02 10:07:23 farhi Exp $ * * $Log: file.c,v $ * Revision 1.17 2005/03/02 10:07:23 farhi * Now displays info/warning when using contributed components * * Revision 1.16 2004/09/10 15:09:56 farhi * Use same macro symbols for mcstas kernel and run-time for code uniformity * * Revision 1.15 2003/02/11 12:28:45 farhi * Variouxs bug fixes after tests in the lib directory * mcstas_r : disable output with --no-out.. flag. Fix 1D McStas output * read_table:corrected MC_SYS_DIR -> MCSTAS define * monitor_nd-lib: fix Log(signal) log(coord) * HOPG.trm: reduce 4000 points -> 400 which is enough and faster to resample * Progress_bar: precent -> percent parameter * CS: ---------------------------------------------------------------------- * * Revision 1.3 2000/02/15 07:40:59 kn * Also search for components in a fixed list of system dir subdirectories. * * Revision 1.2 1998/10/02 08:36:21 kn * Fixed header comment. * * Revision 1.1 1998/10/01 08:13:41 kn * Initial revision * *******************************************************************************/ #include #include #include "mcstas.h" static List search_list = NULL; /* MOD: E. Farhi, Oct 2nd, 2001: add obsolete dir. Aug 27th, 2002: added share+contrib */ static char *sys_subdir_table[] = { "samples", "monitors", "sources", "optics", "misc" , "obsolete", "contrib", "share" }; /* Attempt to open FILE in directory DIR (or current directory if DIR is NULL). */ static FILE * try_open_file(char *dir, char *name) { char *path = dir != NULL ? str_cat (dir, MC_PATHSEP_S, name, NULL) : str_dup(name); FILE *f = fopen(path, "r"); str_free(path); return f; } /* This variable stores the full path for the definition of a component as found by the function try_open_component() (called from open_component_search()). */ char *component_pathname; static FILE * try_open_component(char *dir, char *name) { static char *suffixes[] = {".comp", ".cmp", ".com"}; int i; for(i = 0; i < sizeof(suffixes)/sizeof(*suffixes); i++) { char *path = dir != NULL ? str_cat (dir, MC_PATHSEP_S, name, suffixes[i], NULL) : str_cat(name, suffixes[i], NULL); FILE *f = fopen(path, "r"); if(f != NULL) { component_pathname = path; return f; } else str_free(path); } return NULL; } char * get_sys_dir(void) { static char *sys_dir = NULL; if(sys_dir == NULL) { sys_dir = getenv("MCSTAS"); if(sys_dir == NULL) sys_dir = MCSTAS; sys_dir = str_dup(sys_dir); } return sys_dir; } /* Generic file search function. */ static FILE * generic_open_file_search(char *name, FILE *(*try_open)(char *, char *)) { List_handle liter; char *dir; FILE *f; int i; f = (*try_open)(NULL, name); if(f != NULL) return f; if(search_list != NULL) { liter = list_iterate(search_list); while(dir = list_next(liter)) { f = (*try_open)(dir, name); if(f != NULL) return f; } } /* Now look in the system directory. */ f = (*try_open)(get_sys_dir(), name); if(f != NULL) return f; /* Finally look in the fixed list of system subdirectories. */ for(i = 0; i < sizeof(sys_subdir_table)/sizeof(char *); i++) { dir = str_cat(get_sys_dir(), MC_PATHSEP_S, sys_subdir_table[i], NULL); f = (*try_open)(dir, name); str_free(dir); if(f != NULL) { if (!strcmp(sys_subdir_table[i], "obsolete")) fprintf(stderr, "Warning: '%s' is an obsolete component (not maintained).\n", name); if (!strcmp(sys_subdir_table[i], "contrib")) fprintf(stderr, "Info : '%s' is a contributed component.\n", name); return f; } } /* Not found. */ return NULL; } /* Open file, searching the full search path. */ FILE * open_file_search(char *name) { return generic_open_file_search(name, try_open_file); } /* Open component definition, searching the full search path. */ FILE * open_component_search(char *name) { return generic_open_file_search(name, try_open_component); } /* Open file, searching only the system directory. */ FILE * open_file_search_sys(char *name) { return try_open_file(get_sys_dir(), name); } /* Add a directory to the search path. */ void add_search_dir(char *name) { if(search_list == NULL) search_list = list_create(); list_add(search_list, name); }