File indexing completed on 2024-05-12 04:33:37
0001 /* 0002 SPDX-FileCopyrightText: 2008-2017 jerome DOT laurens AT u-bourgogne DOT fr 0003 SPDX-License-Identifier: X11 0004 0005 This file is part of the __SyncTeX__ package. 0006 0007 [//]: # (Latest Revision: Fri Jul 14 16:20:41 UTC 2017) 0008 [//]: # (Version: 1.19) 0009 0010 See `synctex_parser_readme.md` for more details 0011 */ 0012 0013 #ifndef SYNCTEX_PARSER_UTILS_H 0014 #define SYNCTEX_PARSER_UTILS_H 0015 0016 /* The utilities declared here are subject to conditional implementation. 0017 * All the operating system special stuff goes here. 0018 * The problem mainly comes from file name management: path separator, encoding... 0019 */ 0020 0021 typedef int synctex_bool_t; 0022 #define synctex_YES (0 == 0) 0023 #define synctex_NO (0 == 1) 0024 0025 #define synctex_ADD_QUOTES -1 0026 #define synctex_COMPRESS -1 0027 #define synctex_DONT_ADD_QUOTES 0 0028 #define synctex_DONT_COMPRESS 0 0029 0030 #ifndef __SYNCTEX_PARSER_UTILS__ 0031 #define __SYNCTEX_PARSER_UTILS__ 0032 0033 #include <stdlib.h> 0034 0035 #ifdef __cplusplus 0036 extern "C" { 0037 #endif 0038 0039 #if defined(_WIN32) || defined(__OS2__) 0040 #define SYNCTEX_CASE_SENSITIVE_PATH 0 0041 #define SYNCTEX_IS_PATH_SEPARATOR(c) ('/' == c || '\\' == c) 0042 #else 0043 #define SYNCTEX_CASE_SENSITIVE_PATH 1 0044 #define SYNCTEX_IS_PATH_SEPARATOR(c) ('/' == c) 0045 #endif 0046 0047 #if defined(_WIN32) || defined(__OS2__) 0048 #define SYNCTEX_IS_DOT(c) ('.' == c) 0049 #else 0050 #define SYNCTEX_IS_DOT(c) ('.' == c) 0051 #endif 0052 0053 #if SYNCTEX_CASE_SENSITIVE_PATH 0054 #define SYNCTEX_ARE_PATH_CHARACTERS_EQUAL(left, right) (left != right) 0055 #else 0056 #define SYNCTEX_ARE_PATH_CHARACTERS_EQUAL(left, right) (toupper(left) != toupper(right)) 0057 #endif 0058 0059 #ifdef __GNUC__ 0060 #define SYNCTEX_PRINTF_FORMAT(si, ftc) __attribute__((format(printf, si, ftc))) 0061 #else 0062 #define SYNCTEX_PRINTF_FORMAT(si, ftc) 0063 #endif 0064 0065 /* This custom malloc functions initializes to 0 the newly allocated memory. 0066 * There is no bzero function on windows. */ 0067 void *_synctex_malloc(size_t size); 0068 0069 /* To balance _synctex_malloc. 0070 * ptr might be NULL. */ 0071 void _synctex_free(void *ptr); 0072 0073 /* This is used to log some informational message to the standard error stream. 0074 * On Windows, the stderr stream is not exposed and another method is used. 0075 * The return value is the number of characters printed. */ 0076 int _synctex_error(const char *reason, ...) SYNCTEX_PRINTF_FORMAT(1, 2); 0077 int _synctex_debug(const char *reason, ...) SYNCTEX_PRINTF_FORMAT(1, 2); 0078 0079 /* strip the last extension of the given string, this string is modified! 0080 * This function depends on the OS because the path separator may differ. 0081 * This should be discussed more precisely. */ 0082 void _synctex_strip_last_path_extension(char *string); 0083 0084 /* Compare two file names, windows is sometimes case insensitive... 0085 * The given strings may differ stricto sensu, but represent the same file name. 0086 * It might not be the real way of doing things. 0087 * The return value is an undefined non 0 value when the two file names are equivalent. 0088 * It is 0 otherwise. */ 0089 synctex_bool_t _synctex_is_equivalent_file_name(const char *lhs, const char *rhs); 0090 0091 /* Description forthcoming.*/ 0092 synctex_bool_t _synctex_path_is_absolute(const char *name); 0093 0094 /* Description forthcoming...*/ 0095 const char *_synctex_last_path_component(const char *name); 0096 0097 /* Description forthcoming...*/ 0098 const char *_synctex_base_name(const char *path); 0099 0100 /* If the core of the last path component of src is not already enclosed with double quotes ('"') 0101 * and contains a space character (' '), then a new buffer is created, the src is copied and quotes are added. 0102 * In all other cases, no destination buffer is created and the src is not copied. 0103 * 0 on success, which means no error, something non 0 means error, mainly due to memory allocation failure, or bad parameter. 0104 * This is used to fix a bug in the first version of pdftex with synctex (1.40.9) for which names with spaces 0105 * were not managed in a standard way. 0106 * On success, the caller owns the buffer pointed to by dest_ref (is any) and 0107 * is responsible of freeing the memory when done. 0108 * The size argument is the size of the src buffer. On return the dest_ref points to a buffer sized size+2.*/ 0109 int _synctex_copy_with_quoting_last_path_component(const char *src, char **dest_ref, size_t size); 0110 0111 /* These are the possible extensions of the synctex file */ 0112 extern const char *synctex_suffix; 0113 extern const char *synctex_suffix_gz; 0114 0115 typedef unsigned int synctex_io_mode_t; 0116 0117 typedef enum { synctex_io_append_mask = 1, synctex_io_gz_mask = synctex_io_append_mask << 1 } synctex_io_mode_masks_t; 0118 0119 typedef enum { synctex_compress_mode_none = 0, synctex_compress_mode_gz = 1 } synctex_compress_mode_t; 0120 0121 int _synctex_get_name(const char *output, const char *build_directory, char **synctex_name_ref, synctex_io_mode_t *io_mode_ref); 0122 0123 /* returns the correct mode required by fopen and gzopen from the given io_mode */ 0124 const char *_synctex_get_io_mode_name(synctex_io_mode_t io_mode); 0125 0126 synctex_bool_t synctex_ignore_leading_dot_slash_in_path(const char **name); 0127 0128 #ifdef __cplusplus 0129 } 0130 #endif 0131 0132 #endif 0133 #endif /* SYNCTEX_PARSER_UTILS_H */