diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/utils/synctex.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/utils/synctex.c | 1661 |
1 files changed, 881 insertions, 780 deletions
diff --git a/Build/source/texk/web2c/luatexdir/utils/synctex.c b/Build/source/texk/web2c/luatexdir/utils/synctex.c index de51a4c8ec5..c64c8518365 100644 --- a/Build/source/texk/web2c/luatexdir/utils/synctex.c +++ b/Build/source/texk/web2c/luatexdir/utils/synctex.c @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:18:09 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -65,7 +67,7 @@ Versioning: ----------- As synctex is embedded into different TeX implementation, there is an independent versionning system. -For TeX implementations, the actual version is: 1 +For TeX implementations, the actual version is: 2 For .synctex file format, the actual version is SYNCTEX_VERSION below Please, do not remove these explanations. @@ -80,39 +82,51 @@ Nota Bene: If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. +History: +-------- +Version 2 +Fri Sep 19 14:55:31 UTC 2008 +- support for file names containing spaces. + This is one thing that xetex and pdftex do not manage the same way. + When the input file name contains a space character ' ', + pdftex will automatically enclose this name between two quote characters '"', + making programs believe that these quotes are really part of the name. + xetex does nothing special. + For that reason, running the command line + xetex --synctex=-1 "my file.tex" + is producing the expected file named <my file.synctex>, (the '<' and '>' are not part of the name) + whereas running the command line + pdftex --synctex=-1 "my file.tex" + was producing the unexpected file named <"my file".synctex> where the two '"' chracters were part of the name. + Of course, that was breaking the typesetting mechanism when pdftex was involved. + To solve this problem, we prefer to rely on the output_file_name instead of the jobname. + In the case when no output_file_name is available, we use jobname and test if the file name + starts and ends with a quote character. Every synctex output file is removed because we consider + TeX encontered a problem. + There is some conditional coding. + Version 1 -Tue Jul 1 15:23:00 UTC 2008 +Latest Revision: Wed Jul 1 08:15:44 UTC 2009 */ -# define SYNCTEX_VERSION 1 +#define SYNCTEX_VERSION 1 -# define SYNCTEX_DEBUG 0 +#define SYNCTEX_DEBUG 0 /* Debugging: define the next macro to "return;" in order to disable the synctex code * only suplemental function calls will be used. The compiler may optimize them. */ -# define SYNCTEX_RETURN_IF_DISABLED ; +#define SYNCTEX_RETURN_IF_DISABLED ; -# define SYNCTEX_NOERR 0 +#define SYNCTEX_NOERR 0 -# define EXTERN extern +#define EXTERN extern -# ifdef xfree -# define SYNCTEX_FREE xfree -# else -# define SYNCTEX_FREE(x) free(x) -# endif - -#define ruleht rule_ht -#define ruledp rule_dp -#define rulewd rule_wd -#define jobname job_name -#define totalpages total_pages -#define curinput cur_input -#define synctextagfield synctex_tag_field -#define namefield name_field - -#define gettexstring(a) xstrdup(makecstring(a)) +#ifdef xfree +# define SYNCTEX_FREE xfree +#else +# define SYNCTEX_FREE(x) free(x) +#endif /* the macros defined below do the same job than their almost eponym * counterparts of *tex.web, the memory access is sometimes more direct @@ -122,20 +136,26 @@ Tue Jul 1 15:23:00 UTC 2008 * and *tex.web for details, the synctex_ prefix prevents name conflicts, it * is some kind of namespace */ + /* synctexoption is a global integer variable defined in *tex.web * it is set to 1 by texmfmp.c if the command line has the '-synctex=1' * option. */ -# define synctex_options synctexoption -# define SYNCTEX_NO_OPTION INT_MAX +#define synctex_options synctexoption +#define SYNCTEX_NO_OPTION INT_MAX /* if synctex_options is set to SYNCTEX_NO_OPTION, no command line option was provided. */ -# define SYNCTEX_VALUE int_par(param_synctex_code) - +/* glue code: really define the main memory, + * this is exactly the same "mem" as in *tex.web. */ +#define mem zmem +/* glue code: synctexoffset is a global integer variable defined in *tex.web + * it is set to the offset where the primitive \synctex reads and writes its + * value. */ +#define SYNCTEX_VALUE zeqtb[synctexoffset].cint /* if there were a mean to share the value of synctex_code between *tex.web * and this file, it would be great. */ -# define SYNCTEX_UNIT_FACTOR 1 -# define UNIT / synctex_ctxt.unit +#define SYNCTEX_UNIT_FACTOR 1 +#define UNIT / synctex_ctxt.unit /* UNIT is the scale. TeX coordinates are very accurate and client won't need * that, at leat in a first step. 1.0 <-> 2^16 = 65536. * The TeX unit is sp (scaled point) or pt/65536 which means that the scale @@ -148,7 +168,7 @@ Tue Jul 1 15:23:00 UTC 2008 * IMPORTANT: We can say that the natural unit of .synctex files is SYNCTEX_UNIT_FACTOR sp. * To retrieve the proper bp unit, we'll have to divide by 8.03. To reduce * rounding errors, we'll certainly have to add 0.5 for non negative integers - * and ±0.5 for negative integers. This trick is mainly to gain speed and + * and ±0.5 for negative integers. This trick is mainly to gain speed and * size. A binary file would be more appropriate in that respect, but I guess * that some clients like auctex would not like it very much. we cannot use * "<<13" instead of "/SYNCTEX_UNIT_FACTOR" because the integers are signed and we do not @@ -162,7 +182,7 @@ Tue Jul 1 15:23:00 UTC 2008 The 9 definitions below must be in sync with their eponym declarations in the proper synctex-*.ch* file. */ -# define synchronization_field_size 1 +#define synchronization_field_size 2 /* The default value is 2, it is suitable for original TeX and alike, * but it is too big for XeTeX. * The tag and the line are just the two last words of the node. This is a @@ -171,21 +191,35 @@ Tue Jul 1 15:23:00 UTC 2008 * XeTeX redefines synchronization_field_size, * SYNCTEX_TAG_MODEL and SYNCTEX_LINE_MODEL * All the default values are targeted to TeX or e-TeX. */ -# define SYNCTEX_TAG_MODEL(NODE,SIZE)\ - vinfo(NODE+SIZE-synchronization_field_size) -# define SYNCTEX_LINE_MODEL(NODE,SIZE)\ - vlink(NODE+SIZE-synchronization_field_size) +#define SYNCTEX_TAG_MODEL(NODE,SIZE)\ + mem[NODE+SIZE-synchronization_field_size].cint +#define SYNCTEX_LINE_MODEL(NODE,SIZE)\ + mem[NODE+SIZE-synchronization_field_size+1].cint /* SYNCTEX_TAG_MODEL and SYNCTEX_LINE_MODEL are used to define * SYNCTEX_TAG and SYNCTEX_LINE in a model independant way * Both are tag and line accessors */ +#define box_node_size (7+synchronization_field_size) +/* see: @d box_node_size=... + * There should be an automatic process here because these definitions + * are redundant. However, this process would certainly be overcomplicated + * (building then parsing the *tex.web file would be a pain) */ +#define width_offset 1 +/* see: @d width_offset=... */ +#define depth_offset 2 +/* see: @d depth_offset=... */ +#define height_offset 3 +/* see: @d height_offset=... */ /* Now define the local version of width(##), height(##) and depth(##) macros These only depend on the 3 macros above. */ -# define SYNCTEX_TYPE(NODE) type(NODE) -# define SYNCTEX_SUBTYPE(NODE) subtype(NODE) -# define SYNCTEX_WIDTH(NODE) width(NODE) -# define SYNCTEX_DEPTH(NODE) depth(NODE) -# define SYNCTEX_HEIGHT(NODE) height(NODE) +#define SYNCTEX_TYPE(NODE) mem[NODE].hh.b0 +#define rule_node 2 +#define glue_node 10 +#define kern_node 11 +#define SYNCTEX_SUBTYPE(NODE) mem[NODE].hh.b1 +#define SYNCTEX_WIDTH(NODE) mem[NODE+width_offset].cint +#define SYNCTEX_DEPTH(NODE) mem[NODE+depth_offset].cint +#define SYNCTEX_HEIGHT(NODE) mem[NODE+height_offset].cint /* When an hlist ships out, it can contain many different kern/glue nodes with * exactly the same sync tag and line. To reduce the size of the .synctex @@ -198,128 +232,128 @@ Tue Jul 1 15:23:00 UTC 2008 * a change in the context, this is the macro SYNCTEX_CONTEXT_DID_CHANGE. The * SYNCTEX_IGNORE macro is used to detect unproperly initialized nodes. See * details in the implementation of the functions below. */ -# define SYNCTEX_IGNORE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE || !SYNCTEX_FILE +#define SYNCTEX_IGNORE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE || !SYNCTEX_FILE /* Some parts of the code may differ depending on the ouput mode, * dvi or xdv vs pdf, in particular the management of magnification. * The default is dvi mode. * Also, if pdftex is used, the origin of the coordinates is at 0, not at 1in * Default values are suitable for TeX */ -# define SYNCTEX_OUTPUT "dvi" -# define SYNCTEX_OFFSET_IS_PDF 0 - -# define SYNCTEX_YES (-1) -# define SYNCTEX_NO (0) -# define SYNCTEX_NO_ERROR (0) +#define SYNCTEX_OUTPUT "dvi" +#define SYNCTEX_OFFSET_IS_PDF 0 -# include "luatexd.h" -# include "nodes.h" -# include "commands.h" -# undef SYNCTEX_OFFSET_IS_PDF -# define SYNCTEX_OFFSET_IS_PDF (pdf_output_value>0) -# undef SYNCTEX_OUTPUT -# define SYNCTEX_OUTPUT ((pdf_output_value>0)?"pdf":"dvi") +#define SYNCTEX_TRUE 1 +#define SYNCTEX_YES (-1) +#define SYNCTEX_NO (0) +#define SYNCTEX_NO_ERROR (0) -#define __SyncTeX__ 1 +#include "synctex-luatex.h" -# include "synctex.h" +#include "synctex.h" -# if defined(__SyncTeX__) +#if defined(__SyncTeX__) -# include <stdio.h> -# include <stdarg.h> -# include "zlib.h" +# include <stdio.h> +# include <stdarg.h> +# include "zlib.h" -typedef void (*synctex_recorder_t)(halfword); /* recorders know how to record a node */ -typedef int (*synctex_fprintf_t)(void *, const char * , ...); /* print formatted to either FILE * or gzFile */ +typedef void (*synctex_recorder_t) (halfword); /* recorders know how to record a node */ +typedef int (*synctex_fprintf_t) (void *, const char *, ...); /* print formatted to either FILE * or gzFile */ -# define SYNCTEX_BITS_PER_BYTE 8 +# define SYNCTEX_BITS_PER_BYTE 8 /* Here are all the local variables gathered in one "synchronization context" */ static struct { void *file; /* the foo.synctex or foo.synctex.gz I/O identifier */ - synctex_fprintf_t fprintf; /* either fprintf or gzprintf */ + synctex_fprintf_t fprintf; /* either fprintf or gzprintf */ char *busy_name; /* the real "foo.synctex(busy)" or "foo.synctex.gz(busy)" name */ char *root_name; /* in general jobname.tex */ integer count; /* The number of interesting records in "foo.synctex" */ /* next concern the last sync record encountered */ halfword node; /* the last synchronized node, must be set * before the recorder */ - synctex_recorder_t recorder;/* the recorder of the node above, the - * routine that knows how to record the - * node to the .synctex file */ + synctex_recorder_t recorder; /* the recorder of the node above, the + * routine that knows how to record the + * node to the .synctex file */ integer tag, line; /* current tag and line */ integer curh, curv; /* current point */ integer magnification; /* The magnification as given by \mag */ integer unit; /* The unit, defaults to 1, use 8192 to produce shorter but less accurate info */ integer total_length; /* The total length of the bytes written since the last check point */ struct _flags { - unsigned int option_read:1; /* Command line option read (in case of problem or at the end) */ - unsigned int off:1; /* Definitely turn off synctex, corresponds to cli option -synctex=0 */ - unsigned int no_gz:1; /* Whether zlib is used or not */ - unsigned int not_void:1; /* Whether it really contains synchronization material */ - unsigned int warn:1; /* One shot warning flag */ - unsigned int reserved:SYNCTEX_BITS_PER_BYTE*sizeof(int)-5; /* Align */ - } flags; + unsigned int option_read:1; /* Command line option read (in case of problem or at the end) */ + unsigned int off:1; /* Definitely turn off synctex, corresponds to cli option -synctex=0 */ + unsigned int no_gz:1; /* Whether zlib is used or not */ + unsigned int not_void:1; /* Whether it really contains synchronization material */ + unsigned int warn:1; /* One shot warning flag */ + unsigned int quoted:1; /* Whether the input file name was quoted by tex or not, for example "\"my input file.tex\"", unused by XeTeX */ + unsigned int reserved:SYNCTEX_BITS_PER_BYTE * sizeof(int) - 6; /* Align */ + } flags; } synctex_ctxt = { -NULL, NULL, NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, {0,0,0,0,0,0}}; + NULL, NULL, NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, { +0, 0, 0, 0, 0, 0, 0}}; -#define SYNCTEX_FILE synctex_ctxt.file -#define SYNCTEX_IS_OFF (synctex_ctxt.flags.off) -#define SYNCTEX_NO_GZ (synctex_ctxt.flags.no_gz) -#define SYNCTEX_NOT_VOID (synctex_ctxt.flags.not_void) -#define SYNCTEX_WARNING_DISABLE (synctex_ctxt.flags.warn) -#define SYNCTEX_fprintf (*synctex_ctxt.fprintf) +# define SYNCTEX_FILE synctex_ctxt.file +# define SYNCTEX_IS_OFF (synctex_ctxt.flags.off) +# define SYNCTEX_NO_GZ (synctex_ctxt.flags.no_gz) +# define SYNCTEX_NOT_VOID (synctex_ctxt.flags.not_void) +# define SYNCTEX_WARNING_DISABLE (synctex_ctxt.flags.warn) +# define SYNCTEX_fprintf (*synctex_ctxt.fprintf) /* Initialize the options, synchronize the variables. * This is sent by *tex.web before any TeX macro is used. * */ -void synctex_init_command(void) +void synctexinitcommand(void) { - /* This is a one shot function, any subsequent call is void */ - if (synctex_ctxt.flags.option_read) { - return; - } + /* This is a one shot function, any subsequent call is void */ + if (synctex_ctxt.flags.option_read) { + return; + } if (SYNCTEX_NO_OPTION == synctex_options) { /* No option given from the command line */ SYNCTEX_VALUE = 0; } else if (synctex_options == 0) { /* -synctex=0 was given: SyncTeX must be definitely disabled, - * any subsequent \synctex=1 will have no effect at all */ - SYNCTEX_IS_OFF = SYNCTEX_YES; + * any subsequent \synctex=1 will have no effect at all */ + SYNCTEX_IS_OFF = SYNCTEX_TRUE; SYNCTEX_VALUE = 0; } else { /* the command line options are not ignored */ - if(synctex_options < 0) { - SYNCTEX_NO_GZ = SYNCTEX_YES; - } - /* Initialize the content of the \synctex primitive */ - SYNCTEX_VALUE = synctex_options; + if (synctex_options < 0) { + SYNCTEX_NO_GZ = SYNCTEX_TRUE; + } + /* Initialize the content of the \synctex primitive */ + SYNCTEX_VALUE = synctex_options; } - synctex_ctxt.flags.option_read = SYNCTEX_YES; - return; + synctex_ctxt.flags.option_read = SYNCTEX_TRUE; + return; } -/* Free all memory used and close the file, - * It is sent locally when there is a problem with synctex output. */ -static void synctex_abort(void) +/* Free all memory used, close and remove the file if any, + * It is sent locally when there is a problem with synctex output. + * It is sent by pdftex when a fatal error occurred in pdftex.web. */ +void synctexabort(boolean log_opened __attribute__ ((unused))) { - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctex_abort\n"); -#endif +# endif if (SYNCTEX_FILE) { - if (SYNCTEX_NO_GZ) { - xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); - } else { - gzclose((gzFile)SYNCTEX_FILE); - } + if (SYNCTEX_NO_GZ) { + xfclose((FILE *) SYNCTEX_FILE, synctex_ctxt.busy_name); + } else { + gzclose((gzFile) SYNCTEX_FILE); + } + SYNCTEX_FILE = NULL; + remove(synctex_ctxt.busy_name); SYNCTEX_FREE(synctex_ctxt.busy_name); synctex_ctxt.busy_name = NULL; } - SYNCTEX_FREE(synctex_ctxt.root_name); - synctex_ctxt.root_name = NULL; - SYNCTEX_IS_OFF = SYNCTEX_YES; /* disable synctex */ + if (NULL != synctex_ctxt.root_name) { + SYNCTEX_FREE(synctex_ctxt.root_name); + synctex_ctxt.root_name = NULL; + } + SYNCTEX_IS_OFF = SYNCTEX_TRUE; /* disable synctex */ } static inline int synctex_record_preamble(void); @@ -339,90 +373,119 @@ static const char *synctex_suffix_busy = "(busy)"; */ static void *synctex_dot_open(void) { - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nwarning: Synchronize DEBUG: synctex_dot_open\n"); printf("\nwarning: SYNCTEX_VALUE=%0X\n", SYNCTEX_VALUE); printf("\nwarning: synctex_options=%0X\n", synctex_options); -# endif +# endif if (SYNCTEX_IS_OFF || !SYNCTEX_VALUE) { - return NULL; /* synchronization is disabled: do nothing */ + return NULL; /* synchronization is disabled: do nothing */ } if (SYNCTEX_FILE) { - return SYNCTEX_FILE; /* synchronization is alerady enabled */ + return SYNCTEX_FILE; /* synchronization is alerady enabled */ } -#if SYNCTEX_DEBUG +# if SYNCTEX_DEBUG printf("\nwarning: Synchronize DEBUG: synctex_dot_open 1\n"); -# endif - /* this is the first time we are asked to open the file - this part of code is executed only once: - either SYNCTEX_FILE is nonnegative or synchronization is - definitely disabled. */ - { - char *tmp = gettexstring(jobname); - /* jobname was set by the \jobname command on the *TeX side */ - char * the_busy_name = xmalloc(strlen(tmp) + strlen(synctex_suffix) + strlen(synctex_suffix_gz) + strlen(synctex_suffix_busy) + 1); - if(!the_busy_name) { - SYNCTEX_FREE(tmp); - synctex_abort(); - return NULL; - } - strcpy(the_busy_name, tmp); - SYNCTEX_FREE(tmp); - tmp = NULL; - strcat(the_busy_name, synctex_suffix); - /* Initialize SYNCTEX_NO_GZ with the content of \synctex to let the user choose the format. */ - SYNCTEX_NO_GZ = SYNCTEX_VALUE<0?SYNCTEX_YES:SYNCTEX_NO; - if (!SYNCTEX_NO_GZ) { - strcat(the_busy_name, synctex_suffix_gz); - } - strcat(the_busy_name, synctex_suffix_busy); - if (SYNCTEX_NO_GZ) { - SYNCTEX_FILE = xfopen(the_busy_name, FOPEN_WBIN_MODE); - synctex_ctxt.fprintf = (synctex_fprintf_t)(&fprintf); - } else { - SYNCTEX_FILE = gzopen(the_busy_name, FOPEN_WBIN_MODE); - synctex_ctxt.fprintf = (synctex_fprintf_t)(&gzprintf); - } -#if SYNCTEX_DEBUG - printf("\nwarning: Synchronize DEBUG: synctex_dot_open 2\n"); -#endif - if (SYNCTEX_FILE) { - if(SYNCTEX_NO_ERROR != synctex_record_preamble()) { - synctex_abort(); - return NULL; - } - /* Initialization of the context */ - synctex_ctxt.magnification = 1000; - synctex_ctxt.unit = SYNCTEX_UNIT_FACTOR; - /* synctex_ctxt.busy_name was NULL before, it now owns the_busy_name */ - synctex_ctxt.busy_name = the_busy_name; - the_busy_name = NULL; - /* print the preamble, this is an quite an UTF8 file */ - if (NULL != synctex_ctxt.root_name) { - synctex_record_input(1,synctex_ctxt.root_name); - SYNCTEX_FREE(synctex_ctxt.root_name); - synctex_ctxt.root_name = NULL; - } - synctex_ctxt.count = 0; -#if SYNCTEX_DEBUG - fprintf(stdout, - "\nwarning: Synchronize DEBUG: synctex_dot_open SYNCTEX AVAILABLE\n"); -#endif - } else { - /* no .synctex file available, so disable synchronization */ - SYNCTEX_IS_OFF = SYNCTEX_YES; - SYNCTEX_VALUE = 0; - printf("\nSyncTeX warning: no synchronization, problem with %s\n",the_busy_name); - /* and free the_busy_name */ - SYNCTEX_FREE(the_busy_name); - the_busy_name = NULL; -#if SYNCTEX_DEBUG - fprintf(stdout, - "\nwarning: Synchronize DEBUG: synctex_dot_open SYNCTEX DISABLED\n"); -#endif - } - } +# endif + /* this is the first time we are asked to open the file + this part of code is executed only once: + either SYNCTEX_FILE is nonnegative or synchronization is + definitely disabled. */ + { + size_t len; + char *tmp = GETJOBNAME(); + /* jobname was set by the \jobname command on the *TeX side */ + char *the_busy_name = xmalloc((unsigned) + (strlen(tmp) + strlen(synctex_suffix) + + strlen(synctex_suffix_gz) + + strlen(synctex_suffix_busy) + 1)); + if (!the_busy_name) { + SYNCTEX_FREE(tmp); + synctexabort(0); + return NULL; + } +# if defined(XeTeX) + synctex_ctxt.flags.quoted = 0; + strcpy(the_busy_name, tmp); +# else + len = strlen(tmp); + if (len > 0 && tmp[0] == '"' && tmp[len - 1] == '"') { + /* We are certainly on a pdftex like engine and the input file name did contain spaces inside. + Quotes where added around that file name. We prefer to remove the quotes to have a human readable name. + As of Fri Sep 19 14:00:01 UTC 2008, the file names containing quotes are not supported by pdfTeX + nor SyncTeX. */ + synctex_ctxt.flags.quoted = 1; /* we will have to add quotes around the file name in the log file. */ + strcpy(the_busy_name, tmp + 1); /* only copy what follows the leading " character */ + len = strlen(the_busy_name); + if ((len > 0) && (the_busy_name[len - 1] == '"')) { + the_busy_name[len - 1] = '\0'; + } + } else { + synctex_ctxt.flags.quoted = 0; + strcpy(the_busy_name, tmp); + } +# endif + SYNCTEX_FREE(tmp); + tmp = NULL; + strcat(the_busy_name, synctex_suffix); + /* Initialize SYNCTEX_NO_GZ with the content of \synctex to let the user choose the format. */ + if (SYNCTEX_VALUE < 0) { + SYNCTEX_NO_GZ = SYNCTEX_TRUE; + } else { + SYNCTEX_NO_GZ = SYNCTEX_NO; + } + if (!SYNCTEX_NO_GZ) { + strcat(the_busy_name, synctex_suffix_gz); + } + strcat(the_busy_name, synctex_suffix_busy); + if (SYNCTEX_NO_GZ) { + SYNCTEX_FILE = xfopen(the_busy_name, FOPEN_WBIN_MODE); + synctex_ctxt.fprintf = (synctex_fprintf_t) (&fprintf); + } else { + SYNCTEX_FILE = gzopen(the_busy_name, FOPEN_WBIN_MODE); + synctex_ctxt.fprintf = (synctex_fprintf_t) (&gzprintf); + } +# if SYNCTEX_DEBUG + printf("\nwarning: Synchronize DEBUG: synctex_dot_open 2\n"); +# endif + if (SYNCTEX_FILE) { + if (SYNCTEX_NO_ERROR != synctex_record_preamble()) { + synctexabort(0); + return NULL; + } + /* Initialization of the context */ + synctex_ctxt.magnification = 1000; + synctex_ctxt.unit = SYNCTEX_UNIT_FACTOR; + /* synctex_ctxt.busy_name was NULL before, it now owns the_busy_name */ + synctex_ctxt.busy_name = the_busy_name; + the_busy_name = NULL; + /* print the preamble, this is an quite an UTF8 file */ + if (NULL != synctex_ctxt.root_name) { + synctex_record_input(1, synctex_ctxt.root_name); + SYNCTEX_FREE(synctex_ctxt.root_name); + synctex_ctxt.root_name = NULL; + } + synctex_ctxt.count = 0; +# if SYNCTEX_DEBUG + fprintf(stdout, + "\nwarning: Synchronize DEBUG: synctex_dot_open SYNCTEX AVAILABLE\n"); +# endif + } else { + /* no .synctex file available, so disable synchronization */ + SYNCTEX_IS_OFF = SYNCTEX_TRUE; + SYNCTEX_VALUE = 0; + printf("\nSyncTeX warning: no synchronization, problem with %s\n", + the_busy_name); + /* and free the_busy_name */ + SYNCTEX_FREE(the_busy_name); + the_busy_name = NULL; +# if SYNCTEX_DEBUG + fprintf(stdout, + "\nwarning: Synchronize DEBUG: synctex_dot_open SYNCTEX DISABLED\n"); +# endif + } + } return SYNCTEX_FILE; } @@ -444,17 +507,17 @@ static void *synctex_dot_open(void) * treats the same way .tex, .aux, .sty ... files, even if many of them do not * contain any material meant to be typeset. */ -void synctex_start_input(void) +void synctexstartinput(void) { static unsigned int synctex_tag_counter = 0; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nwarning: Synchronize DEBUG: synctexstartinput %i", - synctex_tag_counter); + synctex_tag_counter); printf("\nwarning: SYNCTEX_VALUE=%i", SYNCTEX_VALUE); printf("\nwarning: synctex_options=%0X", synctex_options); -#endif +# endif if (SYNCTEX_IS_OFF) { return; @@ -472,35 +535,36 @@ void synctex_start_input(void) curinput.synctextagfield = 0; return; } - curinput.synctextagfield = synctex_tag_counter; /* -> *TeX.web */ + curinput.synctextagfield = (int) synctex_tag_counter; /* -> *TeX.web */ if (synctex_tag_counter == 1) { /* this is the first file TeX ever opens, in general \jobname.tex we * do not know yet if synchronization will ever be enabled so we have * to store the file name, because we will need it later. - * This is necessary because \jobname can be different */ + * This is necessary because \jobname can be different */ synctex_ctxt.root_name = gettexstring(curinput.namefield); - /* we could initialize the unit field to 1 to avoid floating point exception - * when accidentaly dividing by the unit. - * This occurs when some SYNCTEX_IGNORE macro is not used. - * But this must not happen unexpectedly, so we leave the unit to 0 */ -#if SYNCTEX_DEBUG + /* we could initialize the unit field to 1 to avoid floating point exception + * when accidentaly dividing by the unit. + * This occurs when some SYNCTEX_IGNORE macro is not used. + * But this must not happen unexpectedly, so we leave the unit to 0 */ +# if SYNCTEX_DEBUG printf("\nwarning: Synchronize DEBUG: synctexstartinput first END\n"); -# endif +# endif return; } - if (SYNCTEX_FILE || (SYNCTEX_VALUE && (SYNCTEX_NO_ERROR != synctex_dot_open()))) { + if (SYNCTEX_FILE + || (SYNCTEX_VALUE && (SYNCTEX_NO_ERROR != synctex_dot_open()))) { char *tmp = gettexstring(curinput.namefield); - synctex_record_input(curinput.synctextagfield,tmp); + synctex_record_input(curinput.synctextagfield, tmp); SYNCTEX_FREE(tmp); } -#if SYNCTEX_DEBUG +# if SYNCTEX_DEBUG printf("\nwarning: Synchronize DEBUG: synctexstartinput END\n"); -# endif +# endif return; } /* All the synctex... functions below have the smallest set of parameters. It - * appears to be either the address of a node, or nothing at all. Using varmem, + * appears to be either the address of a node, or nothing at all. Using zmem, * which is the place where all the nodes are stored, one can retrieve every * information about a node. The other information is obtained through the * global context variable. @@ -520,71 +584,135 @@ static inline int synctex_record_postamble(void); * However, it does not mean that it will be in sync with the pdf, especially * when the output is dvi or xdv and the dvi (or xdv) to pdf driver has not been applied. */ -void synctex_terminate(boolean log_opened) +void synctexterminate(boolean log_opened) { - char *tmp = NULL; - char * the_real_syncname = NULL; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + char *tmp = NULL; + char *the_real_syncname = NULL; + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexterminate\n"); -#endif - tmp = gettexstring(jobname); - the_real_syncname = xmalloc(strlen(tmp) + strlen(synctex_suffix) + strlen(synctex_suffix_gz) + 1); - if(!the_real_syncname) { - SYNCTEX_FREE(tmp); - synctex_abort(); - return; - } - strcpy(the_real_syncname, tmp); - strcat(the_real_syncname, synctex_suffix); - if (!SYNCTEX_NO_GZ) { - /* Remove any uncompressed synctex file, from a previous build. */ - remove(the_real_syncname); - strcat(the_real_syncname, synctex_suffix_gz); - } - /* allways remove the synctex output file before renaming it, windows requires it. */ - if(0 != remove(the_real_syncname) && errno == EACCES) { - fprintf(stderr,"SyncTeX: Can't remove %s (file is open or read only)\n",the_real_syncname); - } - if (SYNCTEX_FILE) { - if (SYNCTEX_NOT_VOID) { - synctex_record_postamble(); - /* close the synctex file*/ - if (SYNCTEX_NO_GZ) { - xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); - } else { - gzclose((gzFile)SYNCTEX_FILE); - } - /* renaming the working synctex file */ - if(0 == rename(synctex_ctxt.busy_name,the_real_syncname)) { - if(log_opened) { - printf("\nSyncTeX written on %s",the_real_syncname); /* SyncTeX also refers to the contents */ - } - } else { - fprintf(stderr,"SyncTeX: Can't rename %s to %s\n",synctex_ctxt.busy_name,the_real_syncname); - remove(synctex_ctxt.busy_name); - } - } else { - /* close and remove the synctex file because there are no pages of output */ - if (SYNCTEX_NO_GZ) { - xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); - } else { - gzclose((gzFile)SYNCTEX_FILE); - } - remove(synctex_ctxt.busy_name); - } - SYNCTEX_FILE = NULL; - } - if (SYNCTEX_NO_GZ) { - /* Remove any compressed synctex file, from a previous build. */ - strcat(the_real_syncname, synctex_suffix_gz); - remove(the_real_syncname); - } - SYNCTEX_FREE(synctex_ctxt.busy_name); - synctex_ctxt.busy_name = NULL; - SYNCTEX_FREE(the_real_syncname); - SYNCTEX_FREE(tmp); - synctex_abort(); +# endif + if (log_opened && (tmp = GETLOGNAME())) { + /* In version 1, the jobname was used but it caused problems regarding spaces in file names. */ + the_real_syncname = xmalloc((unsigned) + (strlen(tmp) + strlen(synctex_suffix) + + strlen(synctex_suffix_gz) + 1)); + if (!the_real_syncname) { + SYNCTEX_FREE(tmp); + synctexabort(0); + return; + } + strcpy(the_real_syncname, tmp); + SYNCTEX_FREE(tmp); + tmp = NULL; + /* now remove the last path extension which is in general log */ + tmp = the_real_syncname + strlen(the_real_syncname); + while (tmp > the_real_syncname) { + --tmp; + if (*tmp == '.') { + *tmp = '\0'; /* end the string here */ + break; + } + } + strcat(the_real_syncname, synctex_suffix); + if (!SYNCTEX_NO_GZ) { + /* Remove any uncompressed synctex file, from a previous build. */ + remove(the_real_syncname); + strcat(the_real_syncname, synctex_suffix_gz); + } + /* allways remove the synctex output file before renaming it, windows requires it. */ + if (0 != remove(the_real_syncname) && errno == EACCES) { + fprintf(stderr, + "SyncTeX: Can't remove %s (file is open or read only)\n", + the_real_syncname); + } + if (SYNCTEX_FILE) { + if (SYNCTEX_NOT_VOID) { + synctex_record_postamble(); + /* close the synctex file */ + if (SYNCTEX_NO_GZ) { + xfclose((FILE *) SYNCTEX_FILE, synctex_ctxt.busy_name); + } else { + gzclose((gzFile) SYNCTEX_FILE); + } + SYNCTEX_FILE = NULL; + /* renaming the working synctex file */ + if (0 == rename(synctex_ctxt.busy_name, the_real_syncname)) { + if (log_opened) { + printf((synctex_ctxt.flags.quoted ? "\nSyncTeX written on \"%s\"" : "\nSyncTeX written on %s"), the_real_syncname); /* SyncTeX also refers to the contents */ + } + } else { + fprintf(stderr, "SyncTeX: Can't rename %s to %s\n", + synctex_ctxt.busy_name, the_real_syncname); + remove(synctex_ctxt.busy_name); + } + } else { + /* close and remove the synctex file because there are no pages of output */ + if (SYNCTEX_NO_GZ) { + xfclose((FILE *) SYNCTEX_FILE, synctex_ctxt.busy_name); + } else { + gzclose((gzFile) SYNCTEX_FILE); + } + SYNCTEX_FILE = NULL; + remove(synctex_ctxt.busy_name); + } + } + if (SYNCTEX_NO_GZ) { + /* Remove any compressed synctex file, from a previous build. */ + strcat(the_real_syncname, synctex_suffix_gz); + remove(the_real_syncname); + } + } else if ((tmp = GETJOBNAME())) { + size_t len; + /* There was a problem with the output. + We just try to remove existing synctex output files + including the busy one. */ + the_real_syncname = xmalloc((unsigned) + (strlen(tmp) + strlen(synctex_suffix) + + strlen(synctex_suffix_gz) + 1)); + if (!the_real_syncname) { + SYNCTEX_FREE(tmp); + synctexabort(0); + return; + } +# if defined(XeTeX) + strcpy(the_real_syncname, tmp); +# else + len = strlen(tmp); + if (len > 0 && tmp[0] == '"' && tmp[len - 1] == '"') { + /* See above a similar situation. */ + strcpy(the_real_syncname, tmp + 1); /* only copy what follows the leading " character */ + len = strlen(the_real_syncname); + if ((len > 0) && (the_real_syncname[len - 1] == '"')) { + the_real_syncname[len - 1] = '\0'; + } + } else { + strcpy(the_real_syncname, tmp); + } +# endif + SYNCTEX_FREE(tmp); + tmp = NULL; + strcat(the_real_syncname, synctex_suffix); + remove(the_real_syncname); + strcat(the_real_syncname, synctex_suffix_gz); + remove(the_real_syncname); + if (SYNCTEX_FILE) { + /* close the synctex file */ + if (SYNCTEX_NO_GZ) { + xfclose((FILE *) SYNCTEX_FILE, synctex_ctxt.busy_name); + } else { + gzclose((gzFile) SYNCTEX_FILE); + } + SYNCTEX_FILE = NULL; + /* removing the working synctex file */ + remove(synctex_ctxt.busy_name); + } + } + SYNCTEX_FREE(synctex_ctxt.busy_name); + synctex_ctxt.busy_name = NULL; + SYNCTEX_FREE(the_real_syncname); + the_real_syncname = NULL; + synctexabort(0); } static inline int synctex_record_content(void); @@ -594,41 +722,43 @@ static inline int synctex_record_sheet(integer sheet); /* Recording the "{..." line. In *tex.web, use synctex_sheet(pdf_output) at * the very beginning of the ship_out procedure. */ -void synctex_sheet(integer mag) +void synctexsheet(integer mag) { - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG - printf("\nSynchronize DEBUG: synctexsheet %i\n",mag); -#endif + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG + printf("\nSynchronize DEBUG: synctexsheet %i\n", mag); +# endif if (SYNCTEX_IS_OFF) { - if(SYNCTEX_VALUE && !SYNCTEX_WARNING_DISABLE) { - SYNCTEX_WARNING_DISABLE = SYNCTEX_YES; - printf("\nSyncTeX warning: Synchronization was disabled from\nthe command line with -synctex=0\nChanging the value of \\synctex has no effect."); - } + if (SYNCTEX_VALUE && !SYNCTEX_WARNING_DISABLE) { + SYNCTEX_WARNING_DISABLE = SYNCTEX_TRUE; + printf + ("\nSyncTeX warning: Synchronization was disabled from\nthe command line with -synctex=0\nChanging the value of \\synctex has no effect."); + } return; } - if (SYNCTEX_FILE || (SYNCTEX_VALUE && (SYNCTEX_NO_ERROR != synctex_dot_open()))) { + if (SYNCTEX_FILE + || (SYNCTEX_VALUE && (SYNCTEX_NO_ERROR != synctex_dot_open()))) { /* First possibility: the .synctex file is already open because SyncTeX was activated on the CLI - * or it was activated with the \synctex macro and the first page is already shipped out. - * Second possibility: tries to open the .synctex, useful if synchronization was enabled + * or it was activated with the \synctex macro and the first page is already shipped out. + * Second possibility: tries to open the .synctex, useful if synchronization was enabled * from the source file and not from the CLI. * totalpages is defined in tex.web */ if (totalpages == 0) { /* Now it is time to properly set up the scale factor. */ - if(mag>0) { + if (mag > 0) { synctex_ctxt.magnification = mag; } - if(SYNCTEX_NO_ERROR != synctex_record_settings() - || SYNCTEX_NO_ERROR != synctex_record_content()) { - synctex_abort(); - return; - } + if (SYNCTEX_NO_ERROR != synctex_record_settings() + || SYNCTEX_NO_ERROR != synctex_record_content()) { + synctexabort(0); + return; + } } - synctex_record_sheet(totalpages+1); + synctex_record_sheet(totalpages + 1); } -#if SYNCTEX_DEBUG +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexsheet END\n"); -#endif +# endif return; } @@ -637,19 +767,19 @@ static inline int synctex_record_teehs(integer sheet); /* Recording the "}..." line. In *tex.web, use synctex_teehs at * the very end of the ship_out procedure. */ -void synctex_teehs(void) +void synctexteehs(void) { - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexteehs\n"); -#endif - if (SYNCTEX_IS_OFF || !SYNCTEX_FILE ) { +# endif + if (SYNCTEX_IS_OFF || !SYNCTEX_FILE) { return; } - synctex_record_teehs(totalpages);/* not totalpages+1*/ -#if SYNCTEX_DEBUG + synctex_record_teehs(totalpages); /* not totalpages+1 */ +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexteehs END\n"); -#endif +# endif return; } @@ -659,23 +789,21 @@ static inline void synctex_record_vlist(halfword p); * the beginning of the vliSYNCTEX_out procedure in *TeX.web. It will be balanced * by a synctex_tsilv, sent at the end of the vliSYNCTEX_out procedure. p is the * address of the vlist We assume that p is really a vlist node! */ -void synctex_vlist(halfword this_box) +void synctexvlist(halfword this_box) { - scaledpos pos; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexhlist\n"); -#endif +# endif if (SYNCTEX_IGNORE(this_box)) { return; } - synctex_ctxt.node = this_box; /* 0 to reset */ - synctex_ctxt.recorder = NULL; /* reset */ - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box,box_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box,box_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; + synctex_ctxt.node = this_box; /* 0 to reset */ + synctex_ctxt.recorder = NULL; /* reset */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box, box_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box, box_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; synctex_record_vlist(this_box); } @@ -685,23 +813,21 @@ static inline void synctex_record_tsilv(halfword p); * has been shipped out. It is used to close the vlist nesting level. It is * sent at the end of the vliSYNCTEX_out procedure in *TeX.web to balance a former * synctex_vlist sent at the beginning of that procedure. */ -void synctex_tsilv(halfword this_box) +void synctextsilv(halfword this_box) { - scaledpos pos; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctextsilv\n"); -#endif +# endif if (SYNCTEX_IGNORE(this_box)) { return; } /* Ignoring any pending info to be recorded */ - synctex_ctxt.node = this_box; /* 0 to reset */ - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box,box_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box,box_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; + synctex_ctxt.node = this_box; /* 0 to reset */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box, box_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box, box_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; synctex_ctxt.recorder = NULL; synctex_record_tsilv(this_box); } @@ -710,24 +836,21 @@ static inline void synctex_record_void_vlist(halfword p); /* This message is sent when a void vlist will be shipped out. * There is no need to balance a void vlist. */ -void synctex_void_vlist(halfword p, halfword this_box) +void synctexvoidvlist(halfword p, halfword this_box __attribute__ ((unused))) { - scaledpos pos; - (void)this_box; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexvoidvlist\n"); -#endif +# endif if (SYNCTEX_IGNORE(p)) { return; } - synctex_ctxt.node = p; /* reset */ - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,box_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,box_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; - synctex_ctxt.recorder = NULL; /* reset */ + synctex_ctxt.node = p; /* reset */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, box_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, box_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; + synctex_ctxt.recorder = NULL; /* reset */ synctex_record_void_vlist(p); } @@ -737,23 +860,21 @@ static inline void synctex_record_hlist(halfword p); * the beginning of the hliSYNCTEX_out procedure in *TeX.web. It will be balanced * by a synctex_tsilh, sent at the end of the hliSYNCTEX_out procedure. p is the * address of the hlist We assume that p is really an hlist node! */ -void synctex_hlist(halfword this_box) +void synctexhlist(halfword this_box) { - scaledpos pos; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexhlist\n"); -#endif +# endif if (SYNCTEX_IGNORE(this_box)) { return; } - synctex_ctxt.node = this_box; /* 0 to reset */ - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box,box_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box,box_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; - synctex_ctxt.recorder = NULL; /* reset */ + synctex_ctxt.node = this_box; /* 0 to reset */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box, box_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box, box_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; + synctex_ctxt.recorder = NULL; /* reset */ synctex_record_hlist(this_box); } @@ -763,24 +884,22 @@ static inline void synctex_record_tsilh(halfword p); * has been shipped out it is used to close the hlist nesting level. It is * sent at the end of the hliSYNCTEX_out procedure in *TeX.web to balance a former * synctex_hlist sent at the beginning of that procedure. */ -void synctex_tsilh(halfword this_box) +void synctextsilh(halfword this_box) { - scaledpos pos; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctextsilh\n"); -#endif +# endif if (SYNCTEX_IGNORE(this_box)) { return; } /* Ignoring any pending info to be recorded */ - synctex_ctxt.node = this_box; /* 0 to force next node to be recorded! */ - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box,box_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box,box_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; - synctex_ctxt.recorder = NULL; /* reset */ + synctex_ctxt.node = this_box; /* 0 to force next node to be recorded! */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(this_box, box_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(this_box, box_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; + synctex_ctxt.recorder = NULL; /* reset */ synctex_record_tsilh(this_box); } @@ -788,42 +907,39 @@ static inline void synctex_record_void_hlist(halfword p); /* This message is sent when a void hlist will be shipped out. * There is no need to balance a void hlist. */ -void synctex_void_hlist(halfword p, halfword this_box) +void synctexvoidhlist(halfword p, halfword this_box __attribute__ ((unused))) { - scaledpos pos; - (void)this_box; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexvoidhlist\n"); -#endif +# endif if (SYNCTEX_IGNORE(p)) { return; } - /* the sync context has changed */ - if (synctex_ctxt.recorder != NULL) { - /* but was not yet recorded */ - (*synctex_ctxt.recorder) (synctex_ctxt.node); - } - synctex_ctxt.node = p; /* 0 to reset */ - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,box_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,box_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; - synctex_ctxt.recorder = NULL; /* reset */ + /* the sync context has changed */ + if (synctex_ctxt.recorder != NULL) { + /* but was not yet recorded */ + (*synctex_ctxt.recorder) (synctex_ctxt.node); + } + synctex_ctxt.node = p; /* 0 to reset */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, box_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, box_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; + synctex_ctxt.recorder = NULL; /* reset */ synctex_record_void_hlist(p); } /* glue code: these only work with nodes of size medium_node_size */ -# define small_node_size 3 +# define small_node_size 3 /* see: @d small_node_size=2 {number of words to allocate for most node types} */ -# define medium_node_size (small_node_size+synchronization_field_size) +# define medium_node_size (small_node_size+synchronization_field_size) /* see: @d rule_node_size=4 */ -# /* define rule_node_size (4+synchronization_field_size)*/ +/* # define rule_node_size (4+synchronization_field_size) */ /* IN THE SEQUEL, ALL NODE ARE medium_node_size'd, UNTIL THE CONTRARY IS MENTIONNED */ -# undef SYNCTEX_IGNORE -# define SYNCTEX_IGNORE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE \ +# undef SYNCTEX_IGNORE +# define SYNCTEX_IGNORE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE \ || (0 >= SYNCTEX_TAG_MODEL(NODE,medium_node_size)) \ || (0 >= SYNCTEX_LINE_MODEL(NODE,medium_node_size)) @@ -831,7 +947,7 @@ void synctex_void_hlist(halfword p, halfword this_box) * the synchronization context remains the same, there is no need to write * synchronization info: it would not help more. The synchronization context * has changed when either the line number or the file tag has changed. */ -# define SYNCTEX_CONTEXT_DID_CHANGE(NODE) ((0 == synctex_ctxt.node)\ +# define SYNCTEX_CONTEXT_DID_CHANGE(NODE) ((0 == synctex_ctxt.node)\ || (SYNCTEX_TAG_MODEL(NODE,medium_node_size) != synctex_ctxt.tag)\ || (SYNCTEX_LINE_MODEL(NODE,medium_node_size) != synctex_ctxt.line)) @@ -839,14 +955,12 @@ void synctex_math_recorder(halfword p); /* glue code this message is sent whenever an inline math node will ship out See: @ @<Output the non-|char_node| |p| for... */ -void synctex_math(halfword p, halfword this_box) +void synctexmath(halfword p, halfword this_box __attribute__ ((unused))) { - scaledpos pos; - (void)this_box; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexmath\n"); -#endif +# endif if (SYNCTEX_IGNORE(p)) { return; } @@ -855,13 +969,12 @@ void synctex_math(halfword p, halfword this_box) (*synctex_ctxt.recorder) (synctex_ctxt.node); } synctex_ctxt.node = p; - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,medium_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,medium_node_size); - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; - synctex_ctxt.recorder = NULL;/* no need to record once more */ - synctex_math_recorder(p);/* always record synchronously */ + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, medium_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, medium_node_size); + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; + synctex_ctxt.recorder = NULL; /* no need to record once more */ + synctex_math_recorder(p); /* always record synchronously */ } static inline void synctex_record_glue(halfword p); @@ -870,63 +983,60 @@ static inline void synctex_record_rule(halfword p); /* this message is sent whenever an horizontal glue node or rule node ships out See: move_past:... */ -# define SYNCTEX_IGNORE_RULE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE \ +# define SYNCTEX_IGNORE_RULE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE \ || (0 >= SYNCTEX_TAG_MODEL(NODE,rule_node_size)) \ || (0 >= SYNCTEX_LINE_MODEL(NODE,rule_node_size)) -void synctex_horizontal_rule_or_glue(halfword p, halfword this_box) +void synctexhorizontalruleorglue(halfword p, halfword this_box + __attribute__ ((unused))) { - scaledpos pos; - (void)this_box; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexglue\n"); -#endif - if (SYNCTEX_TYPE(p) == rule_node) { /* not medium_node_size so we can't use SYNCTEX_IGNORE */ - if (SYNCTEX_IGNORE_RULE(p)) { - return; - } - } - else { - if (SYNCTEX_IGNORE(p)) { - return; - } - } - synctex_ctxt.node = p; - pos = synch_p_with_c(cur); - synctex_ctxt.curh = pos.h - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287); - synctex_ctxt.curv = cur_page_size.v - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287) - pos.v; - synctex_ctxt.recorder = NULL; - switch(SYNCTEX_TYPE(p)) { - case rule_node: - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,rule_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,rule_node_size); - synctex_record_rule(p);/* always record synchronously: maybe some text is outside the box */ - break; - case glue_node: - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,medium_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,medium_node_size); - synctex_record_glue(p);/* always record synchronously: maybe some text is outside the box */ - break; - case kern_node: - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,medium_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,medium_node_size); - synctex_record_kern(p);/* always record synchronously: maybe some text is outside the box */ - break; - default: - printf("\nSynchronize ERROR: unknown node type %i\n",SYNCTEX_TYPE(p)); - } +# endif + if (SYNCTEX_TYPE(p) == rule_node) { /* not medium_node_size so we can't use SYNCTEX_IGNORE */ + if (SYNCTEX_IGNORE_RULE(p)) { + return; + } + } else { + if (SYNCTEX_IGNORE(p)) { + return; + } + } + synctex_ctxt.node = p; + synctex_ctxt.curh = CURH; + synctex_ctxt.curv = CURV; + synctex_ctxt.recorder = NULL; + switch (SYNCTEX_TYPE(p)) { + case rule_node: + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, rule_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, rule_node_size); + synctex_record_rule(p); /* always record synchronously: maybe some text is outside the box */ + break; + case glue_node: + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, medium_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, medium_node_size); + synctex_record_glue(p); /* always record synchronously: maybe some text is outside the box */ + break; + case kern_node: + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, medium_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, medium_node_size); + synctex_record_kern(p); /* always record synchronously: maybe some text is outside the box */ + break; + default: + printf("\nSynchronize ERROR: unknown node type %i\n", SYNCTEX_TYPE(p)); + } } void synctex_kern_recorder(halfword p); /* this message is sent whenever a kern node ships out See: @ @<Output the non-|char_node| |p| for... */ -void synctex_kern(halfword p, halfword this_box) +void synctexkern(halfword p, halfword this_box) { - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexkern\n"); -#endif +# endif if (SYNCTEX_IGNORE(p)) { return; } @@ -935,47 +1045,46 @@ void synctex_kern(halfword p, halfword this_box) if (synctex_ctxt.recorder != NULL) { /* but was not yet recorded */ (*synctex_ctxt.recorder) (synctex_ctxt.node); - } - if(synctex_ctxt.node == this_box) { + } + if (synctex_ctxt.node == this_box) { /* first node in the list */ synctex_ctxt.node = p; - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,medium_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,medium_node_size); + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, medium_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, medium_node_size); synctex_ctxt.recorder = &synctex_kern_recorder; } else { synctex_ctxt.node = p; - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,medium_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,medium_node_size); + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, medium_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, medium_node_size); synctex_ctxt.recorder = NULL; /* always record when the context has just changed * and when not the first node */ synctex_kern_recorder(p); } } else { - /* just update the geometry and type (for future improvements) */ + /* just update the geometry and type (for future improvements) */ synctex_ctxt.node = p; - synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p,medium_node_size); - synctex_ctxt.line = SYNCTEX_LINE_MODEL(p,medium_node_size); + synctex_ctxt.tag = SYNCTEX_TAG_MODEL(p, medium_node_size); + synctex_ctxt.line = SYNCTEX_LINE_MODEL(p, medium_node_size); synctex_ctxt.recorder = &synctex_kern_recorder; } } /* This last part is used as a tool to infer TeX behaviour, * but not for direct synchronization. */ -# undef SYNCTEX_IGNORE -# define SYNCTEX_IGNORE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE || !SYNCTEX_FILE \ +# undef SYNCTEX_IGNORE +# define SYNCTEX_IGNORE(NODE) SYNCTEX_IS_OFF || !SYNCTEX_VALUE || !SYNCTEX_FILE \ || (synctex_ctxt.count>2000) void synctex_char_recorder(halfword p); /* this message is sent whenever a char node ships out */ -void synctex_char(halfword p, halfword this_box) +void synctexchar(halfword p, halfword this_box __attribute__ ((unused))) { - (void)this_box; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexchar\n"); -#endif +# endif if (SYNCTEX_IGNORE(p)) { return; } @@ -993,19 +1102,18 @@ void synctex_char(halfword p, halfword this_box) void synctex_node_recorder(halfword p); -# undef SYNCTEX_IGNORE -# define SYNCTEX_IGNORE(NODE) (SYNCTEX_IS_OFF || !SYNCTEX_VALUE || !SYNCTEX_FILE) +# undef SYNCTEX_IGNORE +# define SYNCTEX_IGNORE(NODE) (SYNCTEX_IS_OFF || !SYNCTEX_VALUE || !SYNCTEX_FILE) /* this message should be sent to record information for a node of an unknown type */ -void synctex_node(halfword p, halfword this_box) +void synctexnode(halfword p, halfword this_box __attribute__ ((unused))) { - (void)this_box; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexnode\n"); -#endif - if (SYNCTEX_IGNORE(p)) { +# endif + if (SYNCTEX_IGNORE(p)) { return; } /* always record, not very usefull yet */ @@ -1014,468 +1122,461 @@ void synctex_node(halfword p, halfword this_box) /* this message should be sent to record information synchronously for the current location */ -void synctex_current(void) +void synctexcurrent(void) { - scaledpos pos; - SYNCTEX_RETURN_IF_DISABLED; -#if SYNCTEX_DEBUG + SYNCTEX_RETURN_IF_DISABLED; +# if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexcurrent\n"); -#endif - if (SYNCTEX_IGNORE(nothing)) { +# endif + if (SYNCTEX_IGNORE(nothing)) { return; } else { - size_t len; - pos = synch_p_with_c(cur); - len = SYNCTEX_fprintf(SYNCTEX_FILE,"x%i,%i:%i,%i\n", - synctex_ctxt.tag,synctex_ctxt.line, - pos.h UNIT,pos.v UNIT); - if(len>0) { - synctex_ctxt.total_length += len; - return; - } - } - synctex_abort(); - return; + integer len = SYNCTEX_fprintf(SYNCTEX_FILE, "x%i,%i:%i,%i\n", + synctex_ctxt.tag, synctex_ctxt.line, + CURH UNIT, CURV UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; + return; + } + } + synctexabort(0); + return; } /* Recording the settings */ static inline int synctex_record_settings(void) { -#if SYNCTEX_DEBUG > 999 +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_settings\n"); -#endif - if(NULL == SYNCTEX_FILE) { +# endif + if (NULL == SYNCTEX_FILE) { return SYNCTEX_NOERR; } - if(SYNCTEX_FILE) { - size_t len = SYNCTEX_fprintf(SYNCTEX_FILE,"Output:%s\nMagnification:%i\nUnit:%i\nX Offset:%i\nY Offset:%i\n", - SYNCTEX_OUTPUT,synctex_ctxt.magnification,synctex_ctxt.unit, - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287 UNIT), - ((SYNCTEX_OFFSET_IS_PDF != 0) ? 0 : 4736287 UNIT)); - if(len>0) { - synctex_ctxt.total_length += len; - return SYNCTEX_NOERR; - } - } - synctex_abort(); - return -1; + if (SYNCTEX_FILE) { + integer len = SYNCTEX_fprintf(SYNCTEX_FILE, + "Output:%s\nMagnification:%i\nUnit:%i\nX Offset:%i\nY Offset:%i\n", + SYNCTEX_OUTPUT, + synctex_ctxt.magnification, + synctex_ctxt.unit, + ((SYNCTEX_OFFSET_IS_PDF != + 0) ? 0 : 4736287 UNIT), + ((SYNCTEX_OFFSET_IS_PDF != + 0) ? 0 : 4736287 UNIT)); + if (len > 0) { + synctex_ctxt.total_length += len; + return SYNCTEX_NOERR; + } + } + synctexabort(0); + return -1; } /* Recording a "SyncTeX..." line */ static inline int synctex_record_preamble(void) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_preamble\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"SyncTeX Version:%i\n",SYNCTEX_VERSION); - if(len>0) { - synctex_ctxt.total_length = len; - return SYNCTEX_NOERR; - } - synctex_abort(); - return -1; +# endif + len = + SYNCTEX_fprintf(SYNCTEX_FILE, "SyncTeX Version:%i\n", SYNCTEX_VERSION); + if (len > 0) { + synctex_ctxt.total_length = len; + return SYNCTEX_NOERR; + } + synctexabort(0); + return -1; } /* Recording a "Input:..." line */ static inline int synctex_record_input(integer tag, char *name) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_input\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"Input:%i:%s\n",tag,name); - if(len>0) { - synctex_ctxt.total_length += len; - return SYNCTEX_NOERR; - } - synctex_abort(); - return -1; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "Input:%i:%s\n", tag, name); + if (len > 0) { + synctex_ctxt.total_length += len; + return SYNCTEX_NOERR; + } + synctexabort(0); + return -1; } /* Recording a "!..." line */ static inline int synctex_record_anchor(void) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_anchor\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"!%i\n",synctex_ctxt.total_length); - if(len>0) { - synctex_ctxt.total_length = len; - ++synctex_ctxt.count; - return SYNCTEX_NOERR; - } - synctex_abort(); - return -1; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "!%i\n", synctex_ctxt.total_length); + if (len > 0) { + synctex_ctxt.total_length = len; + ++synctex_ctxt.count; + return SYNCTEX_NOERR; + } + synctexabort(0); + return -1; } /* Recording a "Content" line */ static inline int synctex_record_content(void) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_content\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"Content:\n"); - if(len>0) { - synctex_ctxt.total_length += len; - return SYNCTEX_NOERR; - } - synctex_abort(); - return -1; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "Content:\n"); + if (len > 0) { + synctex_ctxt.total_length += len; + return SYNCTEX_NOERR; + } + synctexabort(0); + return -1; } /* Recording a "{..." line */ static inline int synctex_record_sheet(integer sheet) { -#if SYNCTEX_DEBUG > 999 +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_sheet\n"); -#endif - if(SYNCTEX_NOERR == synctex_record_anchor()) { - size_t len = SYNCTEX_fprintf(SYNCTEX_FILE,"{%i\n",sheet); - if(len>0) { - synctex_ctxt.total_length += len; - ++synctex_ctxt.count; - return SYNCTEX_NOERR; - } - } - synctex_abort(); - return -1; +# endif + if (SYNCTEX_NOERR == synctex_record_anchor()) { + integer len = SYNCTEX_fprintf(SYNCTEX_FILE, "{%i\n", sheet); + if (len > 0) { + synctex_ctxt.total_length += len; + ++synctex_ctxt.count; + return SYNCTEX_NOERR; + } + } + synctexabort(0); + return -1; } /* Recording a "}..." line */ static inline int synctex_record_teehs(integer sheet) { -#if SYNCTEX_DEBUG > 999 +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_teehs\n"); -#endif - if(SYNCTEX_NOERR == synctex_record_anchor()) { - size_t len = SYNCTEX_fprintf(SYNCTEX_FILE,"}%i\n",sheet); - if(len>0) { - synctex_ctxt.total_length += len; - ++synctex_ctxt.count; - return SYNCTEX_NOERR; - } - } - synctex_abort(); - return -1; +# endif + if (SYNCTEX_NOERR == synctex_record_anchor()) { + integer len = SYNCTEX_fprintf(SYNCTEX_FILE, "}%i\n", sheet); + if (len > 0) { + synctex_ctxt.total_length += len; + ++synctex_ctxt.count; + return SYNCTEX_NOERR; + } + } + synctexabort(0); + return -1; } /* Recording a "v..." line */ static inline void synctex_record_void_vlist(halfword p) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_void_vlist\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"v%i,%i:%i,%i:%i,%i,%i\n", - SYNCTEX_TAG_MODEL(p,box_node_size), - SYNCTEX_LINE_MODEL(p,box_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - SYNCTEX_WIDTH(p) UNIT, - SYNCTEX_HEIGHT(p) UNIT, - SYNCTEX_DEPTH(p) UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "v%i,%i:%i,%i:%i,%i,%i\n", + SYNCTEX_TAG_MODEL(p, box_node_size), + SYNCTEX_LINE_MODEL(p, box_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + SYNCTEX_WIDTH(p) UNIT, + SYNCTEX_HEIGHT(p) UNIT, SYNCTEX_DEPTH(p) UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "[..." line */ static inline void synctex_record_vlist(halfword p) { - size_t len = 0; - SYNCTEX_NOT_VOID = SYNCTEX_YES; -#if SYNCTEX_DEBUG > 999 + integer len = 0; + SYNCTEX_NOT_VOID = SYNCTEX_TRUE; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_vlist\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"[%i,%i:%i,%i:%i,%i,%i\n", - SYNCTEX_TAG_MODEL(p,box_node_size), - SYNCTEX_LINE_MODEL(p,box_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - SYNCTEX_WIDTH(p) UNIT, - SYNCTEX_HEIGHT(p) UNIT, - SYNCTEX_DEPTH(p) UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "[%i,%i:%i,%i:%i,%i,%i\n", + SYNCTEX_TAG_MODEL(p, box_node_size), + SYNCTEX_LINE_MODEL(p, box_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + SYNCTEX_WIDTH(p) UNIT, + SYNCTEX_HEIGHT(p) UNIT, SYNCTEX_DEPTH(p) UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "]..." line */ -static inline void synctex_record_tsilv(halfword p) +static inline void synctex_record_tsilv(halfword p __attribute__ ((unused))) { - size_t len = 0; - (void)p; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_tsilv\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"]\n"); - if(len>0) { - synctex_ctxt.total_length += len; - return; - } - synctex_abort(); - return; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "]\n"); + if (len > 0) { + synctex_ctxt.total_length += len; + return; + } + synctexabort(0); + return; } /* Recording a "h..." line */ static inline void synctex_record_void_hlist(halfword p) { - size_t len = 0; - (void)p; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_void_hlist\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"h%i,%i:%i,%i:%i,%i,%i\n", - SYNCTEX_TAG_MODEL(p,box_node_size), - SYNCTEX_LINE_MODEL(p,box_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - SYNCTEX_WIDTH(p) UNIT, - SYNCTEX_HEIGHT(p) UNIT, - SYNCTEX_DEPTH(p) UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "h%i,%i:%i,%i:%i,%i,%i\n", + SYNCTEX_TAG_MODEL(p, box_node_size), + SYNCTEX_LINE_MODEL(p, box_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + SYNCTEX_WIDTH(p) UNIT, + SYNCTEX_HEIGHT(p) UNIT, SYNCTEX_DEPTH(p) UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "(..." line */ static inline void synctex_record_hlist(halfword p) { - size_t len = 0; - SYNCTEX_NOT_VOID = SYNCTEX_YES; -#if SYNCTEX_DEBUG > 999 + integer len = 0; + SYNCTEX_NOT_VOID = SYNCTEX_TRUE; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_hlist\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"(%i,%i:%i,%i:%i,%i,%i\n", - SYNCTEX_TAG_MODEL(p,box_node_size), - SYNCTEX_LINE_MODEL(p,box_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - SYNCTEX_WIDTH(p) UNIT, - SYNCTEX_HEIGHT(p) UNIT, - SYNCTEX_DEPTH(p) UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "(%i,%i:%i,%i:%i,%i,%i\n", + SYNCTEX_TAG_MODEL(p, box_node_size), + SYNCTEX_LINE_MODEL(p, box_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + SYNCTEX_WIDTH(p) UNIT, + SYNCTEX_HEIGHT(p) UNIT, SYNCTEX_DEPTH(p) UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a ")..." line */ -static inline void synctex_record_tsilh(halfword p) +static inline void synctex_record_tsilh(halfword p __attribute__ ((unused))) { - size_t len = 0; - (void)p; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_tsilh\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,")\n"); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, ")\n"); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "Count..." line */ -static inline int synctex_record_count(void) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 +static inline int synctex_record_count(void) +{ + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_count\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"Count:%i\n",synctex_ctxt.count); - if(len>0) { - synctex_ctxt.total_length += len; - return SYNCTEX_NOERR; - } - synctex_abort(); - return -1; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "Count:%i\n", synctex_ctxt.count); + if (len > 0) { + synctex_ctxt.total_length += len; + return SYNCTEX_NOERR; + } + synctexabort(0); + return -1; } /* Recording a "Postamble" section */ static inline int synctex_record_postamble(void) { -#if SYNCTEX_DEBUG > 999 +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_postamble\n"); -#endif - if(SYNCTEX_NOERR == synctex_record_anchor()) { - size_t len = SYNCTEX_fprintf(SYNCTEX_FILE,"Postamble:\n"); - if(len>0) { - synctex_ctxt.total_length += len; - if(synctex_record_count() || synctex_record_anchor()) { - } else { - len = SYNCTEX_fprintf(SYNCTEX_FILE,"Post scriptum:\n"); - if(len>0) { - synctex_ctxt.total_length += len; - return SYNCTEX_NOERR; - } - } - } - } - synctex_abort(); - return -1; +# endif + if (SYNCTEX_NOERR == synctex_record_anchor()) { + integer len = SYNCTEX_fprintf(SYNCTEX_FILE, "Postamble:\n"); + if (len > 0) { + synctex_ctxt.total_length += len; + if (synctex_record_count() || synctex_record_anchor()) { + } else { + len = SYNCTEX_fprintf(SYNCTEX_FILE, "Post scriptum:\n"); + if (len > 0) { + synctex_ctxt.total_length += len; + return SYNCTEX_NOERR; + } + } + } + } + synctexabort(0); + return -1; } /* Recording a "g..." line */ static inline void synctex_record_glue(halfword p) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_glue_recorder\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"g%i,%i:%i,%i\n", - SYNCTEX_TAG_MODEL(p,medium_node_size), - SYNCTEX_LINE_MODEL(p,medium_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "g%i,%i:%i,%i\n", + SYNCTEX_TAG_MODEL(p, medium_node_size), + SYNCTEX_LINE_MODEL(p, medium_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "k..." line */ static inline void synctex_record_kern(halfword p) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_kern_recorder\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"k%i,%i:%i,%i:%i\n", - SYNCTEX_TAG_MODEL(p,medium_node_size), - SYNCTEX_LINE_MODEL(p,medium_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - SYNCTEX_WIDTH(p) UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "k%i,%i:%i,%i:%i\n", + SYNCTEX_TAG_MODEL(p, medium_node_size), + SYNCTEX_LINE_MODEL(p, medium_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + SYNCTEX_WIDTH(p) UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "r..." line */ static inline void synctex_record_rule(halfword p) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_record_tsilh\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"r%i,%i:%i,%i:%i,%i,%i\n", - SYNCTEX_TAG_MODEL(p,rule_node_size), - SYNCTEX_LINE_MODEL(p,rule_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - rulewd UNIT, - ruleht UNIT, - ruledp UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "r%i,%i:%i,%i:%i,%i,%i\n", + SYNCTEX_TAG_MODEL(p, rule_node_size), + SYNCTEX_LINE_MODEL(p, rule_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + rulewd UNIT, ruleht UNIT, ruledp UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "$..." line */ void synctex_math_recorder(halfword p) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_math_recorder\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"$%i,%i:%i,%i\n", - SYNCTEX_TAG_MODEL(p,medium_node_size), - SYNCTEX_LINE_MODEL(p,medium_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "$%i,%i:%i,%i\n", + SYNCTEX_TAG_MODEL(p, medium_node_size), + SYNCTEX_LINE_MODEL(p, medium_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "k..." line */ void synctex_kern_recorder(halfword p) { - size_t len = 0; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_kern_recorder\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"k%i,%i:%i,%i:%i\n", - SYNCTEX_TAG_MODEL(p,medium_node_size), - SYNCTEX_LINE_MODEL(p,medium_node_size), - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - SYNCTEX_WIDTH(p) UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "k%i,%i:%i,%i:%i\n", + SYNCTEX_TAG_MODEL(p, medium_node_size), + SYNCTEX_LINE_MODEL(p, medium_node_size), + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + SYNCTEX_WIDTH(p) UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "c..." line */ -void synctex_char_recorder(halfword p) +void synctex_char_recorder(halfword p __attribute__ ((unused))) { - size_t len = 0; - (void)p; -#if SYNCTEX_DEBUG > 999 + integer len = 0; +# if SYNCTEX_DEBUG > 999 printf("\nSynchronize DEBUG: synctex_char_recorder\n"); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"c%i,%i\n", - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT); - if(len>0) { - synctex_ctxt.total_length += len; +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "c%i,%i\n", + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } /* Recording a "?..." line, type, subtype and position */ void synctex_node_recorder(halfword p) { - size_t len = 0; - (void)p; -#if SYNCTEX_DEBUG > 999 - printf("\nSynchronize DEBUG: synctex_node_recorder(0x%x)\n",p); -#endif - len = SYNCTEX_fprintf(SYNCTEX_FILE,"?%i,%i:%i,%i\n", - synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, - type(p),subtype(p)); - if(len>0) { - synctex_ctxt.total_length += len; + integer len = 0; +# if SYNCTEX_DEBUG > 999 + printf("\nSynchronize DEBUG: synctex_node_recorder(0x%x)\n", p); +# endif + len = SYNCTEX_fprintf(SYNCTEX_FILE, "?%i,%i:%i,%i\n", + synctex_ctxt.curh UNIT, synctex_ctxt.curv UNIT, + type(p), subtype(p)); + if (len > 0) { + synctex_ctxt.total_length += len; ++synctex_ctxt.count; - return; - } - synctex_abort(); - return; + return; + } + synctexabort(0); + return; } -# else -# warning "SyncTeX is disabled" -# endif +#else +# warning "SyncTeX is disabled" +#endif |