diff options
author | raveit65 <[email protected]> | 2016-06-23 13:29:07 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2016-06-24 13:45:05 +0200 |
commit | 4e2cf26a825b5c8d30f6a84227a1f4d279928859 (patch) | |
tree | d856a8dca9ba216a2f35f688be4264c5b500acf7 | |
parent | 121517e184d90c7f36e6431f92bb778ba229c010 (diff) | |
download | atril-4e2cf26a825b5c8d30f6a84227a1f4d279928859.tar.bz2 atril-4e2cf26a825b5c8d30f6a84227a1f4d279928859.tar.xz |
cut-n-paste: Update synctex parser to version 1.16
and add missing files from gnome git for better sync to higher version
Fixes bug 651263.https://bugzilla.gnome.org/show_bug.cgi?id=651263
Taken from:
https://git.gnome.org/browse/evince/commit/?id=05a78e3
-rw-r--r-- | cut-n-paste/synctex/synctex_parser.c | 1156 | ||||
-rw-r--r-- | cut-n-paste/synctex/synctex_parser.h | 9 | ||||
-rw-r--r-- | cut-n-paste/synctex/synctex_parser_local.h | 46 | ||||
-rw-r--r-- | cut-n-paste/synctex/synctex_parser_utils.c | 217 | ||||
-rw-r--r-- | cut-n-paste/synctex/synctex_parser_utils.h | 34 | ||||
-rw-r--r-- | cut-n-paste/synctex/synctex_parser_version.txt | 1 | ||||
-rw-r--r-- | cut-n-paste/synctex/update-synctex-from-TL.sh | 15 |
7 files changed, 827 insertions, 651 deletions
diff --git a/cut-n-paste/synctex/synctex_parser.c b/cut-n-paste/synctex/synctex_parser.c index 060f32d1..758a4119 100644 --- a/cut-n-paste/synctex/synctex_parser.c +++ b/cut-n-paste/synctex/synctex_parser.c @@ -1,12 +1,13 @@ /* -Copyright (c) 2008, 2009; 2010 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. -Version: 1.12 -See synctex_parser_readme.txt for more details +Latest Revision: Tue Jun 14 08:23:30 UTC 2011 + +Version: 1.16 -Latest Revision: Mon Jul 19 21:50:36 UTC 2010 +See synctex_parser_readme.txt for more details License: -------- @@ -91,14 +92,12 @@ Thu Jun 19 09:39:21 UTC 2008 */ #include "synctex_parser.h" -#include <synctex_parser_utils.h> +#include "synctex_parser_utils.h" /* These are the possible extensions of the synctex file */ const char * synctex_suffix = ".synctex"; const char * synctex_suffix_gz = ".gz"; -static const char * synctex_io_modes[synctex_io_mode_append+2] = {"r","rb","a","ab"}; - /* each synctex node has a class */ typedef struct __synctex_class_t _synctex_class_t; typedef _synctex_class_t * synctex_class_t; @@ -170,7 +169,7 @@ struct __synctex_class_t { /* This macro is some kind of objc_msg_send. * It takes care of sending the proper message if possible. */ -# define SYNCTEX_MSG_SEND(NODE,SELECTOR) if(NODE && SYNCTEX_CAN_PERFORM(NODE,SELECTOR)) {\ +# define SYNCTEX_MSG_SEND(NODE,SELECTOR) if (NODE && SYNCTEX_CAN_PERFORM(NODE,SELECTOR)) {\ (*((((NODE)->class))->SELECTOR))(NODE);\ } @@ -188,14 +187,14 @@ struct __synctex_class_t { /* Parent getter and setter */ # define SYNCTEX_PARENT(NODE) SYNCTEX_GET(NODE,parent) -# define SYNCTEX_SET_PARENT(NODE,NEW_PARENT) if(NODE && NEW_PARENT && SYNCTEX_CAN_PERFORM(NODE,parent)){\ +# define SYNCTEX_SET_PARENT(NODE,NEW_PARENT) if (NODE && NEW_PARENT && SYNCTEX_CAN_PERFORM(NODE,parent)){\ SYNCTEX_GETTER(NODE,parent)[0]=NEW_PARENT;\ } /* Child getter and setter */ # define SYNCTEX_CHILD(NODE) SYNCTEX_GET(NODE,child) -# define SYNCTEX_SET_CHILD(NODE,NEW_CHILD) if(NODE && NEW_CHILD){\ +# define SYNCTEX_SET_CHILD(NODE,NEW_CHILD) if (NODE && NEW_CHILD){\ SYNCTEX_GETTER(NODE,child)[0]=NEW_CHILD;\ SYNCTEX_GETTER(NEW_CHILD,parent)[0]=NODE;\ } @@ -203,9 +202,9 @@ struct __synctex_class_t { /* Sibling getter and setter */ # define SYNCTEX_SIBLING(NODE) SYNCTEX_GET(NODE,sibling) -# define SYNCTEX_SET_SIBLING(NODE,NEW_SIBLING) if(NODE && NEW_SIBLING) {\ +# define SYNCTEX_SET_SIBLING(NODE,NEW_SIBLING) if (NODE && NEW_SIBLING) {\ SYNCTEX_GETTER(NODE,sibling)[0]=NEW_SIBLING;\ - if(SYNCTEX_CAN_PERFORM(NEW_SIBLING,parent) && SYNCTEX_CAN_PERFORM(NODE,parent)) {\ + if (SYNCTEX_CAN_PERFORM(NEW_SIBLING,parent) && SYNCTEX_CAN_PERFORM(NODE,parent)) {\ SYNCTEX_GETTER(NEW_SIBLING,parent)[0]=SYNCTEX_GETTER(NODE,parent)[0];\ }\ } @@ -214,7 +213,7 @@ struct __synctex_class_t { * Friends are used mainly in forward synchronization aka from source to output. */ # define SYNCTEX_FRIEND(NODE) SYNCTEX_GET(NODE,friend) -# define SYNCTEX_SET_FRIEND(NODE,NEW_FRIEND) if(NODE && NEW_FRIEND){\ +# define SYNCTEX_SET_FRIEND(NODE,NEW_FRIEND) if (NODE && NEW_FRIEND){\ SYNCTEX_GETTER(NODE,friend)[0]=NEW_FRIEND;\ } @@ -222,7 +221,7 @@ struct __synctex_class_t { * Navigation starts with the deeper boxes. */ # define SYNCTEX_NEXT_HORIZ_BOX(NODE) SYNCTEX_GET(NODE,next_box) -# define SYNCTEX_SET_NEXT_HORIZ_BOX(NODE,NEXT_BOX) if(NODE && NEXT_BOX){\ +# define SYNCTEX_SET_NEXT_HORIZ_BOX(NODE,NEXT_BOX) if (NODE && NEXT_BOX){\ SYNCTEX_GETTER(NODE,next_box)[0]=NEXT_BOX;\ } @@ -234,7 +233,7 @@ void _synctex_free_leaf(synctex_node_t node); * This destructor is for all nodes with children. */ void _synctex_free_node(synctex_node_t node) { - if(node) { + if (node) { (*((node->class)->sibling))(node); SYNCTEX_FREE(SYNCTEX_SIBLING(node)); SYNCTEX_FREE(SYNCTEX_CHILD(node)); @@ -248,7 +247,7 @@ void _synctex_free_node(synctex_node_t node) { * This destructor is for nodes with no child. */ void _synctex_free_leaf(synctex_node_t node) { - if(node) { + if (node) { SYNCTEX_FREE(SYNCTEX_SIBLING(node)); free(node); } @@ -368,7 +367,7 @@ static _synctex_class_t synctex_class_sheet = { /* sheet node creator */ synctex_node_t _synctex_new_sheet(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_sheet_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_sheet:(synctex_class_t)&synctex_class_sheet; } return node; @@ -430,7 +429,7 @@ static _synctex_class_t synctex_class_vbox = { /* vertical box node creator */ synctex_node_t _synctex_new_vbox(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_vert_box_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_vbox:(synctex_class_t)&synctex_class_vbox; } return node; @@ -483,7 +482,7 @@ static _synctex_class_t synctex_class_hbox = { /* horizontal box node creator */ synctex_node_t _synctex_new_hbox(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_horiz_box_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_hbox:(synctex_class_t)&synctex_class_hbox; } return node; @@ -521,7 +520,7 @@ static _synctex_class_t synctex_class_void_vbox = { /* vertical void box node creator */ synctex_node_t _synctex_new_void_vbox(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_void_box_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_void_vbox:(synctex_class_t)&synctex_class_void_vbox; } return node; @@ -548,7 +547,7 @@ static _synctex_class_t synctex_class_void_hbox = { /* horizontal void box node creator */ synctex_node_t _synctex_new_void_hbox(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_void_box_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_void_hbox:(synctex_class_t)&synctex_class_void_hbox; } return node; @@ -593,7 +592,7 @@ static _synctex_class_t synctex_class_math = { synctex_node_t _synctex_new_math(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_math:(synctex_class_t)&synctex_class_math; } return node; @@ -620,7 +619,7 @@ static _synctex_class_t synctex_class_kern = { synctex_node_t _synctex_new_kern(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_kern:(synctex_class_t)&synctex_class_kern; } return node; @@ -655,7 +654,7 @@ static _synctex_class_t synctex_class_glue = { }; synctex_node_t _synctex_new_glue(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_glue:(synctex_class_t)&synctex_class_glue; } return node; @@ -682,7 +681,7 @@ static _synctex_class_t synctex_class_boundary = { synctex_node_t _synctex_new_boundary(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_small_node_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_boundary:(synctex_class_t)&synctex_class_boundary; } return node; @@ -721,13 +720,13 @@ static _synctex_class_t synctex_class_input = { synctex_node_t _synctex_new_input(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_input_t)); - if(node) { + if (node) { node->class = scanner?scanner->class+synctex_node_type_input:(synctex_class_t)&synctex_class_input; } return node; } void _synctex_free_input(synctex_node_t node){ - if(node) { + if (node) { SYNCTEX_FREE(SYNCTEX_SIBLING(node)); free(SYNCTEX_NAME(node)); free(node); @@ -758,15 +757,15 @@ synctex_node_t synctex_node_sibling(synctex_node_t node) return SYNCTEX_SIBLING(node); } synctex_node_t synctex_node_next(synctex_node_t node) { - if(SYNCTEX_CHILD(node)) { + if (SYNCTEX_CHILD(node)) { return SYNCTEX_CHILD(node); } sibling: - if(SYNCTEX_SIBLING(node)) { + if (SYNCTEX_SIBLING(node)) { return SYNCTEX_SIBLING(node); } - if((node = SYNCTEX_PARENT(node))) { - if(node->class->type == synctex_node_type_sheet) {/* EXC_BAD_ACCESS? */ + if ((node = SYNCTEX_PARENT(node))) { + if (node->class->type == synctex_node_type_sheet) {/* EXC_BAD_ACCESS? */ return NULL; } goto sibling; @@ -780,7 +779,7 @@ sibling: /* Public node accessor: the type */ synctex_node_type_t synctex_node_type(synctex_node_t node) { - if(node) { + if (node) { return (((node)->class))->type; } return synctex_node_type_error; @@ -819,7 +818,7 @@ void _synctex_display_input(synctex_node_t node) { } void _synctex_log_sheet(synctex_node_t sheet) { - if(sheet) { + if (sheet) { printf("%s:%i\n",synctex_node_isa(sheet),SYNCTEX_PAGE(sheet)); printf("SELF:%p",(void *)sheet); printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(sheet)); @@ -922,7 +921,7 @@ void _synctex_log_input(synctex_node_t node) { } void _synctex_display_sheet(synctex_node_t sheet) { - if(sheet) { + if (sheet) { printf("....{%i\n",SYNCTEX_PAGE(sheet)); SYNCTEX_DISPLAY(SYNCTEX_CHILD(sheet)); printf("....}\n"); @@ -1050,7 +1049,7 @@ typedef int synctex_status_t; # define SYNCTEX_FILE (scanner->file) /* Actually, the minimum buffer size is driven by integer and float parsing. - * ¬±0.123456789e123 + * �0.123456789e123 */ # define SYNCTEX_BUFFER_MIN_SIZE 16 # define SYNCTEX_BUFFER_SIZE 32768 @@ -1076,6 +1075,7 @@ int _synctex_scan_postamble(synctex_scanner_t scanner); synctex_status_t _synctex_setup_visible_box(synctex_node_t box); synctex_status_t _synctex_horiz_box_setup_visible(synctex_node_t node,int h, int v); synctex_status_t _synctex_scan_sheet(synctex_scanner_t scanner, synctex_node_t parent); +synctex_status_t _synctex_scan_nested_sheet(synctex_scanner_t scanner); synctex_status_t _synctex_scan_content(synctex_scanner_t scanner); int synctex_scanner_pre_x_offset(synctex_scanner_t scanner); int synctex_scanner_pre_y_offset(synctex_scanner_t scanner); @@ -1095,30 +1095,30 @@ int _synctex_bail(void); * when there was an error reading the synctex file. */ synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, size_t * size_ptr) { size_t available = 0; - if(NULL == scanner || NULL == size_ptr) { + if (NULL == scanner || NULL == size_ptr) { return SYNCTEX_STATUS_BAD_ARGUMENT; } # define size (* size_ptr) - if(size>SYNCTEX_BUFFER_SIZE){ + if (size>SYNCTEX_BUFFER_SIZE){ size = SYNCTEX_BUFFER_SIZE; } available = SYNCTEX_END - SYNCTEX_CUR; /* available is the number of unparsed chars in the buffer */ - if(size<=available) { + if (size<=available) { /* There are already sufficiently many characters in the buffer */ size = available; return SYNCTEX_STATUS_OK; } - if(SYNCTEX_FILE) { + if (SYNCTEX_FILE) { /* Copy the remaining part of the buffer to the beginning, * then read the next part of the file */ int already_read = 0; - if(available) { + if (available) { memmove(SYNCTEX_START, SYNCTEX_CUR, available); } SYNCTEX_CUR = SYNCTEX_START + available; /* the next character after the move, will change. */ /* Fill the buffer up to its end */ already_read = gzread(SYNCTEX_FILE,(void *)SYNCTEX_CUR,SYNCTEX_BUFFER_SIZE - available); - if(already_read>0) { + if (already_read>0) { /* We assume that 0<already_read<=SYNCTEX_BUFFER_SIZE - available, such that * SYNCTEX_CUR + already_read = SYNCTEX_START + available + already_read <= SYNCTEX_START + SYNCTEX_BUFFER_SIZE */ SYNCTEX_END = SYNCTEX_CUR + already_read; @@ -1129,29 +1129,28 @@ synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, s SYNCTEX_CUR = SYNCTEX_START; size = SYNCTEX_END - SYNCTEX_CUR; /* == old available + already_read*/ return SYNCTEX_STATUS_OK; /* May be available is less than size, the caller will have to test. */ - } else if(0>already_read) { - /* There is an error in zlib */ + } else if (0>already_read) { + /* There is a possible error in reading the file */ int errnum = 0; const char * error_string = gzerror(SYNCTEX_FILE, &errnum); - if(Z_ERRNO == errnum) { + if (Z_ERRNO == errnum) { /* There is an error in zlib caused by the file system */ _synctex_error("gzread error from the file system (%i)",errno); - } else { + return SYNCTEX_STATUS_ERROR; + } else if (errnum) { _synctex_error("gzread error (%i:%i,%s)",already_read,errnum,error_string); + return SYNCTEX_STATUS_ERROR; } - return SYNCTEX_STATUS_ERROR; - } else { - /* Nothing was read, we are at the end of the file. */ - gzclose(SYNCTEX_FILE); - SYNCTEX_FILE = NULL; - SYNCTEX_END = SYNCTEX_CUR; - SYNCTEX_CUR = SYNCTEX_START; - * SYNCTEX_END = '\0';/* Terminate the string properly.*/ - size = SYNCTEX_END - SYNCTEX_CUR; - return SYNCTEX_STATUS_EOF; /* there might be a bit of text left */ } - /* At this point, the function has already returned from above */ - } + /* Nothing was read, we are at the end of the file. */ + gzclose(SYNCTEX_FILE); + SYNCTEX_FILE = NULL; + SYNCTEX_END = SYNCTEX_CUR; + SYNCTEX_CUR = SYNCTEX_START; + * SYNCTEX_END = '\0';/* Terminate the string properly.*/ + size = SYNCTEX_END - SYNCTEX_CUR; + return SYNCTEX_STATUS_EOF; /* there might be a bit of text left */ + } /* We cannot enlarge the buffer because the end of the file was reached. */ size = available; return SYNCTEX_STATUS_EOF; @@ -1170,12 +1169,12 @@ synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, s synctex_status_t _synctex_next_line(synctex_scanner_t scanner) { synctex_status_t status = SYNCTEX_STATUS_OK; size_t available = 0; - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } infinite_loop: while(SYNCTEX_CUR<SYNCTEX_END) { - if(*SYNCTEX_CUR == '\n') { + if (*SYNCTEX_CUR == '\n') { ++SYNCTEX_CUR; available = 1; return _synctex_buffer_get_available_size(scanner, &available); @@ -1186,7 +1185,7 @@ infinite_loop: * will read another bunch of synctex file. Little by little, we advance to the end of the file. */ available = 1; status = _synctex_buffer_get_available_size(scanner, &available); - if(status<=0) { + if (status<=0) { return status; } goto infinite_loop; @@ -1207,33 +1206,33 @@ synctex_status_t _synctex_match_string(synctex_scanner_t scanner, const char * t size_t remaining_len = 0; /* the number of remaining characters of the_string that should match */ size_t available = 0; synctex_status_t status = 0; - if(NULL == scanner || NULL == the_string) { + if (NULL == scanner || NULL == the_string) { return SYNCTEX_STATUS_BAD_ARGUMENT; } remaining_len = strlen(the_string); /* All the_string should match */ - if(0 == remaining_len) { + if (0 == remaining_len) { return SYNCTEX_STATUS_BAD_ARGUMENT; } /* How many characters available in the buffer? */ available = remaining_len; status = _synctex_buffer_get_available_size(scanner,&available); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { return status; } /* Maybe we have less characters than expected because the buffer is too small. */ - if(available>=remaining_len) { + if (available>=remaining_len) { /* The buffer is sufficiently big to hold the expected number of characters. */ - if(strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) { + if (strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) { return SYNCTEX_STATUS_NOT_OK; } return_OK: /* Advance SYNCTEX_CUR to the next character after the_string. */ SYNCTEX_CUR += remaining_len; return SYNCTEX_STATUS_OK; - } else if(strncmp((char *)SYNCTEX_CUR,the_string,available)) { + } else if (strncmp((char *)SYNCTEX_CUR,the_string,available)) { /* No need to goo further, this is not the expected string in the buffer. */ return SYNCTEX_STATUS_NOT_OK; - } else if(SYNCTEX_FILE) { + } else if (SYNCTEX_FILE) { /* The buffer was too small to contain remaining_len characters. * We have to cut the string into pieces. */ z_off_t offset = 0L; @@ -1243,7 +1242,7 @@ return_OK: remaining_len -= available; tested_len += available; SYNCTEX_CUR += available; /* We validate the tested characters. */ - if(0 == remaining_len) { + if (0 == remaining_len) { /* Nothing left to test, we have found the given string, we return the length. */ return tested_len; } @@ -1268,13 +1267,13 @@ more_characters: * We will definitely have to recover the previous state in case we do not find the expected string. */ available = remaining_len; status = _synctex_buffer_get_available_size(scanner,&available); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { return status; /* This is an error, no need to go further. */ } - if(available==0) { + if (available==0) { /* Missing characters: recover the initial state of the file and return. */ return_NOT_OK: - if(offset != gzseek(SYNCTEX_FILE,offset,SEEK_SET)) { + if (offset != gzseek(SYNCTEX_FILE,offset,SEEK_SET)) { /* This is a critical error, we could not recover the previous state. */ _synctex_error("can't seek file"); return SYNCTEX_STATUS_ERROR; @@ -1284,9 +1283,9 @@ return_NOT_OK: SYNCTEX_CUR = SYNCTEX_END; return SYNCTEX_STATUS_NOT_OK; } - if(available<remaining_len) { + if (available<remaining_len) { /* We'll have to loop one more time. */ - if(strncmp((char *)SYNCTEX_CUR,the_string,available)) { + if (strncmp((char *)SYNCTEX_CUR,the_string,available)) { /* This is not the expected string, recover the previous state and return. */ goto return_NOT_OK; } @@ -1296,14 +1295,14 @@ return_NOT_OK: remaining_len -= available; tested_len += available; SYNCTEX_CUR += available; /* We validate the tested characters. */ - if(0 == remaining_len) { + if (0 == remaining_len) { /* Nothing left to test, we have found the given string. */ return SYNCTEX_STATUS_OK; } goto more_characters; } /* This is the last step. */ - if(strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) { + if (strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) { /* This is not the expected string, recover the previous state and return. */ goto return_NOT_OK; } @@ -1330,29 +1329,29 @@ synctex_status_t _synctex_decode_int(synctex_scanner_t scanner, int* value_ref) int result = 0; size_t available = 0; synctex_status_t status = 0; - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } available = SYNCTEX_BUFFER_MIN_SIZE; status = _synctex_buffer_get_available_size(scanner, &available); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { return status;/* Forward error. */ } - if(available==0) { + if (available==0) { return SYNCTEX_STATUS_EOF;/* it is the end of file. */ } ptr = SYNCTEX_CUR; - if(*ptr==':' || *ptr==',') { + if (*ptr==':' || *ptr==',') { ++ptr; --available; - if(available==0) { + if (available==0) { return SYNCTEX_STATUS_NOT_OK;/* It is not possible to scan an int */ } } result = (int)strtol(ptr, &end, 10); - if(end>ptr) { + if (end>ptr) { SYNCTEX_CUR = end; - if(value_ref) { + if (value_ref) { * value_ref = result; } return SYNCTEX_STATUS_OK;/* Successfully scanned an int */ @@ -1384,17 +1383,17 @@ synctex_status_t _synctex_decode_string(synctex_scanner_t scanner, char ** value size_t len = 0;/* The number of bytes to copy */ size_t available = 0; synctex_status_t status = 0; - if(NULL == scanner || NULL == value_ref) { + if (NULL == scanner || NULL == value_ref) { return SYNCTEX_STATUS_BAD_ARGUMENT; } /* The buffer must at least contain one character: the '\n' end of line marker */ - if(SYNCTEX_CUR>=SYNCTEX_END) { + if (SYNCTEX_CUR>=SYNCTEX_END) { available = 1; status = _synctex_buffer_get_available_size(scanner,&available); - if(status < 0) { + if (status < 0) { return status; } - if(0 == available) { + if (0 == available) { return SYNCTEX_STATUS_EOF; } } @@ -1405,11 +1404,11 @@ synctex_status_t _synctex_decode_string(synctex_scanner_t scanner, char ** value * value_ref = NULL;/* Initialize, it will be realloc'ed */ /* We scan all the characters up to the next '\n' */ next_character: - if(end<SYNCTEX_END) { - if(*end == '\n') { + if (end<SYNCTEX_END) { + if (*end == '\n') { /* OK, we found where to stop */ len = end - SYNCTEX_CUR; - if(current_size>UINT_MAX-len-1) { + if (current_size>UINT_MAX-len-1) { /* But we have reached the limit: we do not have current_size+len+1>UINT_MAX. * We return the missing amount of memory. * This will never occur in practice. */ @@ -1419,8 +1418,8 @@ next_character: /* We have current_size+len+1<=UINT_MAX * or equivalently new_size<UINT_MAX, * where we have assumed that len<UINT_MAX */ - if((* value_ref = realloc(* value_ref,new_size+1)) != NULL) { - if(memcpy((*value_ref)+current_size,SYNCTEX_CUR,len)) { + if ((* value_ref = realloc(* value_ref,new_size+1)) != NULL) { + if (memcpy((*value_ref)+current_size,SYNCTEX_CUR,len)) { (* value_ref)[new_size]='\0'; /* Terminate the string */ SYNCTEX_CUR += len;/* Advance to the terminating '\n' */ return SYNCTEX_STATUS_OK; @@ -1439,14 +1438,14 @@ next_character: } else { /* end == SYNCTEX_END */ len = SYNCTEX_END - SYNCTEX_CUR; - if(current_size>UINT_MAX-len-1) { + if (current_size>UINT_MAX-len-1) { /* We have reached the limit. */ _synctex_error("limit reached (missing %i).",current_size-(UINT_MAX-len-1)); return SYNCTEX_STATUS_ERROR; } new_size = current_size+len; - if((* value_ref = realloc(* value_ref,new_size+1)) != NULL) { - if(memcpy((*value_ref)+current_size,SYNCTEX_CUR,len)) { + if ((* value_ref = realloc(* value_ref,new_size+1)) != NULL) { + if (memcpy((*value_ref)+current_size,SYNCTEX_CUR,len)) { (* value_ref)[new_size]='\0'; /* Terminate the string */ SYNCTEX_CUR = SYNCTEX_END;/* Advance the cursor to the end of the bufer */ return SYNCTEX_STATUS_OK; @@ -1469,22 +1468,22 @@ synctex_status_t _synctex_scan_input(synctex_scanner_t scanner) { synctex_status_t status = 0; size_t available = 0; synctex_node_t input = NULL; - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } status = _synctex_match_string(scanner,"Input:"); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } /* Create a node */ input = _synctex_new_input(scanner); - if(NULL == input) { + if (NULL == input) { _synctex_error("could not create an input node."); return SYNCTEX_STATUS_ERROR; } /* Decode the synctag */ status = _synctex_decode_int(scanner,&(SYNCTEX_TAG(input))); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("bad format of input node."); SYNCTEX_FREE(input); return status; @@ -1492,10 +1491,10 @@ synctex_status_t _synctex_scan_input(synctex_scanner_t scanner) { /* The next character is a field separator, we expect one character in the buffer. */ available = 1; status = _synctex_buffer_get_available_size(scanner, &available); - if(status<=SYNCTEX_STATUS_ERROR) { + if (status<=SYNCTEX_STATUS_ERROR) { return status; } - if(0 == available) { + if (0 == available) { return SYNCTEX_STATUS_EOF; } /* We can now safely advance to the next character, stepping over the field separator. */ @@ -1503,7 +1502,7 @@ synctex_status_t _synctex_scan_input(synctex_scanner_t scanner) { --available; /* Then we scan the file name */ status = _synctex_decode_string(scanner,&(SYNCTEX_NAME(input))); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { SYNCTEX_FREE(input); return status; } @@ -1528,16 +1527,16 @@ synctex_status_t _synctex_scan_named(synctex_scanner_t scanner,const char * name */ synctex_status_t _synctex_scan_named(synctex_scanner_t scanner,const char * name,void * value_ref,synctex_decoder_t decoder) { synctex_status_t status = 0; - if(NULL == scanner || NULL == name || NULL == value_ref || NULL == decoder) { + if (NULL == scanner || NULL == name || NULL == value_ref || NULL == decoder) { return SYNCTEX_STATUS_BAD_ARGUMENT; } not_found: status = _synctex_match_string(scanner,name); - if(status<SYNCTEX_STATUS_NOT_OK) { + if (status<SYNCTEX_STATUS_NOT_OK) { return status; - } else if(status == SYNCTEX_STATUS_NOT_OK) { + } else if (status == SYNCTEX_STATUS_NOT_OK) { status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } goto not_found; @@ -1551,60 +1550,60 @@ not_found: */ synctex_status_t _synctex_scan_preamble(synctex_scanner_t scanner) { synctex_status_t status = 0; - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } status = _synctex_scan_named(scanner,"SyncTeX Version:",&(scanner->version),(synctex_decoder_t)&_synctex_decode_int); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } /* Read all the input records */ do { status = _synctex_scan_input(scanner); - if(status<SYNCTEX_STATUS_NOT_OK) { + if (status<SYNCTEX_STATUS_NOT_OK) { return status; } } while(status == SYNCTEX_STATUS_OK); /* the loop exits when status == SYNCTEX_STATUS_NOT_OK */ /* Now read all the required settings. */ status = _synctex_scan_named(scanner,"Output:",&(scanner->output_fmt),(synctex_decoder_t)&_synctex_decode_string); - if(status<SYNCTEX_STATUS_NOT_OK) { + if (status<SYNCTEX_STATUS_NOT_OK) { return status; } status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_scan_named(scanner,"Magnification:",&(scanner->pre_magnification),(synctex_decoder_t)&_synctex_decode_int); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_scan_named(scanner,"Unit:",&(scanner->pre_unit),(synctex_decoder_t)&_synctex_decode_int); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_scan_named(scanner,"X Offset:",&(scanner->pre_x_offset),(synctex_decoder_t)&_synctex_decode_int); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } status = _synctex_scan_named(scanner,"Y Offset:",&(scanner->pre_y_offset),(synctex_decoder_t)&_synctex_decode_int); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } return _synctex_next_line(scanner); @@ -1619,12 +1618,12 @@ synctex_status_t _synctex_scan_float_and_dimension(synctex_scanner_t scanner, fl char * loc = setlocale(LC_NUMERIC, NULL); #endif size_t available = 0; - if(NULL == scanner || NULL == value_ref) { + if (NULL == scanner || NULL == value_ref) { return SYNCTEX_STATUS_BAD_ARGUMENT; } available = SYNCTEX_BUFFER_MIN_SIZE; status = _synctex_buffer_get_available_size(scanner, &available); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { _synctex_error("problem with float."); return status; } @@ -1635,56 +1634,56 @@ synctex_status_t _synctex_scan_float_and_dimension(synctex_scanner_t scanner, fl #ifdef HAVE_SETLOCALE setlocale(LC_NUMERIC, loc); #endif - if(endptr == SYNCTEX_CUR) { + if (endptr == SYNCTEX_CUR) { _synctex_error("a float was expected."); return SYNCTEX_STATUS_ERROR; } SYNCTEX_CUR = endptr; - if((status = _synctex_match_string(scanner,"in")) >= SYNCTEX_STATUS_OK) { + if ((status = _synctex_match_string(scanner,"in")) >= SYNCTEX_STATUS_OK) { f *= 72.27f*65536; - } else if(status<SYNCTEX_STATUS_EOF) { + } else if (status<SYNCTEX_STATUS_EOF) { report_unit_error: _synctex_error("problem with unit."); return status; - } else if((status = _synctex_match_string(scanner,"cm")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"cm")) >= SYNCTEX_STATUS_OK) { f *= 72.27f*65536/2.54f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"mm")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"mm")) >= SYNCTEX_STATUS_OK) { f *= 72.27f*65536/25.4f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"pt")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"pt")) >= SYNCTEX_STATUS_OK) { f *= 65536.0f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"bp")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"bp")) >= SYNCTEX_STATUS_OK) { f *= 72.27f/72*65536.0f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"pc")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"pc")) >= SYNCTEX_STATUS_OK) { f *= 12.0*65536.0f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"sp")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"sp")) >= SYNCTEX_STATUS_OK) { f *= 1.0f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"dd")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"dd")) >= SYNCTEX_STATUS_OK) { f *= 1238.0f/1157*65536.0f; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"cc")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"cc")) >= SYNCTEX_STATUS_OK) { f *= 14856.0f/1157*65536; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"nd")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"nd")) >= SYNCTEX_STATUS_OK) { f *= 685.0f/642*65536; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; - } else if((status = _synctex_match_string(scanner,"nc")) >= SYNCTEX_STATUS_OK) { + } else if ((status = _synctex_match_string(scanner,"nc")) >= SYNCTEX_STATUS_OK) { f *= 1370.0f/107*65536; - } else if(status<0) { + } else if (status<0) { goto report_unit_error; } *value_ref = f; @@ -1700,20 +1699,20 @@ synctex_status_t _synctex_scan_post_scriptum(synctex_scanner_t scanner) { #ifdef HAVE_SETLOCALE char * loc = setlocale(LC_NUMERIC, NULL); #endif - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } /* Scan the file until a post scriptum line is found */ post_scriptum_not_found: status = _synctex_match_string(scanner,"Post scriptum:"); - if(status<SYNCTEX_STATUS_NOT_OK) { + if (status<SYNCTEX_STATUS_NOT_OK) { return status; } - if(status == SYNCTEX_STATUS_NOT_OK) { + if (status == SYNCTEX_STATUS_NOT_OK) { status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { return status; - } else if(status<SYNCTEX_STATUS_OK) { + } else if (status<SYNCTEX_STATUS_OK) { return SYNCTEX_STATUS_OK;/* The EOF is found, we have properly scanned the file */ } goto post_scriptum_not_found; @@ -1721,14 +1720,14 @@ post_scriptum_not_found: /* We found the name, advance to the next line. */ next_line: status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { return status; - } else if(status<SYNCTEX_STATUS_OK) { + } else if (status<SYNCTEX_STATUS_OK) { return SYNCTEX_STATUS_OK;/* The EOF is found, we have properly scanned the file */ } /* Scanning the information */ status = _synctex_match_string(scanner,"Magnification:"); - if(status == SYNCTEX_STATUS_OK ) { + if (status == SYNCTEX_STATUS_OK ) { #ifdef HAVE_SETLOCALE setlocale(LC_NUMERIC, "C"); #endif @@ -1736,42 +1735,42 @@ next_line: #ifdef HAVE_SETLOCALE setlocale(LC_NUMERIC, loc); #endif - if(endptr == SYNCTEX_CUR) { + if (endptr == SYNCTEX_CUR) { _synctex_error("bad magnification in the post scriptum, a float was expected."); return SYNCTEX_STATUS_ERROR; } - if(scanner->unit<=0) { + if (scanner->unit<=0) { _synctex_error("bad magnification in the post scriptum, a positive float was expected."); return SYNCTEX_STATUS_ERROR; } SYNCTEX_CUR = endptr; goto next_line; } - if(status<SYNCTEX_STATUS_EOF){ + if (status<SYNCTEX_STATUS_EOF){ report_record_problem: _synctex_error("Problem reading the Post Scriptum records"); return status; /* echo the error. */ } status = _synctex_match_string(scanner,"X Offset:"); - if(status == SYNCTEX_STATUS_OK) { + if (status == SYNCTEX_STATUS_OK) { status = _synctex_scan_float_and_dimension(scanner, &(scanner->x_offset)); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("problem with X offset in the Post Scriptum."); return status; } goto next_line; - } else if(status<SYNCTEX_STATUS_EOF){ + } else if (status<SYNCTEX_STATUS_EOF){ goto report_record_problem; } status = _synctex_match_string(scanner,"Y Offset:"); - if(status==SYNCTEX_STATUS_OK) { + if (status==SYNCTEX_STATUS_OK) { status = _synctex_scan_float_and_dimension(scanner, &(scanner->y_offset)); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("problem with Y offset in the Post Scriptum."); return status; } goto next_line; - } else if(status<SYNCTEX_STATUS_EOF){ + } else if (status<SYNCTEX_STATUS_EOF){ goto report_record_problem; } goto next_line; @@ -1784,24 +1783,24 @@ report_record_problem: */ int _synctex_scan_postamble(synctex_scanner_t scanner) { int status = 0; - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } status = _synctex_match_string(scanner,"Postamble:"); - if(status < SYNCTEX_STATUS_OK) { + if (status < SYNCTEX_STATUS_OK) { return status; } count_again: status = _synctex_next_line(scanner); - if(status < SYNCTEX_STATUS_OK) { + if (status < SYNCTEX_STATUS_OK) { return status; } status = _synctex_scan_named(scanner,"Count:",&(scanner->count),(synctex_decoder_t)&_synctex_decode_int); - if(status < SYNCTEX_STATUS_EOF) { + if (status < SYNCTEX_STATUS_EOF) { return status; /* forward the error */ - } else if(status < SYNCTEX_STATUS_OK) { /* No Count record found */ + } else if (status < SYNCTEX_STATUS_OK) { /* No Count record found */ status = _synctex_next_line(scanner); /* Advance one more line */ - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { return status; } goto count_again; @@ -1816,10 +1815,10 @@ count_again: * At creation time, the visible size is set to the values of the real size. */ synctex_status_t _synctex_setup_visible_box(synctex_node_t box) { - if(box) { + if (box) { switch(box->class->type) { case synctex_node_type_hbox: - if(SYNCTEX_INFO(box) != NULL) { + if (SYNCTEX_INFO(box) != NULL) { SYNCTEX_HORIZ_V(box) = SYNCTEX_HORIZ(box); SYNCTEX_VERT_V(box) = SYNCTEX_VERT(box); SYNCTEX_WIDTH_V(box) = SYNCTEX_WIDTH(box); @@ -1842,31 +1841,89 @@ synctex_status_t _synctex_horiz_box_setup_visible(synctex_node_t node,int h, int # pragma unused(v) # endif int itsBtm, itsTop; - if(NULL == node || node->class->type != synctex_node_type_hbox) { + if (NULL == node || node->class->type != synctex_node_type_hbox) { return SYNCTEX_STATUS_BAD_ARGUMENT; } - if(SYNCTEX_WIDTH_V(node)<0) { + if (SYNCTEX_WIDTH_V(node)<0) { itsBtm = SYNCTEX_HORIZ_V(node); itsTop = SYNCTEX_HORIZ_V(node)-SYNCTEX_WIDTH_V(node); - if(h<itsBtm) { + if (h<itsBtm) { SYNCTEX_HORIZ_V(node) = h; SYNCTEX_WIDTH_V(node) = SYNCTEX_HORIZ_V(node) - itsTop; - } else if(h>itsTop) { + } else if (h>itsTop) { SYNCTEX_WIDTH_V(node) = SYNCTEX_HORIZ_V(node) - h; } } else { itsBtm = SYNCTEX_HORIZ_V(node); itsTop = SYNCTEX_HORIZ_V(node)+SYNCTEX_WIDTH_V(node); - if(h<itsBtm) { + if (h<itsBtm) { SYNCTEX_HORIZ_V(node) = h; SYNCTEX_WIDTH_V(node) = itsTop - SYNCTEX_HORIZ_V(node); - } else if(h>itsTop) { + } else if (h>itsTop) { SYNCTEX_WIDTH_V(node) = h - SYNCTEX_HORIZ_V(node); } } return SYNCTEX_STATUS_OK; } +/* Here are the control characters that strat each line of the synctex output file. + * Their values define the meaning of the line. + */ +# define SYNCTEX_CHAR_BEGIN_SHEET '{' +# define SYNCTEX_CHAR_END_SHEET '}' +# define SYNCTEX_CHAR_BEGIN_VBOX '[' +# define SYNCTEX_CHAR_END_VBOX ']' +# define SYNCTEX_CHAR_BEGIN_HBOX '(' +# define SYNCTEX_CHAR_END_HBOX ')' +# define SYNCTEX_CHAR_ANCHOR '!' +# define SYNCTEX_CHAR_VOID_VBOX 'v' +# define SYNCTEX_CHAR_VOID_HBOX 'h' +# define SYNCTEX_CHAR_KERN 'k' +# define SYNCTEX_CHAR_GLUE 'g' +# define SYNCTEX_CHAR_MATH '$' +# define SYNCTEX_CHAR_BOUNDARY 'x' + +# define SYNCTEX_RETURN(STATUS) return STATUS; + +/* Used when parsing the synctex file. A '{' character has just been parsed. + * The purpose is to gobble everything until the closing '}'. + * Actually only one nesting depth has been observed when using the clip option + * of \includegraphics option. Here we use arbitrary level of depth. + */ +synctex_status_t _synctex_scan_nested_sheet(synctex_scanner_t scanner) { + unsigned int depth = 0; +deeper: + ++depth; + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Unexpected end of nested sheet (1)."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } +scan_next_line: + if (SYNCTEX_CUR<SYNCTEX_END) { + if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) { + ++SYNCTEX_CUR; + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Unexpected end of nested sheet (2)."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + if (--depth>0) { + goto scan_next_line; + } else { + SYNCTEX_RETURN(SYNCTEX_STATUS_OK); + } + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_SHEET) { + ++SYNCTEX_CUR; + goto deeper; + + } else if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Unexpected end of nested sheet (3)."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + } + _synctex_error("Unexpected end of nested sheet (4)."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); +} + /* Used when parsing the synctex file. * The sheet argument is a newly created sheet node that will hold the contents. * Something is returned in case of error. @@ -1880,19 +1937,19 @@ synctex_status_t _synctex_scan_sheet(synctex_scanner_t scanner, synctex_node_t s synctex_info_t * info = NULL; synctex_status_t status = 0; size_t available = 0; - if((NULL == scanner) || (NULL == sheet)) { + if ((NULL == scanner) || (NULL == sheet)) { return SYNCTEX_STATUS_BAD_ARGUMENT; } /* We MUST start with a box, so at this level, the unique possibility is '[', '(' or "}". */ prepare_loop: - if(SYNCTEX_CUR<SYNCTEX_END) { - if(*SYNCTEX_CUR == '[') { + if (SYNCTEX_CUR<SYNCTEX_END) { + if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_VBOX) { scan_vbox: ++SYNCTEX_CUR; - if((child = _synctex_new_vbox(scanner)) && (info = SYNCTEX_INFO(child))) { + if ((child = _synctex_new_vbox(scanner)) && (info = SYNCTEX_INFO(child))) { # define SYNCTEX_DECODE_FAILED(WHAT) \ (_synctex_decode_int(scanner,&(info[WHAT].INT))<SYNCTEX_STATUS_OK) - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -1901,7 +1958,6 @@ scan_vbox: || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad vbox record."); - #define SYNCTEX_RETURN(STATUS) return STATUS; SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_CHILD(parent,child); @@ -1912,11 +1968,11 @@ scan_vbox: _synctex_error("Can't create vbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == '(') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_HBOX) { scan_hbox: ++SYNCTEX_CUR; - if((child = _synctex_new_hbox(scanner)) && (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if ((child = _synctex_new_hbox(scanner)) && (info = SYNCTEX_INFO(child))) { + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -1938,19 +1994,27 @@ scan_hbox: _synctex_error("Can't create hbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == '}') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) { scan_teehs: ++SYNCTEX_CUR; - if(NULL == parent || parent->class->type != synctex_node_type_sheet + if (NULL == parent || parent->class->type != synctex_node_type_sheet || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Unexpected end of sheet."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_RETURN(SYNCTEX_STATUS_OK); - } else if(*SYNCTEX_CUR == '!') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_SHEET) { + /* Addendum to version 1.10 to manage nested sheets */ + ++SYNCTEX_CUR; + if (_synctex_scan_nested_sheet(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Unexpected nested sheet."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + goto prepare_loop; + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_ANCHOR) { scan_anchor: ++SYNCTEX_CUR; - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Missing anchor."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } @@ -1958,7 +2022,7 @@ scan_anchor: } else { /* _synctex_error("Ignored record %c\n",*SYNCTEX_CUR); */ ++SYNCTEX_CUR; - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Unexpected end."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } @@ -1967,7 +2031,7 @@ scan_anchor: } else { available = 1; status = _synctex_buffer_get_available_size(scanner,&available); - if(status<SYNCTEX_STATUS_OK && available>0){ + if (status<SYNCTEX_STATUS_OK && available>0){ _synctex_error("Uncomplete sheet(0)"); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } else { @@ -1978,38 +2042,38 @@ scan_anchor: /* The child loop means that we go do one level, when we just created a box node, * the next node created is a child of this box. */ child_loop: - if(SYNCTEX_CUR<SYNCTEX_END) { - if(*SYNCTEX_CUR == '[') { + if (SYNCTEX_CUR<SYNCTEX_END) { + if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_VBOX) { goto scan_vbox; - } else if(*SYNCTEX_CUR == ']') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_VBOX) { scan_xobv: ++SYNCTEX_CUR; - if(NULL != parent && parent->class->type == synctex_node_type_vbox) { + if (NULL != parent && parent->class->type == synctex_node_type_vbox) { #define SYNCTEX_UPDATE_BOX_FRIEND(NODE)\ friend_index = ((SYNCTEX_INFO(NODE))[SYNCTEX_TAG_IDX].INT+(SYNCTEX_INFO(NODE))[SYNCTEX_LINE_IDX].INT)%(scanner->number_of_lists);\ SYNCTEX_SET_FRIEND(NODE,(scanner->lists_of_friends)[friend_index]);\ (scanner->lists_of_friends)[friend_index] = NODE; - if(NULL == SYNCTEX_CHILD(parent)) { + if (NULL == SYNCTEX_CHILD(parent)) { /* only void boxes are friends */ SYNCTEX_UPDATE_BOX_FRIEND(parent); } child = parent; parent = SYNCTEX_PARENT(child); } else { - _synctex_error("Unexpected ']', ignored."); + _synctex_error("Unexpected end of vbox, ignored."); } - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Uncomplete sheet."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } goto sibling_loop; - } else if(*SYNCTEX_CUR == '(') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_HBOX) { goto scan_hbox; - } else if(*SYNCTEX_CUR == ')') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_HBOX) { scan_xobh: ++SYNCTEX_CUR; - if((parent) && parent->class->type == synctex_node_type_hbox) { - if(NULL == child) { + if ((parent) && parent->class->type == synctex_node_type_hbox) { + if (NULL == child) { /* Only boxes with no children are friends, * boxes with children are indirectly friends through one of their descendants. */ SYNCTEX_UPDATE_BOX_FRIEND(parent); @@ -2020,18 +2084,18 @@ scan_xobh: child = parent; parent = SYNCTEX_PARENT(child); } else { - _synctex_error("Unexpected ')', ignored."); + _synctex_error("Unexpected enf of hbox, ignored."); } - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Uncomplete sheet."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } goto sibling_loop; - } else if(*SYNCTEX_CUR == 'v') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_VBOX) { ++SYNCTEX_CUR; - if(NULL != (child = _synctex_new_void_vbox(scanner)) + if (NULL != (child = _synctex_new_void_vbox(scanner)) && NULL != (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2053,11 +2117,11 @@ scan_xobh: _synctex_error("Can't create vbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'h') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_HBOX) { ++SYNCTEX_CUR; - if(NULL != (child = _synctex_new_void_hbox(scanner)) + if (NULL != (child = _synctex_new_void_hbox(scanner)) && NULL != (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2077,11 +2141,11 @@ scan_xobh: _synctex_error("Can't create void hbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'k') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_KERN) { ++SYNCTEX_CUR; - if(NULL != (child = _synctex_new_kern(scanner)) + if (NULL != (child = _synctex_new_kern(scanner)) && NULL != (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2099,11 +2163,11 @@ scan_xobh: _synctex_error("Can't create kern record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'g') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_GLUE) { ++SYNCTEX_CUR; - if(NULL != (child = _synctex_new_glue(scanner)) + if (NULL != (child = _synctex_new_glue(scanner)) && NULL != (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2119,11 +2183,11 @@ scan_xobh: _synctex_error("Can't create glue record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == '$') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_MATH) { ++SYNCTEX_CUR; - if(NULL != (child = _synctex_new_math(scanner)) + if (NULL != (child = _synctex_new_math(scanner)) && NULL != (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2139,11 +2203,11 @@ scan_xobh: _synctex_error("Can't create math record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'x') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BOUNDARY) { ++SYNCTEX_CUR; - if(NULL != (child = _synctex_new_boundary(scanner)) + if (NULL != (child = _synctex_new_boundary(scanner)) && NULL != (info = SYNCTEX_INFO(child))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2159,14 +2223,22 @@ scan_xobh: _synctex_error("Can't create math record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == '}') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) { goto scan_teehs; - } else if(*SYNCTEX_CUR == '!') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_SHEET) { + /* Addendum to version 1.10 to manage nested sheets */ + ++SYNCTEX_CUR; + if (_synctex_scan_nested_sheet(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Unexpected nested sheet."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + goto child_loop; + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_ANCHOR) { goto scan_anchor; } else { /* _synctex_error("Ignored record %c\n",*SYNCTEX_CUR); */ ++SYNCTEX_CUR; - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Unexpected end."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } @@ -2175,7 +2247,7 @@ scan_xobh: } else { available = 1; status = _synctex_buffer_get_available_size(scanner,&available); - if(status<SYNCTEX_STATUS_OK && available>0){ + if (status<SYNCTEX_STATUS_OK && available>0){ _synctex_error("Uncomplete sheet(0)"); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } else { @@ -2186,12 +2258,12 @@ scan_xobh: /* The vertical loop means that we are on the same level, for example when we just ended a box. * If a node is created now, it will be a sibling of the current node, sharing the same parent. */ sibling_loop: - if(SYNCTEX_CUR<SYNCTEX_END) { - if(*SYNCTEX_CUR == '[') { + if (SYNCTEX_CUR<SYNCTEX_END) { + if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_VBOX) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_vbox(scanner)) + if (NULL != (sibling = _synctex_new_vbox(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2210,13 +2282,13 @@ sibling_loop: _synctex_error("Can't create vbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == ']') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_VBOX) { goto scan_xobv; - } else if(*SYNCTEX_CUR == '(') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_HBOX) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_hbox(scanner)) && + if (NULL != (sibling = _synctex_new_hbox(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2239,13 +2311,13 @@ sibling_loop: _synctex_error("Can't create hbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == ')') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_HBOX) { goto scan_xobh; - } else if(*SYNCTEX_CUR == 'v') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_VBOX) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_void_vbox(scanner)) && + if (NULL != (sibling = _synctex_new_void_vbox(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2264,11 +2336,11 @@ sibling_loop: _synctex_error("can't create void vbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'h') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_HBOX) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_void_hbox(scanner)) && + if (NULL != (sibling = _synctex_new_void_hbox(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2289,11 +2361,11 @@ sibling_loop: _synctex_error("can't create void hbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'k') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_KERN) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_kern(scanner)) + if (NULL != (sibling = _synctex_new_kern(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2312,11 +2384,11 @@ sibling_loop: _synctex_error("Can't create kern record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'g') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_GLUE) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_glue(scanner)) + if (NULL != (sibling = _synctex_new_glue(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2333,11 +2405,11 @@ sibling_loop: _synctex_error("Can't create glue record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == '$') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_MATH) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_math(scanner)) + if (NULL != (sibling = _synctex_new_math(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2354,11 +2426,11 @@ sibling_loop: _synctex_error("Can't create math record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'x') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BOUNDARY) { ++SYNCTEX_CUR; - if(NULL != (sibling = _synctex_new_boundary(scanner)) + if (NULL != (sibling = _synctex_new_boundary(scanner)) && NULL != (info = SYNCTEX_INFO(sibling))) { - if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + if (SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) @@ -2375,11 +2447,11 @@ sibling_loop: _synctex_error("Can't create boundary record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == '}') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) { goto scan_teehs; - } else if(*SYNCTEX_CUR == '!') { + } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_ANCHOR) { ++SYNCTEX_CUR; - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Missing anchor (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } @@ -2387,7 +2459,7 @@ sibling_loop: } else { ++SYNCTEX_CUR; /* _synctex_error("Ignored record %c(2)\n",*SYNCTEX_CUR); */ - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } goto sibling_loop; @@ -2395,7 +2467,7 @@ sibling_loop: } else { available = 1; status = _synctex_buffer_get_available_size(scanner,&available); - if(status<SYNCTEX_STATUS_OK && available>0){ + if (status<SYNCTEX_STATUS_OK && available>0){ goto sibling_loop; } else { _synctex_error("Uncomplete sheet(2)"); @@ -2410,14 +2482,14 @@ sibling_loop: synctex_status_t _synctex_scan_content(synctex_scanner_t scanner) { synctex_node_t sheet = NULL; synctex_status_t status = 0; - if(NULL == scanner) { + if (NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } /* set up the lists of friends */ - if(NULL == scanner->lists_of_friends) { + if (NULL == scanner->lists_of_friends) { scanner->number_of_lists = 1024; scanner->lists_of_friends = (synctex_node_t *)_synctex_malloc(scanner->number_of_lists*sizeof(synctex_node_t)); - if(NULL == scanner->lists_of_friends) { + if (NULL == scanner->lists_of_friends) { _synctex_error("malloc:2"); return SYNCTEX_STATUS_ERROR; } @@ -2425,26 +2497,26 @@ synctex_status_t _synctex_scan_content(synctex_scanner_t scanner) { /* Find where this section starts */ content_not_found: status = _synctex_match_string(scanner,"Content:"); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { return status; } - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Uncomplete Content."); return SYNCTEX_STATUS_ERROR; } - if(status == SYNCTEX_STATUS_NOT_OK) { + if (status == SYNCTEX_STATUS_NOT_OK) { goto content_not_found; } next_sheet: - if(*SYNCTEX_CUR != '{') { + if (*SYNCTEX_CUR != SYNCTEX_CHAR_BEGIN_SHEET) { status = _synctex_scan_postamble(scanner); - if(status < SYNCTEX_STATUS_EOF) { + if (status < SYNCTEX_STATUS_EOF) { _synctex_error("Bad content."); return status; } - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { status = _synctex_next_line(scanner); - if(status < SYNCTEX_STATUS_OK) { + if (status < SYNCTEX_STATUS_OK) { _synctex_error("Bad content."); return status; } @@ -2456,19 +2528,19 @@ next_sheet: /* Create a new sheet node */ sheet = _synctex_new_sheet(scanner); status = _synctex_decode_int(scanner,&(SYNCTEX_PAGE(sheet))); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("Missing sheet number."); bail: SYNCTEX_FREE(sheet); return SYNCTEX_STATUS_ERROR; } status = _synctex_next_line(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("Uncomplete file."); goto bail; } status = _synctex_scan_sheet(scanner,sheet); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("Bad sheet content."); goto bail; } @@ -2478,7 +2550,7 @@ bail: /* Now read the list of Inputs between 2 sheets. */ do { status = _synctex_scan_input(scanner); - if(status<SYNCTEX_STATUS_EOF) { + if (status<SYNCTEX_STATUS_EOF) { _synctex_error("Bad input section."); goto bail; } @@ -2494,39 +2566,39 @@ synctex_scanner_t synctex_scanner_new_with_output_file(const char * output, cons gzFile file = NULL; char * synctex = NULL; synctex_scanner_t scanner = NULL; - synctex_io_mode_t io_mode = synctex_io_mode_read; + synctex_io_mode_t io_mode = 0; /* Here we assume that int are smaller than void * */ - if(sizeof(int)>sizeof(void*)) { + if (sizeof(int)>sizeof(void*)) { _synctex_error("INTERNAL INCONSISTENCY: int's are unexpectedly bigger than pointers, bailing out."); return NULL; } /* We ensure that SYNCTEX_BUFFER_SIZE < UINT_MAX, I don't know if it makes sense... */ - if(SYNCTEX_BUFFER_SIZE >= UINT_MAX) { + if (SYNCTEX_BUFFER_SIZE >= UINT_MAX) { _synctex_error("SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (1)"); return NULL; } /* for integers: */ - if(SYNCTEX_BUFFER_SIZE < SYNCTEX_BUFFER_MIN_SIZE) { + if (SYNCTEX_BUFFER_SIZE < SYNCTEX_BUFFER_MIN_SIZE) { _synctex_error("SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (2)"); return NULL; } /* now open the synctex file */ - if(_synctex_open(output,build_directory,&synctex,&file,synctex_NO,&io_mode) || !file) { - if(_synctex_open(output,build_directory,&synctex,&file,synctex_YES,&io_mode) || !file) { + if (_synctex_open(output,build_directory,&synctex,&file,synctex_ADD_QUOTES,&io_mode) || !file) { + if (_synctex_open(output,build_directory,&synctex,&file,synctex_DONT_ADD_QUOTES,&io_mode) || !file) { return NULL; } } scanner = (synctex_scanner_t)_synctex_malloc(sizeof(_synctex_scanner_t)); - if(NULL == scanner) { + if (NULL == scanner) { _synctex_error("SyncTeX: malloc problem"); free(synctex); gzclose(file); return NULL; } /* make a private copy of output for the scanner */ - if(NULL == (scanner->output = (char *)malloc(strlen(output)+1))){ + if (NULL == (scanner->output = (char *)malloc(strlen(output)+1))){ _synctex_error("! synctex_scanner_new_with_output_file: Memory problem (2), scanner's output is not reliable."); - } else if(scanner->output != strcpy(scanner->output,output)) { + } else if (scanner->output != strcpy(scanner->output,output)) { _synctex_error("! synctex_scanner_new_with_output_file: Copy problem, scanner's output is not reliable."); } scanner->synctex = synctex;/* Now the scanner owns synctex */ @@ -2534,87 +2606,87 @@ synctex_scanner_t synctex_scanner_new_with_output_file(const char * output, cons return parse? synctex_scanner_parse(scanner):scanner; } -int __synctex_open(const char * output, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef); +int __synctex_open(const char * output, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_mode_ref); /* This functions opens the file at the "output" given location. - * It manages the problem of quoted filenames that appear with pdftex an filenames containing the space character. + * It manages the problem of quoted filenames that appear with pdftex and filenames containing the space character. * In TeXLive 2008, the synctex file created with pdftex did contain unexpected quotes. * This function will remove them if possible. + * All the reference arguments will take a value on return. They must be non NULL. * 0 on success, non 0 on error. */ -int __synctex_open(const char * output, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef) { -# define synctex_name (*synctex_name_ref) -# define the_file (*file_ref) - if(synctex_name_ref && file_ref) { - char * quoteless = NULL; - synctex_io_mode_t io_mode = *io_modeRef; - const char * mode = synctex_io_modes[io_mode]; +int __synctex_open(const char * output, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_mode_ref) { + if (synctex_name_ref && file_ref && io_mode_ref) { + /* 1 local variables that uses dynamic memory */ + char * synctex_name = NULL; + gzFile the_file = NULL; + char * quoteless_synctex_name = NULL; size_t size = 0; + synctex_io_mode_t io_mode = *io_mode_ref; + const char * mode = _synctex_get_io_mode_name(io_mode); /* now create the synctex file name */ size = strlen(output)+strlen(synctex_suffix)+strlen(synctex_suffix_gz)+1; synctex_name = (char *)malloc(size); - if(NULL == synctex_name) { + if (NULL == synctex_name) { _synctex_error("! __synctex_open: Memory problem (1)\n"); return 1; } - /* we have reserved for synctex enough memory to copy output, both suffices and 2 quotes, + /* we have reserved for synctex enough memory to copy output (including its 2 eventual quotes), both suffices, * including the terminating character. size is free now. */ - if(synctex_name != strcpy(synctex_name,output)) { + if (synctex_name != strcpy(synctex_name,output)) { _synctex_error("! __synctex_open: Copy problem\n"); return_on_error: free(synctex_name); - synctex_name = NULL;/* Don't forget to reinitialize. */ - the_file = NULL; /* Here as well */ - free(quoteless); + free(quoteless_synctex_name); return 2; } /* remove the last path extension if any */ _synctex_strip_last_path_extension(synctex_name); - if(!strlen(synctex_name)) { + if (!strlen(synctex_name)) { goto return_on_error; } /* now insert quotes. */ - if(add_quotes) { + if (add_quotes) { char * quoted = NULL; - if(_synctex_copy_with_quoting_last_path_component(synctex_name,"ed,size) || (NULL == quoted)) { + if (_synctex_copy_with_quoting_last_path_component(synctex_name,"ed,size) || (NULL == quoted)) { /* There was an error or quoting does not make sense: */ goto return_on_error; } - quoteless = synctex_name; + quoteless_synctex_name = synctex_name; synctex_name = quoted; } - /* Now add the first path extension. */ - if(synctex_name != strcat(synctex_name,synctex_suffix)){ + /* Now add to synctex_name the first path extension. */ + if (synctex_name != strcat(synctex_name,synctex_suffix)){ _synctex_error("! __synctex_open: Concatenation problem (can't add suffix '%s')\n",synctex_suffix); goto return_on_error; } - /* To quoteless as well. */ - if(quoteless && (quoteless != strcat(quoteless,synctex_suffix))){ - free(quoteless); - quoteless = NULL; + /* Add to quoteless_synctex_name as well, if relevant. */ + if (quoteless_synctex_name && (quoteless_synctex_name != strcat(quoteless_synctex_name,synctex_suffix))){ + free(quoteless_synctex_name); + quoteless_synctex_name = NULL; } - if(NULL == (the_file = gzopen(synctex_name,mode))) { + if (NULL == (the_file = gzopen(synctex_name,mode))) { /* Could not open this file */ - if(errno != ENOENT) { - /* The file does exist, this is a lower lever error, I can't do anything. */ + if (errno != ENOENT) { + /* The file does exist, this is a lower level error, I can't do anything. */ _synctex_error("SyncTeX: could not open %s, error %i\n",synctex_name,errno); goto return_on_error; } - /* Try the compressed version */ - if(synctex_name != strcat(synctex_name,synctex_suffix_gz)){ + /* Apparently, there is no uncompressed synctex file. Try the compressed version */ + if (synctex_name != strcat(synctex_name,synctex_suffix_gz)){ _synctex_error("! __synctex_open: Concatenation problem (can't add suffix '%s')\n",synctex_suffix_gz); goto return_on_error; } - ++io_mode; - mode = synctex_io_modes[io_mode]; /* the file is a compressed and is a binary file, this caused errors on Windows */ - /* To quoteless as well. */ - if(quoteless && (quoteless != strcat(quoteless,synctex_suffix_gz))){ - free(quoteless); - quoteless = NULL; + io_mode |= synctex_io_gz_mask; + mode = _synctex_get_io_mode_name(io_mode); /* the file is a compressed and is a binary file, this caused errors on Windows */ + /* Add the suffix to the quoteless_synctex_name as well. */ + if (quoteless_synctex_name && (quoteless_synctex_name != strcat(quoteless_synctex_name,synctex_suffix_gz))){ + free(quoteless_synctex_name); + quoteless_synctex_name = NULL; } - if(NULL == (the_file = gzopen(synctex_name,mode))) { + if (NULL == (the_file = gzopen(synctex_name,mode))) { /* Could not open this file */ - if(errno != ENOENT) { - /* The file does exist, this is a lower lever error, I can't do anything. */ + if (errno != ENOENT) { + /* The file does exist, this is a lower level error, I can't do anything. */ _synctex_error("SyncTeX: could not open %s, error %i\n",synctex_name,errno); } goto return_on_error; @@ -2622,82 +2694,84 @@ return_on_error: } /* At this point, the file is properly open. * If we are in the add_quotes mode, we change the file name by removing the quotes. */ - if(quoteless) { + if (quoteless_synctex_name) { gzclose(the_file); - if(rename(synctex_name,quoteless)) { - _synctex_error("SyncTeX: could not rename %s to %s, error %i\n",synctex_name,quoteless,errno); - /* Reopen the file. */ - if(NULL == (the_file = gzopen(synctex_name,mode))) { - /* Could not open this file */ - if(errno != ENOENT) { - /* The file does exist, this is a lower lever error, I can't do anything. */ + if (rename(synctex_name,quoteless_synctex_name)) { + _synctex_error("SyncTeX: could not rename %s to %s, error %i\n",synctex_name,quoteless_synctex_name,errno); + /* We could not rename, reopen the file with the quoted name. */ + if (NULL == (the_file = gzopen(synctex_name,mode))) { + /* No luck, could not re open this file, something has happened meanwhile */ + if (errno != ENOENT) { + /* The file does not exist any more, it has certainly be removed somehow + * this is a lower level error, I can't do anything. */ _synctex_error("SyncTeX: could not open again %s, error %i\n",synctex_name,errno); } goto return_on_error; } } else { - if(NULL == (the_file = gzopen(quoteless,mode))) { + /* The file has been successfully renamed */ + if (NULL == (the_file = gzopen(quoteless_synctex_name,mode))) { /* Could not open this file */ - if(errno != ENOENT) { - /* The file does exist, this is a lower lever error, I can't do anything. */ - _synctex_error("SyncTeX: could not open renamed %s, error %i\n",quoteless,errno); + if (errno != ENOENT) { + /* The file does exist, this is a lower level error, I can't do anything. */ + _synctex_error("SyncTeX: could not open renamed %s, error %i\n",quoteless_synctex_name,errno); } goto return_on_error; } /* The quote free file name should replace the old one:*/ free(synctex_name); - synctex_name = quoteless; - quoteless = NULL; + synctex_name = quoteless_synctex_name; + quoteless_synctex_name = NULL; } } - /* We are returning properly so we can also return the proper io_mode */ - *io_modeRef = io_mode; + /* The operation is successfull, return the arguments by value. */ + * file_ref = the_file; + * io_mode_ref = io_mode; + * synctex_name_ref = synctex_name; return 0; } return 3; /* Bad parameter. */ -# undef synctex_name -# undef the_file } /* Opens the ouput file, taking into account the eventual build_directory. * 0 on success, non 0 on error. */ -int _synctex_open(const char * output, const char * build_directory, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef) { +int _synctex_open(const char * output, const char * build_directory, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_mode_ref) { # define synctex_name (*synctex_name_ref) # define the_file (*file_ref) - int result = __synctex_open(output,synctex_name_ref,file_ref,add_quotes,io_modeRef); - if((result || !*file_ref) && build_directory && strlen(build_directory)) { + int result = __synctex_open(output,synctex_name_ref,file_ref,add_quotes,io_mode_ref); + if ((result || !*file_ref) && build_directory && strlen(build_directory)) { char * build_output; - const char * lpc; + const char *lpc; size_t size; synctex_bool_t is_absolute; build_output = NULL; lpc = _synctex_last_path_component(output); - size = strlen(build_directory)+strlen(lpc)+2; + size = strlen(build_directory)+strlen(lpc)+2; /* One for the '/' and one for the '\0'. */ is_absolute = _synctex_path_is_absolute(build_directory); - if(!is_absolute) { + if (!is_absolute) { size += strlen(output); } - if((build_output = (char *)malloc(size))) { - if(is_absolute) { + if ((build_output = (char *)malloc(size))) { + if (is_absolute) { build_output[0] = '\0'; } else { - if(build_output != strcpy(build_output,output)) { + if (build_output != strcpy(build_output,output)) { return -4; } build_output[lpc-output]='\0'; } - if(build_output == strcat(build_output,build_directory)) { + if (build_output == strcat(build_output,build_directory)) { /* Append a path separator if necessary. */ - if(!SYNCTEX_IS_PATH_SEPARATOR(build_output[strlen(build_directory)-1])) { - if(build_output != strcat(build_output,"/")) { + if (!SYNCTEX_IS_PATH_SEPARATOR(build_output[strlen(build_directory)-1])) { + if (build_output != strcat(build_output,"/")) { return -2; } } /* Append the last path component of the output. */ - if(build_output != strcat(build_output,lpc)) { + if (build_output != strcat(build_output,lpc)) { return -3; } - return __synctex_open(build_output,synctex_name_ref,file_ref,add_quotes,io_modeRef); + return __synctex_open(build_output,synctex_name_ref,file_ref,add_quotes,io_mode_ref); } } return -1; @@ -2710,10 +2784,10 @@ int _synctex_open(const char * output, const char * build_directory, char ** syn /* The scanner destructor */ void synctex_scanner_free(synctex_scanner_t scanner) { - if(NULL == scanner) { + if (NULL == scanner) { return; } - if(SYNCTEX_FILE) { + if (SYNCTEX_FILE) { gzclose(SYNCTEX_FILE); SYNCTEX_FILE = NULL; } @@ -2730,7 +2804,7 @@ void synctex_scanner_free(synctex_scanner_t scanner) { /* Where the synctex scanner parses the contents of the file. */ synctex_scanner_t synctex_scanner_parse(synctex_scanner_t scanner) { synctex_status_t status = 0; - if(!scanner || scanner->flags.has_parsed) { + if (!scanner || scanner->flags.has_parsed) { return scanner; } scanner->flags.has_parsed=1; @@ -2761,7 +2835,7 @@ synctex_scanner_t synctex_scanner_parse(synctex_scanner_t scanner) { scanner->class[synctex_node_type_boundary] = synctex_class_boundary; (scanner->class[synctex_node_type_boundary]).scanner = scanner; SYNCTEX_START = (char *)malloc(SYNCTEX_BUFFER_SIZE+1); /* one more character for null termination */ - if(NULL == SYNCTEX_START) { + if (NULL == SYNCTEX_START) { _synctex_error("SyncTeX: malloc error"); synctex_scanner_free(scanner); return NULL; @@ -2773,14 +2847,14 @@ synctex_scanner_t synctex_scanner_parse(synctex_scanner_t scanner) { *SYNCTEX_END = '\0'; SYNCTEX_CUR = SYNCTEX_END; status = _synctex_scan_preamble(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("SyncTeX Error: Bad preamble\n"); bailey: synctex_scanner_free(scanner); return NULL; } status = _synctex_scan_content(scanner); - if(status<SYNCTEX_STATUS_OK) { + if (status<SYNCTEX_STATUS_OK) { _synctex_error("SyncTeX Error: Bad content\n"); goto bailey; } @@ -2792,13 +2866,13 @@ bailey: /* Final tuning: set the default values for various parameters */ /* 1 pre_unit = (scanner->pre_unit)/65536 pt = (scanner->pre_unit)/65781.76 bp * 1 pt = 65536 sp */ - if(scanner->pre_unit<=0) { + if (scanner->pre_unit<=0) { scanner->pre_unit = 8192; } - if(scanner->pre_magnification<=0) { + if (scanner->pre_magnification<=0) { scanner->pre_magnification = 1000; } - if(scanner->unit <= 0) { + if (scanner->unit <= 0) { /* no post magnification */ scanner->unit = scanner->pre_unit / 65781.76;/* 65781.76 or 65536.0*/ } else { @@ -2806,7 +2880,7 @@ bailey: scanner->unit *= scanner->pre_unit / 65781.76; } scanner->unit *= scanner->pre_magnification / 1000.0; - if(scanner->x_offset > 6e23) { + if (scanner->x_offset > 6e23) { /* no post offset */ scanner->x_offset = scanner->pre_x_offset * (scanner->pre_unit / 65781.76); scanner->y_offset = scanner->pre_y_offset * (scanner->pre_unit / 65781.76); @@ -2837,7 +2911,7 @@ float synctex_scanner_magnification(synctex_scanner_t scanner){ return scanner?scanner->unit:1; } void synctex_scanner_display(synctex_scanner_t scanner) { - if(NULL == scanner) { + if (NULL == scanner) { return; } printf("The scanner:\noutput:%s\noutput_fmt:%s\nversion:%i\n",scanner->output,scanner->output_fmt,scanner->version); @@ -2846,11 +2920,11 @@ void synctex_scanner_display(synctex_scanner_t scanner) { scanner->count,scanner->unit,scanner->x_offset,scanner->y_offset); printf("The input:\n"); SYNCTEX_DISPLAY(scanner->input); - if(scanner->count<1000) { + if (scanner->count<1000) { printf("The sheets:\n"); SYNCTEX_DISPLAY(scanner->sheet); printf("The friends:\n"); - if(scanner->lists_of_friends) { + if (scanner->lists_of_friends) { int i = scanner->number_of_lists; synctex_node_t node; while(i--) { @@ -2873,12 +2947,12 @@ void synctex_scanner_display(synctex_scanner_t scanner) { /* Public*/ const char * synctex_scanner_get_name(synctex_scanner_t scanner,int tag) { synctex_node_t input = NULL; - if(NULL == scanner) { + if (NULL == scanner) { return NULL; } input = scanner->input; do { - if(tag == SYNCTEX_TAG(input)) { + if (tag == SYNCTEX_TAG(input)) { return (SYNCTEX_NAME(input)); } } while((input = SYNCTEX_SIBLING(input)) != NULL); @@ -2888,12 +2962,12 @@ const char * synctex_scanner_get_name(synctex_scanner_t scanner,int tag) { int _synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name); int _synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { synctex_node_t input = NULL; - if(NULL == scanner) { + if (NULL == scanner) { return 0; } input = scanner->input; do { - if(_synctex_is_equivalent_file_name(name,(SYNCTEX_NAME(input)))) { + if (_synctex_is_equivalent_file_name(name,(SYNCTEX_NAME(input)))) { return SYNCTEX_TAG(input); } } while((input = SYNCTEX_SIBLING(input)) != NULL); @@ -2902,13 +2976,13 @@ int _synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { int synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { size_t char_index = strlen(name); - if((scanner = synctex_scanner_parse(scanner)) && (0 < char_index)) { + if ((scanner = synctex_scanner_parse(scanner)) && (0 < char_index)) { /* the name is not void */ char_index -= 1; - if(!SYNCTEX_IS_PATH_SEPARATOR(name[char_index])) { + if (!SYNCTEX_IS_PATH_SEPARATOR(name[char_index])) { /* the last character of name is not a path separator */ int result = _synctex_scanner_get_tag(scanner,name); - if(result) { + if (result) { return result; } else { /* the given name was not the one known by TeX @@ -2922,20 +2996,20 @@ int synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { } /* Find the last path separator before relative */ while(relative > name) { - if(SYNCTEX_IS_PATH_SEPARATOR(*(relative-1))) { + if (SYNCTEX_IS_PATH_SEPARATOR(*(relative-1))) { break; } relative -= 1; } - if((relative > name) && (result = _synctex_scanner_get_tag(scanner,relative))) { + if ((relative > name) && (result = _synctex_scanner_get_tag(scanner,relative))) { return result; } - if(SYNCTEX_IS_PATH_SEPARATOR(name[0])) { + if (SYNCTEX_IS_PATH_SEPARATOR(name[0])) { /* No tag found for the given absolute name, * Try each relative path starting from the shortest one */ while(0<char_index) { char_index -= 1; - if(SYNCTEX_IS_PATH_SEPARATOR(name[char_index]) + if (SYNCTEX_IS_PATH_SEPARATOR(name[char_index]) && (result = _synctex_scanner_get_tag(scanner,name+char_index+1))) { return result; } @@ -2964,84 +3038,84 @@ const char * synctex_scanner_get_synctex(synctex_scanner_t scanner) { # pragma mark Public node attributes # endif int synctex_node_h(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } return SYNCTEX_HORIZ(node); } int synctex_node_v(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } return SYNCTEX_VERT(node); } int synctex_node_width(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } return SYNCTEX_WIDTH(node); } int synctex_node_box_h(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } - if(SYNCTEX_IS_BOX(node)) { + if (SYNCTEX_IS_BOX(node)) { result: return SYNCTEX_HORIZ(node); } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } int synctex_node_box_v(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } - if(SYNCTEX_IS_BOX(node)) { + if (SYNCTEX_IS_BOX(node)) { result: return SYNCTEX_VERT(node); } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } int synctex_node_box_width(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } - if(SYNCTEX_IS_BOX(node)) { + if (SYNCTEX_IS_BOX(node)) { result: return SYNCTEX_WIDTH(node); } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } int synctex_node_box_height(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } - if(SYNCTEX_IS_BOX(node)) { + if (SYNCTEX_IS_BOX(node)) { result: return SYNCTEX_HEIGHT(node); } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } int synctex_node_box_depth(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } - if(SYNCTEX_IS_BOX(node)) { + if (SYNCTEX_IS_BOX(node)) { result: return SYNCTEX_DEPTH(node); } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; @@ -3051,25 +3125,25 @@ result: # pragma mark Public node visible attributes # endif float synctex_node_visible_h(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } return SYNCTEX_HORIZ(node)*node->class->scanner->unit+node->class->scanner->x_offset; } float synctex_node_visible_v(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } return SYNCTEX_VERT(node)*node->class->scanner->unit+node->class->scanner->y_offset; } float synctex_node_visible_width(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } return SYNCTEX_WIDTH(node)*node->class->scanner->unit; } float synctex_node_box_visible_h(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } switch(node->class->type) { @@ -3081,13 +3155,13 @@ float synctex_node_box_visible_h(synctex_node_t node){ result: return SYNCTEX_HORIZ_V(node)*node->class->scanner->unit+node->class->scanner->x_offset; } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } float synctex_node_box_visible_v(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } switch(node->class->type) { @@ -3099,13 +3173,13 @@ float synctex_node_box_visible_v(synctex_node_t node){ result: return SYNCTEX_VERT_V(node)*node->class->scanner->unit+node->class->scanner->y_offset; } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } float synctex_node_box_visible_width(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } switch(node->class->type) { @@ -3117,13 +3191,13 @@ float synctex_node_box_visible_width(synctex_node_t node){ result: return SYNCTEX_WIDTH_V(node)*node->class->scanner->unit; } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } float synctex_node_box_visible_height(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } switch(node->class->type) { @@ -3135,13 +3209,13 @@ float synctex_node_box_visible_height(synctex_node_t node){ result: return SYNCTEX_HEIGHT_V(node)*node->class->scanner->unit; } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; } float synctex_node_box_visible_depth(synctex_node_t node){ - if(!node) { + if (!node) { return 0; } switch(node->class->type) { @@ -3153,7 +3227,7 @@ float synctex_node_box_visible_depth(synctex_node_t node){ result: return SYNCTEX_DEPTH_V(node)*node->class->scanner->unit; } - if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } return 0; @@ -3165,7 +3239,7 @@ result: int synctex_node_page(synctex_node_t node){ synctex_node_t parent = NULL; - if(!node) { + if (!node) { return -1; } parent = SYNCTEX_PARENT(node); @@ -3173,7 +3247,7 @@ int synctex_node_page(synctex_node_t node){ node = parent; parent = SYNCTEX_PARENT(node); } - if(node->class->type == synctex_node_type_sheet) { + if (node->class->type == synctex_node_type_sheet) { return SYNCTEX_PAGE(node); } return -1; @@ -3196,10 +3270,10 @@ int synctex_node_column(synctex_node_t node) { # endif synctex_node_t synctex_sheet_content(synctex_scanner_t scanner,int page) { - if(scanner) { + if (scanner) { synctex_node_t sheet = scanner->sheet; while(sheet) { - if(page == SYNCTEX_PAGE(sheet)) { + if (page == SYNCTEX_PAGE(sheet)) { return SYNCTEX_CHILD(sheet); } sheet = SYNCTEX_SIBLING(sheet); @@ -3222,7 +3296,7 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i int friend_index = 0; int max_line = 0; synctex_node_t node = NULL; - if(tag == 0) { + if (tag == 0) { printf("SyncTeX Warning: No tag for %s\n",name); return -1; } @@ -3232,12 +3306,12 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i while(line<max_line) { /* This loop will only be performed once for advanced viewers */ friend_index = (tag+line)%(scanner->number_of_lists); - if((node = (scanner->lists_of_friends)[friend_index])) { + if ((node = (scanner->lists_of_friends)[friend_index])) { do { - if((synctex_node_type(node)>=synctex_node_type_boundary) + if ((synctex_node_type(node)>=synctex_node_type_boundary) && (tag == SYNCTEX_TAG(node)) && (line == SYNCTEX_LINE(node))) { - if(SYNCTEX_CUR == SYNCTEX_END) { + if (SYNCTEX_CUR == SYNCTEX_END) { size += 16; SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; @@ -3248,14 +3322,14 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i SYNCTEX_CUR += sizeof(synctex_node_t); } } while((node = SYNCTEX_FRIEND(node))); - if(SYNCTEX_START == NULL) { + if (SYNCTEX_START == NULL) { /* We did not find any matching boundary, retry with glue or kern */ node = (scanner->lists_of_friends)[friend_index];/* no need to test it again, already done */ do { - if((synctex_node_type(node)>=synctex_node_type_kern) + if ((synctex_node_type(node)>=synctex_node_type_kern) && (tag == SYNCTEX_TAG(node)) && (line == SYNCTEX_LINE(node))) { - if(SYNCTEX_CUR == SYNCTEX_END) { + if (SYNCTEX_CUR == SYNCTEX_END) { size += 16; SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; @@ -3266,13 +3340,13 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i SYNCTEX_CUR += sizeof(synctex_node_t); } } while((node = SYNCTEX_FRIEND(node))); - if(SYNCTEX_START == NULL) { + if (SYNCTEX_START == NULL) { /* We did not find any matching glue or kern, retry with boxes */ node = (scanner->lists_of_friends)[friend_index];/* no need to test it again, already done */ do { - if((tag == SYNCTEX_TAG(node)) + if ((tag == SYNCTEX_TAG(node)) && (line == SYNCTEX_LINE(node))) { - if(SYNCTEX_CUR == SYNCTEX_END) { + if (SYNCTEX_CUR == SYNCTEX_END) { size += 16; SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; @@ -3287,7 +3361,7 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i } SYNCTEX_END = SYNCTEX_CUR; /* Now reverse the order to have nodes in display order, and keep just a few nodes */ - if((SYNCTEX_START) && (SYNCTEX_END)) + if ((SYNCTEX_START) && (SYNCTEX_END)) { synctex_node_t * start_ref = (synctex_node_t *)SYNCTEX_START; synctex_node_t * end_ref = (synctex_node_t *)SYNCTEX_END; @@ -3306,10 +3380,10 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i end_ref = (synctex_node_t *)SYNCTEX_START; next_end: end_ref += 1; /* we allways have start_ref<= end_ref*/ - if(end_ref < (synctex_node_t *)SYNCTEX_END) { + if (end_ref < (synctex_node_t *)SYNCTEX_END) { node = *end_ref; while((node = SYNCTEX_PARENT(node))) { - if(SYNCTEX_PARENT(*start_ref) == node) { + if (SYNCTEX_PARENT(*start_ref) == node) { goto next_end; } } @@ -3318,10 +3392,12 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i goto next_end; } start_ref += 1; - SYNCTEX_END = (char *)start_ref; - } + SYNCTEX_END = (char *)start_ref; + SYNCTEX_CUR = NULL;// added on behalf of Jose Alliste + return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t);// added on behalf Jan Sundermeyer + } SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); + // return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); removed on behalf Jan Sundermeyer } # if defined(__SYNCTEX_STRONG_DISPLAY_QUERY__) break; @@ -3333,12 +3409,12 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i } synctex_node_t synctex_next_result(synctex_scanner_t scanner) { - if(NULL == SYNCTEX_CUR) { + if (NULL == SYNCTEX_CUR) { SYNCTEX_CUR = SYNCTEX_START; } else { SYNCTEX_CUR+=sizeof(synctex_node_t); } - if(SYNCTEX_CUR<SYNCTEX_END) { + if (SYNCTEX_CUR<SYNCTEX_END) { return *(synctex_node_t*)SYNCTEX_CUR; } else { return NULL; @@ -3406,7 +3482,7 @@ int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v) { synctex_node_set_t bestNodes = {NULL,NULL}; /* holds the best node */ synctex_distances_t bestDistances = {INT_MAX,INT_MAX}; /* holds the best distances for the best node */ synctex_node_t bestContainer = NULL; /* placeholder */ - if(NULL == (scanner = synctex_scanner_parse(scanner)) || 0 >= scanner->unit) {/* scanner->unit must be >0 */ + if (NULL == (scanner = synctex_scanner_parse(scanner)) || 0 >= scanner->unit) {/* scanner->unit must be >0 */ return 0; } /* Convert the given point to scanner integer coordinates */ @@ -3420,7 +3496,7 @@ int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v) { while((sheet) && SYNCTEX_PAGE(sheet) != page) { sheet = SYNCTEX_SIBLING(sheet); } - if(NULL == sheet) { + if (NULL == sheet) { return -1; } /* Now sheet points to the sheet node with proper page number */ @@ -3429,30 +3505,30 @@ int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v) { * Then we try with the visible box dimensions. * We try to find a non void box containing the hit point. * We browse all the horizontal boxes until we find one containing the hit point. */ - if((node = SYNCTEX_NEXT_HORIZ_BOX(sheet))) { + if ((node = SYNCTEX_NEXT_HORIZ_BOX(sheet))) { do { - if(_synctex_point_in_box(hitPoint,node,synctex_YES)) { + if (_synctex_point_in_box(hitPoint,node,synctex_YES)) { /* Maybe the hitPoint belongs to a contained vertical box. */ end: /* This trick is for catching overlapping boxes */ - if((other_node = SYNCTEX_NEXT_HORIZ_BOX(node))) { + if ((other_node = SYNCTEX_NEXT_HORIZ_BOX(node))) { do { - if(_synctex_point_in_box(hitPoint,other_node,synctex_YES)) { + if (_synctex_point_in_box(hitPoint,other_node,synctex_YES)) { node = _synctex_smallest_container(other_node,node); } } while((other_node = SYNCTEX_NEXT_HORIZ_BOX(other_node))); } /* node is the smallest horizontal box that contains hitPoint. */ - if((bestContainer = _synctex_eq_deepest_container(hitPoint,node,synctex_YES))) { + if ((bestContainer = _synctex_eq_deepest_container(hitPoint,node,synctex_YES))) { node = bestContainer; } _synctex_eq_get_closest_children_in_box(hitPoint,node,&bestNodes,&bestDistances,synctex_YES); - if(bestNodes.right && bestNodes.left) { - if((SYNCTEX_TAG(bestNodes.right)!=SYNCTEX_TAG(bestNodes.left)) + if (bestNodes.right && bestNodes.left) { + if ((SYNCTEX_TAG(bestNodes.right)!=SYNCTEX_TAG(bestNodes.left)) || (SYNCTEX_LINE(bestNodes.right)!=SYNCTEX_LINE(bestNodes.left)) || (SYNCTEX_COLUMN(bestNodes.right)!=SYNCTEX_COLUMN(bestNodes.left))) { - if((SYNCTEX_START = malloc(2*sizeof(synctex_node_t)))) { - if(bestDistances.left>bestDistances.right) { + if ((SYNCTEX_START = malloc(2*sizeof(synctex_node_t)))) { + if (bestDistances.left>bestDistances.right) { ((synctex_node_t *)SYNCTEX_START)[0] = bestNodes.right; ((synctex_node_t *)SYNCTEX_START)[1] = bestNodes.left; } else { @@ -3467,16 +3543,16 @@ end: } /* both nodes have the same input coordinates * We choose the one closest to the hit point */ - if(bestDistances.left>bestDistances.right) { + if (bestDistances.left>bestDistances.right) { bestNodes.left = bestNodes.right; } bestNodes.right = NULL; - } else if(bestNodes.right) { + } else if (bestNodes.right) { bestNodes.left = bestNodes.right; - } else if(!bestNodes.left){ + } else if (!bestNodes.left){ bestNodes.left = node; } - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { + if ((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { * (synctex_node_t *)SYNCTEX_START = bestNodes.left; SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); SYNCTEX_CUR = NULL; @@ -3490,7 +3566,7 @@ end: */ } /* We are not lucky */ - if((node = SYNCTEX_CHILD(sheet))) { + if ((node = SYNCTEX_CHILD(sheet))) { goto end; } return 0; @@ -3511,7 +3587,7 @@ int _synctex_bail(void) { * if node is to the left of the hit point, this distance is negative.*/ int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible); int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible) { - if(node) { + if (node) { int min,med,max; switch(node->class->type) { /* The distance between a point and a box is special. @@ -3534,7 +3610,7 @@ int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, syn min = visible?SYNCTEX_HORIZ_V(node):SYNCTEX_HORIZ(node); max = min + (visible?SYNCTEX_ABS_WIDTH_V(node):SYNCTEX_ABS_WIDTH(node)); /* We allways have min <= max */ - if(hitPoint.h<min) { + if (hitPoint.h<min) { return min - hitPoint.h; /* regions 1+4+7, result is > 0 */ } else if (hitPoint.h>max) { return max - hitPoint.h; /* regions 3+6+9, result is < 0 */ @@ -3550,7 +3626,7 @@ int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, syn min = SYNCTEX_HORIZ(node); max = min + SYNCTEX_ABS_WIDTH(node); /* We allways have min <= max */ - if(hitPoint.h<min) { + if (hitPoint.h<min) { return min - hitPoint.h; /* regions 1+4+7, result is > 0 */ } else if (hitPoint.h>max) { return max - hitPoint.h; /* regions 3+6+9, result is < 0 */ @@ -3564,7 +3640,7 @@ int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, syn * in general, there is no text material in the kern, * this is why we compute the offset relative to the closest edge of the kern.*/ max = SYNCTEX_WIDTH(node); - if(max<0) { + if (max<0) { min = SYNCTEX_HORIZ(node); max = min - max; } else { @@ -3588,7 +3664,7 @@ int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, syn * It means that the best choice should be made according to the situation that occurs * most frequently. */ - if(hitPoint.h<min) { + if (hitPoint.h<min) { return min - hitPoint.h + 1; /* penalty to ensure other nodes are chosen first in case of overlapping ones */ } else if (hitPoint.h>max) { return max - hitPoint.h - 1; /* same kind of penalty */ @@ -3614,7 +3690,7 @@ int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,sync # ifdef __DARWIN_UNIX03 # pragma unused(visible) # endif - if(node) { + if (node) { int min,max; switch(node->class->type) { /* The distance between a point and a box is special. @@ -3638,7 +3714,7 @@ int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,sync max = min + SYNCTEX_ABS_DEPTH_V(node); min -= SYNCTEX_ABS_HEIGHT_V(node); /* We allways have min <= max */ - if(hitPoint.v<min) { + if (hitPoint.v<min) { return min - hitPoint.v; /* regions 1+2+3, result is > 0 */ } else if (hitPoint.v>max) { return max - hitPoint.v; /* regions 7+8+9, result is < 0 */ @@ -3654,7 +3730,7 @@ int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,sync max = min + SYNCTEX_ABS_DEPTH(node); min -= SYNCTEX_ABS_HEIGHT(node); /* We allways have min <= max */ - if(hitPoint.v<min) { + if (hitPoint.v<min) { return min - hitPoint.v; /* regions 1+2+3, result is > 0 */ } else if (hitPoint.v>max) { return max - hitPoint.v; /* regions 7+8+9, result is < 0 */ @@ -3673,26 +3749,26 @@ int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,sync SYNCTEX_INLINE static synctex_node_t _synctex_smallest_container(synctex_node_t node, synctex_node_t other_node) { float height, other_height; - if(SYNCTEX_ABS_WIDTH(node)<SYNCTEX_ABS_WIDTH(other_node)) { + if (SYNCTEX_ABS_WIDTH(node)<SYNCTEX_ABS_WIDTH(other_node)) { return node; } - if(SYNCTEX_ABS_WIDTH(node)>SYNCTEX_ABS_WIDTH(other_node)) { + if (SYNCTEX_ABS_WIDTH(node)>SYNCTEX_ABS_WIDTH(other_node)) { return other_node; } height = SYNCTEX_ABS_DEPTH(node) + SYNCTEX_ABS_HEIGHT(node); other_height = SYNCTEX_ABS_DEPTH(other_node) + SYNCTEX_ABS_HEIGHT(other_node); - if(height<other_height) { + if (height<other_height) { return node; } - if(height>other_height) { + if (height>other_height) { return other_node; } return node; } synctex_bool_t _synctex_point_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible) { - if(node) { - if(0 == _synctex_point_h_distance(hitPoint,node,visible) + if (node) { + if (0 == _synctex_point_h_distance(hitPoint,node,visible) && 0 == _synctex_point_v_distance(hitPoint,node,visible)) { return synctex_YES; } @@ -3705,7 +3781,7 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod # pragma unused(visible) # endif int result = INT_MAX; /* when the distance is meaning less (sheet, input...) */ - if(node) { + if (node) { int minH,maxH,minV,maxV; switch(node->class->type) { /* The distance between a point and a box is special. @@ -3735,22 +3811,22 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod maxV = minV + SYNCTEX_ABS_DEPTH(node); minV -= SYNCTEX_ABS_HEIGHT(node); /* In what region is the point hitPoint=(H,V) ? */ - if(hitPoint.v<minV) { - if(hitPoint.h<minH) { + if (hitPoint.v<minV) { + if (hitPoint.h<minH) { /* This is region 1. The distance to the box is the L1 distance PA. */ result = minV - hitPoint.v + minH - hitPoint.h;/* Integer overflow? probability epsilon */ - } else if(hitPoint.h<=maxH) { + } else if (hitPoint.h<=maxH) { /* This is region 2. The distance to the box is the geometrical distance to the top edge. */ result = minV - hitPoint.v; } else { /* This is region 3. The distance to the box is the L1 distance PB. */ result = minV - hitPoint.v + hitPoint.h - maxH; } - } else if(hitPoint.v<=maxV) { - if(hitPoint.h<minH) { + } else if (hitPoint.v<=maxV) { + if (hitPoint.h<minH) { /* This is region 4. The distance to the box is the geometrical distance to the left edge. */ result = minH - hitPoint.h; - } else if(hitPoint.h<=maxH) { + } else if (hitPoint.h<=maxH) { /* This is region 4. We are inside the box. */ result = 0; } else { @@ -3758,10 +3834,10 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod result = hitPoint.h - maxH; } } else { - if(hitPoint.h<minH) { + if (hitPoint.h<minH) { /* This is region 7. The distance to the box is the L1 distance PC. */ result = hitPoint.v - maxV + minH - hitPoint.h; - } else if(hitPoint.h<=maxH) { + } else if (hitPoint.h<=maxH) { /* This is region 8. The distance to the box is the geometrical distance to the top edge. */ result = hitPoint.v - maxV; } else { @@ -3772,7 +3848,7 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod break; case synctex_node_type_kern: maxH = SYNCTEX_WIDTH(node); - if(maxH<0) { + if (maxH<0) { minH = SYNCTEX_HORIZ(node); maxH = minH - maxH; } else { @@ -3781,19 +3857,19 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod minH += maxH; } minV = SYNCTEX_VERT(node); - if(hitPoint.h<minH) { - if(hitPoint.v>minV) { + if (hitPoint.h<minH) { + if (hitPoint.v>minV) { result = hitPoint.v - minV + minH - hitPoint.h; } else { result = minV - hitPoint.v + minH - hitPoint.h; } } else if (hitPoint.h>maxH) { - if(hitPoint.v>minV) { + if (hitPoint.v>minV) { result = hitPoint.v - minV + hitPoint.h - maxH; } else { result = minV - hitPoint.v + hitPoint.h - maxH; } - } else if(hitPoint.v>minV) { + } else if (hitPoint.v>minV) { result = hitPoint.v - minV; } else { result = minV - hitPoint.v; @@ -3803,13 +3879,13 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod case synctex_node_type_math: minH = SYNCTEX_HORIZ(node); minV = SYNCTEX_VERT(node); - if(hitPoint.h<minH) { - if(hitPoint.v>minV) { + if (hitPoint.h<minH) { + if (hitPoint.v>minV) { result = hitPoint.v - minV + minH - hitPoint.h; } else { result = minV - hitPoint.v + minH - hitPoint.h; } - } else if(hitPoint.v>minV) { + } else if (hitPoint.v>minV) { result = hitPoint.v - minV + hitPoint.h - minH; } else { result = minV - hitPoint.v + hitPoint.h - minH; @@ -3821,31 +3897,31 @@ int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t nod } static synctex_node_t _synctex_eq_deepest_container(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible) { - if(node) { + if (node) { synctex_node_t result = NULL; synctex_node_t child = NULL; switch(node->class->type) { case synctex_node_type_vbox: case synctex_node_type_hbox: /* test the deep nodes first */ - if((child = SYNCTEX_CHILD(node))) { + if ((child = SYNCTEX_CHILD(node))) { do { - if((result = _synctex_eq_deepest_container(hitPoint,child,visible))) { + if ((result = _synctex_eq_deepest_container(hitPoint,child,visible))) { return result; } } while((child = SYNCTEX_SIBLING(child))); } /* is the hit point inside the box? */ - if(_synctex_point_in_box(hitPoint,node,visible)) { + if (_synctex_point_in_box(hitPoint,node,visible)) { /* for vboxes we try to use some node inside. * Walk through the list of siblings until we find the closest one. * Only consider siblings with children. */ - if((node->class->type == synctex_node_type_vbox) && (child = SYNCTEX_CHILD(node))) { + if ((node->class->type == synctex_node_type_vbox) && (child = SYNCTEX_CHILD(node))) { int bestDistance = INT_MAX; do { - if(SYNCTEX_CHILD(child)) { + if (SYNCTEX_CHILD(child)) { int distance = _synctex_node_distance_to_point(hitPoint,child,visible); - if(distance < bestDistance) { + if (distance < bestDistance) { bestDistance = distance; node = child; } @@ -3864,20 +3940,20 @@ static synctex_node_t _synctex_eq_deepest_container(synctex_point_t hitPoint,syn SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef, synctex_bool_t visible); SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef, synctex_bool_t visible) { int result = 0; - if((node = SYNCTEX_CHILD(node))) { + if ((node = SYNCTEX_CHILD(node))) { do { int off7 = _synctex_point_h_distance(hitPoint,node,visible); - if(off7 > 0) { + if (off7 > 0) { /* node is to the right of the hit point. * We compare node and the previously recorded one, through the recorded distance. * If the nodes have the same tag, prefer the one with the smallest line number, * if the nodes also have the same line number, prefer the one with the smallest column. */ - if(bestDistancesRef->right > off7) { + if (bestDistancesRef->right > off7) { bestDistancesRef->right = off7; bestNodesRef->right = node; result |= SYNCTEX_MASK_RIGHT; - } else if(bestDistancesRef->right == off7 && bestNodesRef->right) { - if(SYNCTEX_TAG(bestNodesRef->right) == SYNCTEX_TAG(node) + } else if (bestDistancesRef->right == off7 && bestNodesRef->right) { + if (SYNCTEX_TAG(bestNodesRef->right) == SYNCTEX_TAG(node) && (SYNCTEX_LINE(bestNodesRef->right) > SYNCTEX_LINE(node) || (SYNCTEX_LINE(bestNodesRef->right) == SYNCTEX_LINE(node) && SYNCTEX_COLUMN(bestNodesRef->right) > SYNCTEX_COLUMN(node)))) { @@ -3885,7 +3961,7 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_poin result |= SYNCTEX_MASK_RIGHT; } } - } else if(off7 == 0) { + } else if (off7 == 0) { /* hitPoint is inside node. */ bestDistancesRef->left = bestDistancesRef->right = 0; bestNodesRef->left = node; @@ -3893,12 +3969,12 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_poin result |= SYNCTEX_MASK_LEFT; } else { /* here off7 < 0, hitPoint is to the right of node */ off7 = -off7; - if(bestDistancesRef->left > off7) { + if (bestDistancesRef->left > off7) { bestDistancesRef->left = off7; bestNodesRef->left = node; result |= SYNCTEX_MASK_LEFT; - } else if(bestDistancesRef->left == off7 && bestNodesRef->left) { - if(SYNCTEX_TAG(bestNodesRef->left) == SYNCTEX_TAG(node) + } else if (bestDistancesRef->left == off7 && bestNodesRef->left) { + if (SYNCTEX_TAG(bestNodesRef->left) == SYNCTEX_TAG(node) && (SYNCTEX_LINE(bestNodesRef->left) > SYNCTEX_LINE(node) || (SYNCTEX_LINE(bestNodesRef->left) == SYNCTEX_LINE(node) && SYNCTEX_COLUMN(bestNodesRef->left) > SYNCTEX_COLUMN(node)))) { @@ -3908,21 +3984,21 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_poin } } } while((node = SYNCTEX_SIBLING(node))); - if(result & SYNCTEX_MASK_LEFT) { + if (result & SYNCTEX_MASK_LEFT) { /* the left node is new, try to narrow the result */ - if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) { + if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) { bestNodesRef->left = node; } - if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) { + if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) { bestNodesRef->left = node; } } - if(result & SYNCTEX_MASK_RIGHT) { + if (result & SYNCTEX_MASK_RIGHT) { /* the right node is new, try to narrow the result */ - if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) { + if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) { bestNodesRef->right = node; } - if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) { + if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) { bestNodesRef->right = node; } } @@ -3932,20 +4008,20 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_poin SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef,synctex_bool_t visible); SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef,synctex_bool_t visible) { int result = 0; - if((node = SYNCTEX_CHILD(node))) { + if ((node = SYNCTEX_CHILD(node))) { do { int off7 = _synctex_point_v_distance(hitPoint,node,visible);/* this is what makes the difference with the h version above */ - if(off7 > 0) { + if (off7 > 0) { /* node is to the top of the hit point (below because TeX is oriented from top to bottom. * We compare node and the previously recorded one, through the recorded distance. * If the nodes have the same tag, prefer the one with the smallest line number, * if the nodes also have the same line number, prefer the one with the smallest column. */ - if(bestDistancesRef->right > off7) { + if (bestDistancesRef->right > off7) { bestDistancesRef->right = off7; bestNodesRef->right = node; result |= SYNCTEX_MASK_RIGHT; - } else if(bestDistancesRef->right == off7 && bestNodesRef->right) { - if(SYNCTEX_TAG(bestNodesRef->right) == SYNCTEX_TAG(node) + } else if (bestDistancesRef->right == off7 && bestNodesRef->right) { + if (SYNCTEX_TAG(bestNodesRef->right) == SYNCTEX_TAG(node) && (SYNCTEX_LINE(bestNodesRef->right) > SYNCTEX_LINE(node) || (SYNCTEX_LINE(bestNodesRef->right) == SYNCTEX_LINE(node) && SYNCTEX_COLUMN(bestNodesRef->right) > SYNCTEX_COLUMN(node)))) { @@ -3953,19 +4029,19 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_poin result |= SYNCTEX_MASK_RIGHT; } } - } else if(off7 == 0) { + } else if (off7 == 0) { bestDistancesRef->left = bestDistancesRef->right = 0; bestNodesRef->left = node; bestNodesRef->right = NULL; result |= SYNCTEX_MASK_LEFT; } else { /* here off7 < 0 */ off7 = -off7; - if(bestDistancesRef->left > off7) { + if (bestDistancesRef->left > off7) { bestDistancesRef->left = off7; bestNodesRef->left = node; result |= SYNCTEX_MASK_LEFT; - } else if(bestDistancesRef->left == off7 && bestNodesRef->left) { - if(SYNCTEX_TAG(bestNodesRef->left) == SYNCTEX_TAG(node) + } else if (bestDistancesRef->left == off7 && bestNodesRef->left) { + if (SYNCTEX_TAG(bestNodesRef->left) == SYNCTEX_TAG(node) && (SYNCTEX_LINE(bestNodesRef->left) > SYNCTEX_LINE(node) || (SYNCTEX_LINE(bestNodesRef->left) == SYNCTEX_LINE(node) && SYNCTEX_COLUMN(bestNodesRef->left) > SYNCTEX_COLUMN(node)))) { @@ -3975,21 +4051,21 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_poin } } } while((node = SYNCTEX_SIBLING(node))); - if(result & SYNCTEX_MASK_LEFT) { + if (result & SYNCTEX_MASK_LEFT) { /* the left node is new, try to narrow the result */ - if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) { + if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) { bestNodesRef->left = node; } - if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) { + if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) { bestNodesRef->left = node; } } - if(result & SYNCTEX_MASK_RIGHT) { + if (result & SYNCTEX_MASK_RIGHT) { /* the right node is new, try to narrow the result */ - if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) { + if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) { bestNodesRef->right = node; } - if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) { + if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) { bestNodesRef->right = node; } } @@ -3997,7 +4073,7 @@ SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_poin return result; } SYNCTEX_INLINE static int _synctex_eq_get_closest_children_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef,synctex_bool_t visible) { - if(node) { + if (node) { switch(node->class->type) { case synctex_node_type_hbox: return __synctex_eq_get_closest_children_in_hbox(hitPoint, node, bestNodesRef, bestDistancesRef,visible); @@ -4011,18 +4087,18 @@ SYNCTEX_INLINE static int _synctex_eq_get_closest_children_in_box(synctex_point_ SYNCTEX_INLINE static synctex_node_t __synctex_eq_closest_child(synctex_point_t hitPoint, synctex_node_t node,int* distanceRef, synctex_bool_t visible); SYNCTEX_INLINE static synctex_node_t __synctex_eq_closest_child(synctex_point_t hitPoint, synctex_node_t node,int* distanceRef, synctex_bool_t visible) { synctex_node_t best_node = NULL; - if((node = SYNCTEX_CHILD(node))) { + if ((node = SYNCTEX_CHILD(node))) { do { int distance = _synctex_node_distance_to_point(hitPoint,node,visible); synctex_node_t candidate = NULL; - if(distance<=*distanceRef) { + if (distance<=*distanceRef) { *distanceRef = distance; best_node = node; } switch(node->class->type) { case synctex_node_type_vbox: case synctex_node_type_hbox: - if((candidate = __synctex_eq_closest_child(hitPoint,node,distanceRef,visible))) { + if ((candidate = __synctex_eq_closest_child(hitPoint,node,distanceRef,visible))) { best_node = candidate; } } @@ -4031,23 +4107,23 @@ SYNCTEX_INLINE static synctex_node_t __synctex_eq_closest_child(synctex_point_t return best_node; } SYNCTEX_INLINE static synctex_node_t _synctex_eq_closest_child(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible) { - if(node) { + if (node) { switch(node->class->type) { case synctex_node_type_hbox: case synctex_node_type_vbox: { int best_distance = INT_MAX; synctex_node_t best_node = __synctex_eq_closest_child(hitPoint,node,&best_distance,visible); - if((best_node)) { + if ((best_node)) { synctex_node_t child = NULL; switch(best_node->class->type) { case synctex_node_type_vbox: case synctex_node_type_hbox: - if((child = SYNCTEX_CHILD(best_node))) { + if ((child = SYNCTEX_CHILD(best_node))) { best_distance = _synctex_node_distance_to_point(hitPoint,child,visible); while((child = SYNCTEX_SIBLING(child))) { int distance = _synctex_node_distance_to_point(hitPoint,child,visible); - if(distance<=best_distance) { + if (distance<=best_distance) { best_distance = distance; best_node = child; } @@ -4087,27 +4163,29 @@ struct __synctex_updater_t { synctex_updater_t synctex_updater_new_with_output_file(const char * output, const char * build_directory) { synctex_updater_t updater = NULL; char * synctex = NULL; - synctex_io_mode_t io_mode = synctex_io_mode_read; - const char * mode; - /* prepare the updater */ + synctex_io_mode_t io_mode = 0; + const char * mode = NULL; + /* prepare the updater, the memory is the only one dynamically allocated */ updater = (synctex_updater_t)_synctex_malloc(sizeof(synctex_updater_t)); - if(NULL == updater) { + if (NULL == updater) { _synctex_error("! synctex_updater_new_with_file: malloc problem"); return NULL; } - if(_synctex_open(output,build_directory,&synctex,&SYNCTEX_FILE,synctex_NO,&io_mode) - && _synctex_open(output,build_directory,&synctex,&SYNCTEX_FILE,synctex_YES,&io_mode)) { + if (_synctex_open(output,build_directory,&synctex,&SYNCTEX_FILE,synctex_ADD_QUOTES,&io_mode) + && _synctex_open(output,build_directory,&synctex,&SYNCTEX_FILE,synctex_DONT_ADD_QUOTES,&io_mode)) { return_on_error: free(updater); + updater = NULL; return NULL; } - /* OK, the file exists */ + /* OK, the file exists, we close it and reopen it with the correct mode. + * The receiver is now the owner of the "synctex" variable. */ gzclose(SYNCTEX_FILE); SYNCTEX_FILE = NULL; - SYNCTEX_NO_GZ = io_mode%2?synctex_NO:synctex_YES; - mode = synctex_io_modes[io_mode+synctex_io_mode_append];/* either "a" or "ab", depending on the file extension */ - if(SYNCTEX_NO_GZ) { - if(NULL == (SYNCTEX_FILE = (void *)fopen(synctex,mode))) { + SYNCTEX_NO_GZ = (io_mode&synctex_io_gz_mask)?synctex_NO:synctex_YES; + mode = _synctex_get_io_mode_name(io_mode|synctex_io_append_mask);/* either "a" or "ab", depending on the file extension */ + if (SYNCTEX_NO_GZ) { + if (NULL == (SYNCTEX_FILE = (void *)fopen(synctex,mode))) { no_write_error: _synctex_error("! synctex_updater_new_with_file: Can't append to %s",synctex); free(synctex); @@ -4115,7 +4193,7 @@ no_write_error: } updater->fprintf = (synctex_fprintf_t)(&fprintf); } else { - if(NULL == (SYNCTEX_FILE = (void *)gzopen(synctex,mode))) { + if (NULL == (SYNCTEX_FILE = (void *)gzopen(synctex,mode))) { goto no_write_error; } updater->fprintf = (synctex_fprintf_t)(&gzprintf); @@ -4127,37 +4205,37 @@ no_write_error: void synctex_updater_append_magnification(synctex_updater_t updater, char * magnification){ - if(NULL==updater) { + if (NULL==updater) { return; } - if(magnification && strlen(magnification)) { + if (magnification && strlen(magnification)) { updater->length += SYNCTEX_fprintf(SYNCTEX_FILE,"Magnification:%s\n",magnification); } } void synctex_updater_append_x_offset(synctex_updater_t updater, char * x_offset){ - if(NULL==updater) { + if (NULL==updater) { return; } - if(x_offset && strlen(x_offset)) { + if (x_offset && strlen(x_offset)) { updater->length += SYNCTEX_fprintf(SYNCTEX_FILE,"X Offset:%s\n",x_offset); } } void synctex_updater_append_y_offset(synctex_updater_t updater, char * y_offset){ - if(NULL==updater) { + if (NULL==updater) { return; } - if(y_offset && strlen(y_offset)) { + if (y_offset && strlen(y_offset)) { updater->length += SYNCTEX_fprintf(SYNCTEX_FILE,"Y Offset:%s\n",y_offset); } } void synctex_updater_free(synctex_updater_t updater){ - if(NULL==updater) { + if (NULL==updater) { return; } - if(updater->length>0) { + if (updater->length>0) { SYNCTEX_fprintf(SYNCTEX_FILE,"!%i\n",updater->length); } if (SYNCTEX_NO_GZ) { diff --git a/cut-n-paste/synctex/synctex_parser.h b/cut-n-paste/synctex/synctex_parser.h index b164b7fb..4aca4150 100644 --- a/cut-n-paste/synctex/synctex_parser.h +++ b/cut-n-paste/synctex/synctex_parser.h @@ -1,11 +1,12 @@ /* -Copyright (c) 2008, 2009, 2010 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 Jul 1 11:16:51 UTC 2009 +Latest Revision: Tue Jun 14 08:23:30 UTC 2011 + +Version: 1.16 -Version: 1.12 See synctex_parser_readme.txt for more details License: @@ -89,7 +90,7 @@ typedef _synctex_scanner_t * synctex_scanner_t; * It is the directory where all the auxiliary stuff is created. * Sometimes, the synctex output file and the pdf, dvi or xdv files are not created in the same directory. * This is the case in MikTeX (I will include this into TeX Live). - * This directory path can be nil, it will be ignored. + * This directory path can be nil, it will be ignored then. * It can be either absolute or relative to the directory of the output pdf (dvi or xdv) file. * If no synctex file is found in the same directory as the output file, then we try to find one in the build directory. * Please note that this new "build_directory" is provided as a convenient argument but should not be used. diff --git a/cut-n-paste/synctex/synctex_parser_local.h b/cut-n-paste/synctex/synctex_parser_local.h new file mode 100644 index 00000000..0b286366 --- /dev/null +++ b/cut-n-paste/synctex/synctex_parser_local.h @@ -0,0 +1,46 @@ +/* +Copyright (c) 2008, 2009, 2010 , 2011 jerome DOT laurens AT u-bourgogne DOT fr + +This file is part of the SyncTeX package. + +Latest Revision: Tue Jun 14 08:23:30 UTC 2011 + +Version: 1.16 + +See synctex_parser_readme.txt for more details + +License: +-------- +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE + +Except as contained in this notice, the name of the copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in this Software without prior written +authorization from the copyright holder. + +*/ + +/* This local header file is for TEXLIVE, use your own header to fit your system */ +# include <w2c/c-auto.h> /* for inline && HAVE_xxx */ +/* No inlining for synctex tool in texlive. */ +# define SYNCTEX_INLINE + 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]; +} diff --git a/cut-n-paste/synctex/synctex_parser_utils.h b/cut-n-paste/synctex/synctex_parser_utils.h index e28ff58a..e67f8f56 100644 --- a/cut-n-paste/synctex/synctex_parser_utils.h +++ b/cut-n-paste/synctex/synctex_parser_utils.h @@ -1,10 +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. -Version: 1.8 -Latest Revision: Wed Jul 1 11:16:01 UTC 2009 +Latest Revision: Tue Jun 14 08:23:30 UTC 2011 + +Version: 1.16 + See synctex_parser_readme.txt for more details License: @@ -44,7 +46,11 @@ authorization from the copyright holder. # define synctex_bool_t int # define synctex_YES -1 +# define synctex_ADD_QUOTES -1 +# define synctex_COMPRESS -1 # define synctex_NO 0 +# define synctex_DONT_ADD_QUOTES 0 +# define synctex_DONT_COMPRESS 0 #ifndef __SYNCTEX_PARSER_UTILS__ # define __SYNCTEX_PARSER_UTILS__ @@ -60,7 +66,13 @@ extern "C" { # else # define SYNCTEX_IS_PATH_SEPARATOR(c) ('/' == c) # endif - + +# if _WIN32 +# define SYNCTEX_IS_DOT(c) ('.' == c) +# else +# define SYNCTEX_IS_DOT(c) ('.' == c) +# endif + /* This custom malloc functions initializes to 0 the newly allocated memory. * There is no bzero function on windows. */ void *_synctex_malloc(size_t size); @@ -103,19 +115,25 @@ int _synctex_copy_with_quoting_last_path_component(const char * src, char ** des extern const char * synctex_suffix; extern const char * synctex_suffix_gz; +typedef unsigned int synctex_io_mode_t; + typedef enum { - synctex_io_mode_read = 0, - synctex_io_mode_append = 2 -} synctex_io_mode_t; + synctex_io_append_mask = 1, + synctex_io_gz_mask = synctex_io_append_mask<<1 +} synctex_io_mode_masks_t; typedef enum { synctex_compress_mode_none = 0, synctex_compress_mode_gz = 1 } synctex_compress_mode_t; -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); +/* returns the correct mode required by fopen and gzopen from the given io_mode */ +const char * _synctex_get_io_mode_name(synctex_io_mode_t io_mode); +const char * synctex_ignore_leading_dot_slash(const char * name); + #ifdef __cplusplus } #endif diff --git a/cut-n-paste/synctex/synctex_parser_version.txt b/cut-n-paste/synctex/synctex_parser_version.txt new file mode 100644 index 00000000..e7151969 --- /dev/null +++ b/cut-n-paste/synctex/synctex_parser_version.txt @@ -0,0 +1 @@ +1.16 diff --git a/cut-n-paste/synctex/update-synctex-from-TL.sh b/cut-n-paste/synctex/update-synctex-from-TL.sh new file mode 100644 index 00000000..ca0e10bf --- /dev/null +++ b/cut-n-paste/synctex/update-synctex-from-TL.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# update-synctex-from-TL.sh +# +# Get latest synctex parser from TexLive SVN repository. +SVN_URI=svn://tug.org/texlive/trunk/Build/source/texk/web2c/synctexdir +SCRIPT_NAME=update-synctex-from-TL.sh +FILES="synctex_parser_version.txt synctex_parser.c synctex_parser.h synctex_parser_local.h synctex_parser_utils.c synctex_parser_utils.h" + + echo "Obtaining latest version of the sources" + for FILE in $FILES + do + svn export $SVN_URI/$FILE + done + + |