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 */