diff options
Diffstat (limited to 'cut-n-paste/synctex/synctex_parser_utils.c')
-rw-r--r-- | cut-n-paste/synctex/synctex_parser_utils.c | 217 |
1 files changed, 117 insertions, 100 deletions
diff --git a/cut-n-paste/synctex/synctex_parser_utils.c b/cut-n-paste/synctex/synctex_parser_utils.c index e21cfa90..d9f65038 100644 --- a/cut-n-paste/synctex/synctex_parser_utils.c +++ b/cut-n-paste/synctex/synctex_parser_utils.c @@ -1,11 +1,12 @@ /* -Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009, 2010 , 2011 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. -Latest Revision: Wed Nov 4 11:52:35 UTC 2009 +Latest Revision: Tue Jun 14 08:23:30 UTC 2011 + +Version: 1.16 -Version: 1.9 See synctex_parser_readme.txt for more details License: @@ -140,8 +141,22 @@ void _synctex_strip_last_path_extension(char * string) { } } +const char * synctex_ignore_leading_dot_slash(const char * name) +{ + while(SYNCTEX_IS_DOT(*name) && SYNCTEX_IS_PATH_SEPARATOR(name[1])) { + name += 2; + while (SYNCTEX_IS_PATH_SEPARATOR(*name)) { + ++name; + } + } + return name; +} + /* Compare two file names, windows is sometimes case insensitive... */ synctex_bool_t _synctex_is_equivalent_file_name(const char *lhs, const char *rhs) { + /* Remove the leading regex '(\./+)*' in both rhs and lhs */ + lhs = synctex_ignore_leading_dot_slash(lhs); + rhs = synctex_ignore_leading_dot_slash(rhs); # if SYNCTEX_WINDOWS /* On Windows, filename should be compared case insensitive. * The characters '/' and '\' are both valid path separators. @@ -296,121 +311,115 @@ char * _synctex_merge_strings(const char * first,...) { * There is a list of possible filenames from which we return the most recent one and try to remove all the others. * With two runs of pdftex or xetex we are sure the the synctex file is really the most appropriate. */ -int _synctex_get_name(const char * output, const char * build_directory, char ** synctex_name_ref, synctex_compress_mode_t * compress_mode_ref) +int _synctex_get_name(const char * output, const char * build_directory, char ** synctex_name_ref, synctex_io_mode_t * io_mode_ref) { - if(output && synctex_name_ref && compress_mode_ref) { -# define synctex_name (*synctex_name_ref) -# define compress_mode (*compress_mode_ref) + if(output && synctex_name_ref && io_mode_ref) { /* If output is already absolute, we just have to manage the quotes and the compress mode */ - const char * basename = NULL; /* base name of output*/ size_t size = 0; - /* Initialize the return values. */ - synctex_name = NULL; - compress_mode = synctex_compress_mode_none; - basename = _synctex_last_path_component(output); /* do not free, output is the owner. */ + char * synctex_name = NULL; + synctex_io_mode_t io_mode = *io_mode_ref; + const char * base_name = _synctex_last_path_component(output); /* do not free, output is the owner. base name of output*/ /* Do we have a real base name ? */ - if((size = strlen(basename))>0) { + if(strlen(base_name)>0) { /* Yes, we do. */ const char * temp = NULL; - char * corename = NULL; /* base name of output without path extension. */ - char * dirname = NULL; /* dir name of output */ - char * quoted_corename = NULL; - char * none = NULL; - char * gz = NULL; - char * quoted = NULL; - char * quoted_gz = NULL; - char * build = NULL; - char * build_gz = NULL; - char * build_quoted = NULL; - char * build_quoted_gz = NULL; + char * core_name = NULL; /* base name of output without path extension. */ + char * dir_name = NULL; /* dir name of output */ + char * quoted_core_name = NULL; + char * basic_name = NULL; + char * gz_name = NULL; + char * quoted_name = NULL; + char * quoted_gz_name = NULL; + char * build_name = NULL; + char * build_gz_name = NULL; + char * build_quoted_name = NULL; + char * build_quoted_gz_name = NULL; struct stat buf; - time_t time = 0; - /* Create corename: let temp point to the dot before the path extension of basename; + time_t the_time = 0; + /* Create core_name: let temp point to the dot before the path extension of base_name; * We start form the \0 terminating character and scan the string upward until we find a dot. - * The first dot is not accepted. */ - temp = strrchr(basename,'.'); - size = temp - basename; - if(size>0) { - /* dot properly found, now create corename */ - if(NULL == (corename = (char *)malloc(size+1))) { + * The leading dot is not accepted. */ + if((temp = strrchr(base_name,'.')) && (size = temp - base_name)>0) { + /* There is a dot and it is not at the leading position */ + if(NULL == (core_name = (char *)malloc(size+1))) { _synctex_error("! _synctex_get_name: Memory problem 1"); return -1; } - if(corename != strncpy(corename,basename,size)) { + if(core_name != strncpy(core_name,base_name,size)) { _synctex_error("! _synctex_get_name: Copy problem 1"); - free(corename); - dirname = NULL; + free(core_name); + dir_name = NULL; return -2; } - corename[size] = '\0'; + core_name[size] = '\0'; } else { /* There is no path extension, - * Just make a copy of basename */ - corename = _synctex_merge_strings(basename); + * Just make a copy of base_name */ + core_name = _synctex_merge_strings(base_name); } - /* corename is properly set up, owned by "self". */ - /* creating dirname. */ - size = strlen(output)-strlen(basename); + /* core_name is properly set up, owned by "self". */ + /* creating dir_name. */ + size = strlen(output)-strlen(base_name); if(size>0) { /* output contains more than one path component */ - if(NULL == (dirname = (char *)malloc(size+1))) { + if(NULL == (dir_name = (char *)malloc(size+1))) { _synctex_error("! _synctex_get_name: Memory problem"); - free(corename); - dirname = NULL; + free(core_name); + dir_name = NULL; return -1; } - if(dirname != strncpy(dirname,output,size)) { + if(dir_name != strncpy(dir_name,output,size)) { _synctex_error("! _synctex_get_name: Copy problem"); - free(dirname); - dirname = NULL; - free(corename); - dirname = NULL; + free(dir_name); + dir_name = NULL; + free(core_name); + dir_name = NULL; return -2; } - dirname[size] = '\0'; + dir_name[size] = '\0'; } - /* dirname is properly set up. It ends with a path separator, if non void. */ - /* creating quoted_corename. */ - if(strchr(corename,' ')) { - quoted_corename = _synctex_merge_strings("\"",corename,"\""); + /* dir_name is properly set up. It ends with a path separator, if non void. */ + /* creating quoted_core_name. */ + if(strchr(core_name,' ')) { + quoted_core_name = _synctex_merge_strings("\"",core_name,"\""); } - /* quoted_corename is properly set up. */ - if(dirname &&strlen(dirname)>0) { - none = _synctex_merge_strings(dirname,corename,synctex_suffix,NULL); - if(quoted_corename && strlen(quoted_corename)>0) { - quoted = _synctex_merge_strings(dirname,quoted_corename,synctex_suffix,NULL); + /* quoted_core_name is properly set up. */ + if(dir_name &&strlen(dir_name)>0) { + basic_name = _synctex_merge_strings(dir_name,core_name,synctex_suffix,NULL); + if(quoted_core_name && strlen(quoted_core_name)>0) { + quoted_name = _synctex_merge_strings(dir_name,quoted_core_name,synctex_suffix,NULL); } } else { - none = _synctex_merge_strings(corename,synctex_suffix,NULL); - if(quoted_corename && strlen(quoted_corename)>0) { - quoted = _synctex_merge_strings(quoted_corename,synctex_suffix,NULL); + basic_name = _synctex_merge_strings(core_name,synctex_suffix,NULL); + if(quoted_core_name && strlen(quoted_core_name)>0) { + quoted_name = _synctex_merge_strings(quoted_core_name,synctex_suffix,NULL); } } if(!_synctex_path_is_absolute(output) && build_directory && (size = strlen(build_directory))) { temp = build_directory + size - 1; if(_synctex_path_is_absolute(temp)) { - build = _synctex_merge_strings(build_directory,none,NULL); - if(quoted_corename && strlen(quoted_corename)>0) { - build_quoted = _synctex_merge_strings(build_directory,quoted,NULL); + build_name = _synctex_merge_strings(build_directory,basic_name,NULL); + if(quoted_core_name && strlen(quoted_core_name)>0) { + build_quoted_name = _synctex_merge_strings(build_directory,quoted_name,NULL); } } else { - build = _synctex_merge_strings(build_directory,"/",none,NULL); - if(quoted_corename && strlen(quoted_corename)>0) { - build_quoted = _synctex_merge_strings(build_directory,"/",quoted,NULL); + build_name = _synctex_merge_strings(build_directory,"/",basic_name,NULL); + if(quoted_core_name && strlen(quoted_core_name)>0) { + build_quoted_name = _synctex_merge_strings(build_directory,"/",quoted_name,NULL); } } } - if(none) { - gz = _synctex_merge_strings(none,synctex_suffix_gz,NULL); + if(basic_name) { + gz_name = _synctex_merge_strings(basic_name,synctex_suffix_gz,NULL); } - if(quoted) { - quoted_gz = _synctex_merge_strings(quoted,synctex_suffix_gz,NULL); + if(quoted_name) { + quoted_gz_name = _synctex_merge_strings(quoted_name,synctex_suffix_gz,NULL); } - if(build) { - build_gz = _synctex_merge_strings(build,synctex_suffix_gz,NULL); + if(build_name) { + build_gz_name = _synctex_merge_strings(build_name,synctex_suffix_gz,NULL); } - if(build_quoted) { - build_quoted_gz = _synctex_merge_strings(build_quoted,synctex_suffix_gz,NULL); + if(build_quoted_name) { + build_quoted_gz_name = _synctex_merge_strings(build_quoted_name,synctex_suffix_gz,NULL); } /* All the others names are properly set up... */ /* retain the most recently modified file */ @@ -419,22 +428,24 @@ int _synctex_get_name(const char * output, const char * build_directory, char ** if (stat(FILENAME, &buf)) { \ free(FILENAME);\ FILENAME = NULL;\ - } else { \ - if(buf.st_mtime>time) { \ - time=buf.st_mtime; \ - synctex_name = FILENAME; \ - compress_mode = COMPRESS_MODE; \ - } \ + } else if (buf.st_mtime>the_time) { \ + the_time=buf.st_mtime; \ + synctex_name = FILENAME; \ + if (COMPRESS_MODE) { \ + io_mode |= synctex_io_gz_mask; \ + } else { \ + io_mode &= ~synctex_io_gz_mask; \ + } \ } \ } - TEST(none,synctex_compress_mode_none); - TEST(gz,synctex_compress_mode_gz); - TEST(quoted,synctex_compress_mode_none); - TEST(quoted_gz,synctex_compress_mode_gz); - TEST(build,synctex_compress_mode_none); - TEST(build_gz,synctex_compress_mode_gz); - TEST(build_quoted,synctex_compress_mode_none); - TEST(build_quoted_gz,synctex_compress_mode_gz); + TEST(basic_name,synctex_DONT_COMPRESS); + TEST(gz_name,synctex_COMPRESS); + TEST(quoted_name,synctex_DONT_COMPRESS); + TEST(quoted_gz_name,synctex_COMPRESS); + TEST(build_name,synctex_DONT_COMPRESS); + TEST(build_gz_name,synctex_COMPRESS); + TEST(build_quoted_name,synctex_DONT_COMPRESS); + TEST(build_quoted_gz_name,synctex_COMPRESS); # undef TEST /* Free all the intermediate filenames, except the one that will be used as returned value. */ # define CLEAN_AND_REMOVE(FILENAME) \ @@ -444,21 +455,27 @@ int _synctex_get_name(const char * output, const char * build_directory, char ** free(FILENAME);\ FILENAME = NULL;\ } - CLEAN_AND_REMOVE(none); - CLEAN_AND_REMOVE(gz); - CLEAN_AND_REMOVE(quoted); - CLEAN_AND_REMOVE(quoted_gz); - CLEAN_AND_REMOVE(build); - CLEAN_AND_REMOVE(build_gz); - CLEAN_AND_REMOVE(build_quoted); - CLEAN_AND_REMOVE(build_quoted_gz); + CLEAN_AND_REMOVE(basic_name); + CLEAN_AND_REMOVE(gz_name); + CLEAN_AND_REMOVE(quoted_name); + CLEAN_AND_REMOVE(quoted_gz_name); + CLEAN_AND_REMOVE(build_name); + CLEAN_AND_REMOVE(build_gz_name); + CLEAN_AND_REMOVE(build_quoted_name); + CLEAN_AND_REMOVE(build_quoted_gz_name); # undef CLEAN_AND_REMOVE + /* set up the returned values */ + * synctex_name_ref = synctex_name; + * io_mode_ref = io_mode; return 0; } return -1;/* bad argument */ -# undef synctex_name -# undef compress_mode } return -2; } +const char * _synctex_get_io_mode_name(synctex_io_mode_t io_mode) { + static const char * synctex_io_modes[4] = {"r","rb","a","ab"}; + unsigned index = ((io_mode & synctex_io_gz_mask)?1:0) + ((io_mode & synctex_io_append_mask)?2:0);// bug pointed out by Jose Alliste + return synctex_io_modes[index]; +} |