1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249 |
- # if defined(SYNCTEX_USE_LOCAL_HEADER)
- # include "synctex_parser_local.h"
- # else
- # define HAVE_LOCALE_H 1
- # define HAVE_SETLOCALE 1
- # if defined(_MSC_VER)
- # define SYNCTEX_INLINE __inline
- # else
- # define SYNCTEX_INLINE inline
- # endif
- # endif
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include <limits.h>
- #if defined(HAVE_LOCALE_H)
- #include <locale.h>
- #endif
- #include "synctex_parser.h"
- #include "synctex_parser_utils.h"
- const char * synctex_suffix = ".synctex";
- const char * synctex_suffix_gz = ".gz";
- typedef struct __synctex_class_t _synctex_class_t;
- typedef _synctex_class_t * synctex_class_t;
- typedef union _synctex_info_t {
- int INT;
- char * PTR;
- } synctex_info_t;
- struct _synctex_node {
- synctex_class_t class;
- synctex_info_t * implementation;
- };
- typedef synctex_node_t *(*_synctex_node_getter_t)(synctex_node_t);
- typedef synctex_info_t *(*_synctex_info_getter_t)(synctex_node_t);
- struct __synctex_class_t {
- synctex_scanner_t scanner;
- int type;
- synctex_node_t (*new)(synctex_scanner_t scanner);
- void (*free)(synctex_node_t);
- void (*log)(synctex_node_t);
- void (*display)(synctex_node_t);
- _synctex_node_getter_t parent;
- _synctex_node_getter_t child;
- _synctex_node_getter_t sibling;
- _synctex_node_getter_t friend;
- _synctex_node_getter_t next_box;
- _synctex_info_getter_t info;
- };
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Abstract OBJECTS and METHODS
- # endif
- # define SYNCTEX_CAN_PERFORM(NODE,SELECTOR)\
- (NULL!=((((NODE)->class))->SELECTOR))
- # define SYNCTEX_MSG_SEND(NODE,SELECTOR) if (NODE && SYNCTEX_CAN_PERFORM(NODE,SELECTOR)) {\
- (*((((NODE)->class))->SELECTOR))(NODE);\
- }
- # define SYNCTEX_GET(NODE,SELECTOR)((NODE && SYNCTEX_CAN_PERFORM(NODE,SELECTOR))?SYNCTEX_GETTER(NODE,SELECTOR)[0]:(NULL))
- # define SYNCTEX_GETTER(NODE,SELECTOR)\
- ((synctex_node_t *)((*((((NODE)->class))->SELECTOR))(NODE)))
- # define SYNCTEX_FREE(NODE) SYNCTEX_MSG_SEND(NODE,free);
- # define SYNCTEX_PARENT(NODE) SYNCTEX_GET(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;\
- }
- # define SYNCTEX_CHILD(NODE) SYNCTEX_GET(NODE,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;\
- }
- # define SYNCTEX_SIBLING(NODE) SYNCTEX_GET(NODE,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)) {\
- SYNCTEX_GETTER(NEW_SIBLING,parent)[0]=SYNCTEX_GETTER(NODE,parent)[0];\
- }\
- }
- # define SYNCTEX_FRIEND(NODE) SYNCTEX_GET(NODE,friend)
- # define SYNCTEX_SET_FRIEND(NODE,NEW_FRIEND) if (NODE && NEW_FRIEND){\
- SYNCTEX_GETTER(NODE,friend)[0]=NEW_FRIEND;\
- }
- # define SYNCTEX_NEXT_HORIZ_BOX(NODE) SYNCTEX_GET(NODE,next_box)
- # define SYNCTEX_SET_NEXT_HORIZ_BOX(NODE,NEXT_BOX) if (NODE && NEXT_BOX){\
- SYNCTEX_GETTER(NODE,next_box)[0]=NEXT_BOX;\
- }
- void _synctex_free_node(synctex_node_t node);
- void _synctex_free_leaf(synctex_node_t node);
- void _synctex_free_node(synctex_node_t node) {
- if (node) {
- (*((node->class)->sibling))(node);
- SYNCTEX_FREE(SYNCTEX_SIBLING(node));
- SYNCTEX_FREE(SYNCTEX_CHILD(node));
- free(node);
- }
- return;
- }
- void _synctex_free_leaf(synctex_node_t node) {
- if (node) {
- SYNCTEX_FREE(SYNCTEX_SIBLING(node));
- free(node);
- }
- return;
- }
- # ifdef __SYNCTEX_WORK__
- # include "/usr/include/zlib.h"
- # else
- # include <zlib.h>
- # endif
- struct __synctex_scanner_t {
- gzFile file;
- char * buffer_cur;
- char * buffer_start;
- char * buffer_end;
- char * output_fmt;
- char * output;
- char * synctex;
- int version;
- struct {
- unsigned has_parsed:1;
- unsigned reserved:sizeof(unsigned)-1;
- } flags;
- int pre_magnification;
- int pre_unit;
- int pre_x_offset;
- int pre_y_offset;
- int count;
- float unit;
- float x_offset;
- float y_offset;
- synctex_node_t sheet;
- synctex_node_t input;
- int number_of_lists;
- synctex_node_t * lists_of_friends;
- _synctex_class_t class[synctex_node_number_of_types];
- };
- # define SYNCTEX_CUR (scanner->buffer_cur)
- # define SYNCTEX_START (scanner->buffer_start)
- # define SYNCTEX_END (scanner->buffer_end)
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark OBJECTS, their creators and destructors.
- # endif
- # define SYNCTEX_INFO(NODE) ((*((((NODE)->class))->info))(NODE))
- # define SYNCTEX_PAGE_IDX 0
- # define SYNCTEX_PAGE(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_PAGE_IDX].INT
- # define SYNCTEX_MAKE_GET(SYNCTEX_GETTER,OFFSET)\
- synctex_node_t * SYNCTEX_GETTER (synctex_node_t node);\
- synctex_node_t * SYNCTEX_GETTER (synctex_node_t node) {\
- return node?(synctex_node_t *)((&((node)->implementation))+OFFSET):NULL;\
- }
- SYNCTEX_MAKE_GET(_synctex_implementation_0,0)
- SYNCTEX_MAKE_GET(_synctex_implementation_1,1)
- SYNCTEX_MAKE_GET(_synctex_implementation_2,2)
- SYNCTEX_MAKE_GET(_synctex_implementation_3,3)
- SYNCTEX_MAKE_GET(_synctex_implementation_4,4)
- SYNCTEX_MAKE_GET(_synctex_implementation_5,5)
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[3+SYNCTEX_PAGE_IDX+1];
- } synctex_sheet_t;
- synctex_node_t _synctex_new_sheet(synctex_scanner_t scanner);
- void _synctex_display_sheet(synctex_node_t sheet);
- void _synctex_log_sheet(synctex_node_t sheet);
- static _synctex_class_t synctex_class_sheet = {
- NULL,
- synctex_node_type_sheet,
- &_synctex_new_sheet,
- &_synctex_free_node,
- &_synctex_log_sheet,
- &_synctex_display_sheet,
- NULL,
- &_synctex_implementation_0,
- &_synctex_implementation_1,
- NULL,
- &_synctex_implementation_2,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- synctex_node_t _synctex_new_sheet(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_sheet_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_sheet:(synctex_class_t)&synctex_class_sheet;
- }
- return node;
- }
- # define SYNCTEX_TAG_IDX 0
- # define SYNCTEX_LINE_IDX (SYNCTEX_TAG_IDX+1)
- # define SYNCTEX_COLUMN_IDX (SYNCTEX_LINE_IDX+1)
- # define SYNCTEX_HORIZ_IDX (SYNCTEX_COLUMN_IDX+1)
- # define SYNCTEX_VERT_IDX (SYNCTEX_HORIZ_IDX+1)
- # define SYNCTEX_WIDTH_IDX (SYNCTEX_VERT_IDX+1)
- # define SYNCTEX_HEIGHT_IDX (SYNCTEX_WIDTH_IDX+1)
- # define SYNCTEX_DEPTH_IDX (SYNCTEX_HEIGHT_IDX+1)
- # define SYNCTEX_TAG(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_TAG_IDX].INT
- # define SYNCTEX_LINE(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_LINE_IDX].INT
- # define SYNCTEX_COLUMN(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_COLUMN_IDX].INT
- # define SYNCTEX_HORIZ(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_HORIZ_IDX].INT
- # define SYNCTEX_VERT(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_VERT_IDX].INT
- # define SYNCTEX_WIDTH(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_WIDTH_IDX].INT
- # define SYNCTEX_HEIGHT(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_HEIGHT_IDX].INT
- # define SYNCTEX_DEPTH(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_DEPTH_IDX].INT
- # define SYNCTEX_ABS_WIDTH(NODE) ((SYNCTEX_WIDTH(NODE)>0?SYNCTEX_WIDTH(NODE):-SYNCTEX_WIDTH(NODE)))
- # define SYNCTEX_ABS_HEIGHT(NODE) ((SYNCTEX_HEIGHT(NODE)>0?SYNCTEX_HEIGHT(NODE):-SYNCTEX_HEIGHT(NODE)))
- # define SYNCTEX_ABS_DEPTH(NODE) ((SYNCTEX_DEPTH(NODE)>0?SYNCTEX_DEPTH(NODE):-SYNCTEX_DEPTH(NODE)))
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[5+SYNCTEX_DEPTH_IDX+1];
- } synctex_vert_box_node_t;
- synctex_node_t _synctex_new_vbox(synctex_scanner_t scanner);
- void _synctex_log_box(synctex_node_t sheet);
- void _synctex_display_vbox(synctex_node_t node);
- static _synctex_class_t synctex_class_vbox = {
- NULL,
- synctex_node_type_vbox,
- &_synctex_new_vbox,
- &_synctex_free_node,
- &_synctex_log_box,
- &_synctex_display_vbox,
- &_synctex_implementation_0,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- &_synctex_implementation_3,
- &_synctex_implementation_4,
- (_synctex_info_getter_t)&_synctex_implementation_5
- };
- synctex_node_t _synctex_new_vbox(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_vert_box_node_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_vbox:(synctex_class_t)&synctex_class_vbox;
- }
- return node;
- }
- # define SYNCTEX_HORIZ_V_IDX (SYNCTEX_DEPTH_IDX+1)
- # define SYNCTEX_VERT_V_IDX (SYNCTEX_HORIZ_V_IDX+1)
- # define SYNCTEX_WIDTH_V_IDX (SYNCTEX_VERT_V_IDX+1)
- # define SYNCTEX_HEIGHT_V_IDX (SYNCTEX_WIDTH_V_IDX+1)
- # define SYNCTEX_DEPTH_V_IDX (SYNCTEX_HEIGHT_V_IDX+1)
- # define SYNCTEX_HORIZ_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_HORIZ_V_IDX].INT
- # define SYNCTEX_VERT_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_VERT_V_IDX].INT
- # define SYNCTEX_WIDTH_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_WIDTH_V_IDX].INT
- # define SYNCTEX_HEIGHT_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_HEIGHT_V_IDX].INT
- # define SYNCTEX_DEPTH_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_DEPTH_V_IDX].INT
- # define SYNCTEX_ABS_WIDTH_V(NODE) ((SYNCTEX_WIDTH_V(NODE)>0?SYNCTEX_WIDTH_V(NODE):-SYNCTEX_WIDTH_V(NODE)))
- # define SYNCTEX_ABS_HEIGHT_V(NODE) ((SYNCTEX_HEIGHT_V(NODE)>0?SYNCTEX_HEIGHT_V(NODE):-SYNCTEX_HEIGHT_V(NODE)))
- # define SYNCTEX_ABS_DEPTH_V(NODE) ((SYNCTEX_DEPTH_V(NODE)>0?SYNCTEX_DEPTH_V(NODE):-SYNCTEX_DEPTH_V(NODE)))
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[5+SYNCTEX_DEPTH_V_IDX+1];
- } synctex_horiz_box_node_t;
- synctex_node_t _synctex_new_hbox(synctex_scanner_t scanner);
- void _synctex_display_hbox(synctex_node_t node);
- void _synctex_log_horiz_box(synctex_node_t sheet);
- static _synctex_class_t synctex_class_hbox = {
- NULL,
- synctex_node_type_hbox,
- &_synctex_new_hbox,
- &_synctex_free_node,
- &_synctex_log_horiz_box,
- &_synctex_display_hbox,
- &_synctex_implementation_0,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- &_synctex_implementation_3,
- &_synctex_implementation_4,
- (_synctex_info_getter_t)&_synctex_implementation_5
- };
- synctex_node_t _synctex_new_hbox(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_horiz_box_node_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_hbox:(synctex_class_t)&synctex_class_hbox;
- }
- return node;
- }
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[3+SYNCTEX_DEPTH_IDX+1];
- } synctex_void_box_node_t;
- synctex_node_t _synctex_new_void_vbox(synctex_scanner_t scanner);
- void _synctex_log_void_box(synctex_node_t sheet);
- void _synctex_display_void_vbox(synctex_node_t node);
- static _synctex_class_t synctex_class_void_vbox = {
- NULL,
- synctex_node_type_void_vbox,
- &_synctex_new_void_vbox,
- &_synctex_free_node,
- &_synctex_log_void_box,
- &_synctex_display_void_vbox,
- &_synctex_implementation_0,
- NULL,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- 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) {
- node->class = scanner?scanner->class+synctex_node_type_void_vbox:(synctex_class_t)&synctex_class_void_vbox;
- }
- return node;
- }
- synctex_node_t _synctex_new_void_hbox(synctex_scanner_t scanner);
- void _synctex_display_void_hbox(synctex_node_t node);
- static _synctex_class_t synctex_class_void_hbox = {
- NULL,
- synctex_node_type_void_hbox,
- &_synctex_new_void_hbox,
- &_synctex_free_node,
- &_synctex_log_void_box,
- &_synctex_display_void_hbox,
- &_synctex_implementation_0,
- NULL,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- 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) {
- node->class = scanner?scanner->class+synctex_node_type_void_hbox:(synctex_class_t)&synctex_class_void_hbox;
- }
- return node;
- }
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[3+SYNCTEX_WIDTH_IDX+1];
- } synctex_medium_node_t;
- #define SYNCTEX_IS_BOX(NODE)\
- ((NODE->class->type == synctex_node_type_vbox)\
- || (NODE->class->type == synctex_node_type_void_vbox)\
- || (NODE->class->type == synctex_node_type_hbox)\
- || (NODE->class->type == synctex_node_type_void_hbox))
-
- #define SYNCTEX_HAS_CHILDREN(NODE) (NODE && SYNCTEX_CHILD(NODE))
-
- void _synctex_log_medium_node(synctex_node_t node);
- synctex_node_t _synctex_new_math(synctex_scanner_t scanner);
- void _synctex_display_math(synctex_node_t node);
- static _synctex_class_t synctex_class_math = {
- NULL,
- synctex_node_type_math,
- &_synctex_new_math,
- &_synctex_free_leaf,
- &_synctex_log_medium_node,
- &_synctex_display_math,
- &_synctex_implementation_0,
- NULL,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- synctex_node_t _synctex_new_math(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_math:(synctex_class_t)&synctex_class_math;
- }
- return node;
- }
- synctex_node_t _synctex_new_kern(synctex_scanner_t scanner);
- void _synctex_display_kern(synctex_node_t node);
- static _synctex_class_t synctex_class_kern = {
- NULL,
- synctex_node_type_kern,
- &_synctex_new_kern,
- &_synctex_free_leaf,
- &_synctex_log_medium_node,
- &_synctex_display_kern,
- &_synctex_implementation_0,
- NULL,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- synctex_node_t _synctex_new_kern(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_kern:(synctex_class_t)&synctex_class_kern;
- }
- return node;
- }
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[3+SYNCTEX_VERT_IDX+1];
- } synctex_small_node_t;
- void _synctex_log_small_node(synctex_node_t node);
- synctex_node_t _synctex_new_glue(synctex_scanner_t scanner);
- void _synctex_display_glue(synctex_node_t node);
- static _synctex_class_t synctex_class_glue = {
- NULL,
- synctex_node_type_glue,
- &_synctex_new_glue,
- &_synctex_free_leaf,
- &_synctex_log_medium_node,
- &_synctex_display_glue,
- &_synctex_implementation_0,
- NULL,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- synctex_node_t _synctex_new_glue(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_glue:(synctex_class_t)&synctex_class_glue;
- }
- return node;
- }
- synctex_node_t _synctex_new_boundary(synctex_scanner_t scanner);
- void _synctex_display_boundary(synctex_node_t node);
- static _synctex_class_t synctex_class_boundary = {
- NULL,
- synctex_node_type_boundary,
- &_synctex_new_boundary,
- &_synctex_free_leaf,
- &_synctex_log_small_node,
- &_synctex_display_boundary,
- &_synctex_implementation_0,
- NULL,
- &_synctex_implementation_1,
- &_synctex_implementation_2,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_3
- };
- synctex_node_t _synctex_new_boundary(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_small_node_t));
- if (node) {
- node->class = scanner?scanner->class+synctex_node_type_boundary:(synctex_class_t)&synctex_class_boundary;
- }
- return node;
- }
- # define SYNCTEX_NAME_IDX (SYNCTEX_TAG_IDX+1)
- # define SYNCTEX_NAME(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_NAME_IDX].PTR
- typedef struct {
- synctex_class_t class;
- synctex_info_t implementation[1+SYNCTEX_NAME_IDX+1];
- } synctex_input_t;
- synctex_node_t _synctex_new_input(synctex_scanner_t scanner);
- void _synctex_free_input(synctex_node_t node);
- void _synctex_display_input(synctex_node_t node);
- void _synctex_log_input(synctex_node_t sheet);
- static _synctex_class_t synctex_class_input = {
- NULL,
- synctex_node_type_input,
- &_synctex_new_input,
- &_synctex_free_input,
- &_synctex_log_input,
- &_synctex_display_input,
- NULL,
- NULL,
- &_synctex_implementation_0,
- NULL,
- NULL,
- (_synctex_info_getter_t)&_synctex_implementation_1
- };
- synctex_node_t _synctex_new_input(synctex_scanner_t scanner) {
- synctex_node_t node = _synctex_malloc(sizeof(synctex_input_t));
- 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) {
- SYNCTEX_FREE(SYNCTEX_SIBLING(node));
- free(SYNCTEX_NAME(node));
- free(node);
- }
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Navigation
- # endif
- synctex_node_t synctex_node_parent(synctex_node_t node)
- {
- return SYNCTEX_PARENT(node);
- }
- synctex_node_t synctex_node_sheet(synctex_node_t node)
- {
- while(node && node->class->type != synctex_node_type_sheet) {
- node = SYNCTEX_PARENT(node);
- }
-
- return node;
- }
- synctex_node_t synctex_node_child(synctex_node_t node)
- {
- return SYNCTEX_CHILD(node);
- }
- 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)) {
- return SYNCTEX_CHILD(node);
- }
- sibling:
- if (SYNCTEX_SIBLING(node)) {
- return SYNCTEX_SIBLING(node);
- }
- if ((node = SYNCTEX_PARENT(node))) {
- if (node->class->type == synctex_node_type_sheet) {
- return NULL;
- }
- goto sibling;
- }
- return NULL;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark CLASS
- # endif
- synctex_node_type_t synctex_node_type(synctex_node_t node) {
- if (node) {
- return (((node)->class))->type;
- }
- return synctex_node_type_error;
- }
- const char * synctex_node_isa(synctex_node_t node) {
- static const char * isa[synctex_node_number_of_types] =
- {"Not a node","input","sheet","vbox","void vbox","hbox","void hbox","kern","glue","math","boundary"};
- return isa[synctex_node_type(node)];
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark SYNCTEX_LOG
- # endif
- # define SYNCTEX_LOG(NODE) SYNCTEX_MSG_SEND(NODE,log)
- void synctex_node_log(synctex_node_t node) {
- SYNCTEX_LOG(node);
- }
- # define SYNCTEX_DISPLAY(NODE) SYNCTEX_MSG_SEND(NODE,display)
- void synctex_node_display(synctex_node_t node) {
- SYNCTEX_DISPLAY(node);
- }
- void _synctex_display_input(synctex_node_t node) {
- printf("....Input:%i:%s\n",
- SYNCTEX_TAG(node),
- SYNCTEX_NAME(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_log_sheet(synctex_node_t 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));
- printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(sheet));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(sheet));
- printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(sheet));
- }
- }
- void _synctex_log_small_node(synctex_node_t node) {
- printf("%s:%i,%i:%i,%i\n",
- synctex_node_isa(node),
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node));
- printf("SELF:%p",(void *)node);
- printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node));
- printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node));
- printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node));
- }
- void _synctex_log_medium_node(synctex_node_t node) {
- printf("%s:%i,%i:%i,%i:%i\n",
- synctex_node_isa(node),
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node),
- SYNCTEX_WIDTH(node));
- printf("SELF:%p",(void *)node);
- printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node));
- printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node));
- printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node));
- }
- void _synctex_log_void_box(synctex_node_t node) {
- printf("%s",synctex_node_isa(node));
- printf(":%i",SYNCTEX_TAG(node));
- printf(",%i",SYNCTEX_LINE(node));
- printf(",%i",0);
- printf(":%i",SYNCTEX_HORIZ(node));
- printf(",%i",SYNCTEX_VERT(node));
- printf(":%i",SYNCTEX_WIDTH(node));
- printf(",%i",SYNCTEX_HEIGHT(node));
- printf(",%i",SYNCTEX_DEPTH(node));
- printf("\nSELF:%p",(void *)node);
- printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node));
- printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node));
- printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node));
- }
- void _synctex_log_box(synctex_node_t node) {
- printf("%s",synctex_node_isa(node));
- printf(":%i",SYNCTEX_TAG(node));
- printf(",%i",SYNCTEX_LINE(node));
- printf(",%i",0);
- printf(":%i",SYNCTEX_HORIZ(node));
- printf(",%i",SYNCTEX_VERT(node));
- printf(":%i",SYNCTEX_WIDTH(node));
- printf(",%i",SYNCTEX_HEIGHT(node));
- printf(",%i",SYNCTEX_DEPTH(node));
- printf("\nSELF:%p",(void *)node);
- printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node));
- printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node));
- printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node));
- }
- void _synctex_log_horiz_box(synctex_node_t node) {
- printf("%s",synctex_node_isa(node));
- printf(":%i",SYNCTEX_TAG(node));
- printf(",%i",SYNCTEX_LINE(node));
- printf(",%i",0);
- printf(":%i",SYNCTEX_HORIZ(node));
- printf(",%i",SYNCTEX_VERT(node));
- printf(":%i",SYNCTEX_WIDTH(node));
- printf(",%i",SYNCTEX_HEIGHT(node));
- printf(",%i",SYNCTEX_DEPTH(node));
- printf("/%i",SYNCTEX_HORIZ_V(node));
- printf(",%i",SYNCTEX_VERT_V(node));
- printf(":%i",SYNCTEX_WIDTH_V(node));
- printf(",%i",SYNCTEX_HEIGHT_V(node));
- printf(",%i",SYNCTEX_DEPTH_V(node));
- printf("\nSELF:%p",(void *)node);
- printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node));
- printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node));
- printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node));
- }
- void _synctex_log_input(synctex_node_t node) {
- printf("%s",synctex_node_isa(node));
- printf(":%i",SYNCTEX_TAG(node));
- printf(",%s",SYNCTEX_NAME(node));
- printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node));
- }
- void _synctex_display_sheet(synctex_node_t sheet) {
- if (sheet) {
- printf("....{%i\n",SYNCTEX_PAGE(sheet));
- SYNCTEX_DISPLAY(SYNCTEX_CHILD(sheet));
- printf("....}\n");
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(sheet));
- }
- }
- void _synctex_display_vbox(synctex_node_t node) {
- printf("....[%i,%i:%i,%i:%i,%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node),
- SYNCTEX_WIDTH(node),
- SYNCTEX_HEIGHT(node),
- SYNCTEX_DEPTH(node));
- SYNCTEX_DISPLAY(SYNCTEX_CHILD(node));
- printf("....]\n");
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_hbox(synctex_node_t node) {
- printf("....(%i,%i:%i,%i:%i,%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node),
- SYNCTEX_WIDTH(node),
- SYNCTEX_HEIGHT(node),
- SYNCTEX_DEPTH(node));
- SYNCTEX_DISPLAY(SYNCTEX_CHILD(node));
- printf("....)\n");
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_void_vbox(synctex_node_t node) {
- printf("....v%i,%i;%i,%i:%i,%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node),
- SYNCTEX_WIDTH(node),
- SYNCTEX_HEIGHT(node),
- SYNCTEX_DEPTH(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_void_hbox(synctex_node_t node) {
- printf("....h%i,%i:%i,%i:%i,%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node),
- SYNCTEX_WIDTH(node),
- SYNCTEX_HEIGHT(node),
- SYNCTEX_DEPTH(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_glue(synctex_node_t node) {
- printf("....glue:%i,%i:%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_math(synctex_node_t node) {
- printf("....math:%i,%i:%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_kern(synctex_node_t node) {
- printf("....kern:%i,%i:%i,%i:%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node),
- SYNCTEX_WIDTH(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- void _synctex_display_boundary(synctex_node_t node) {
- printf("....boundary:%i,%i:%i,%i\n",
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node),
- SYNCTEX_HORIZ(node),
- SYNCTEX_VERT(node));
- SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node));
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark SCANNER
- # endif
- typedef int synctex_status_t;
- # define SYNCTEX_STATUS_EOF 0
- # define SYNCTEX_STATUS_NOT_OK (SYNCTEX_STATUS_EOF+1)
- # define SYNCTEX_STATUS_OK (SYNCTEX_STATUS_NOT_OK+1)
- # define SYNCTEX_STATUS_ERROR -1
- # define SYNCTEX_STATUS_BAD_ARGUMENT -2
- # define SYNCTEX_FILE (scanner->file)
- # define SYNCTEX_BUFFER_MIN_SIZE 16
- # define SYNCTEX_BUFFER_SIZE 32768
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Prototypes
- # endif
- void _synctex_log_void_box(synctex_node_t node);
- void _synctex_log_box(synctex_node_t node);
- void _synctex_log_horiz_box(synctex_node_t node);
- void _synctex_log_input(synctex_node_t node);
- synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, size_t * size_ptr);
- synctex_status_t _synctex_next_line(synctex_scanner_t scanner);
- synctex_status_t _synctex_match_string(synctex_scanner_t scanner, const char * the_string);
- synctex_status_t _synctex_decode_int(synctex_scanner_t scanner, int* value_ref);
- synctex_status_t _synctex_decode_string(synctex_scanner_t scanner, char ** value_ref);
- synctex_status_t _synctex_scan_input(synctex_scanner_t scanner);
- synctex_status_t _synctex_scan_preamble(synctex_scanner_t scanner);
- synctex_status_t _synctex_scan_float_and_dimension(synctex_scanner_t scanner, float * value_ref);
- synctex_status_t _synctex_scan_post_scriptum(synctex_scanner_t scanner);
- 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);
- const char * synctex_scanner_get_output_fmt(synctex_scanner_t scanner);
- int _synctex_node_is_box(synctex_node_t node);
- int _synctex_bail(void);
- 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) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- # define size (* size_ptr)
- if (size>SYNCTEX_BUFFER_SIZE){
- size = SYNCTEX_BUFFER_SIZE;
- }
- available = SYNCTEX_END - SYNCTEX_CUR;
- if (size<=available) {
-
- size = available;
- return SYNCTEX_STATUS_OK;
- }
- if (SYNCTEX_FILE) {
-
- int already_read = 0;
- if (available) {
- memmove(SYNCTEX_START, SYNCTEX_CUR, available);
- }
- SYNCTEX_CUR = SYNCTEX_START + available;
-
- already_read = gzread(SYNCTEX_FILE,(void *)SYNCTEX_CUR,SYNCTEX_BUFFER_SIZE - available);
- if (already_read>0) {
-
- SYNCTEX_END = SYNCTEX_CUR + already_read;
-
- * SYNCTEX_END = '\0';
- SYNCTEX_CUR = SYNCTEX_START;
- size = SYNCTEX_END - SYNCTEX_CUR;
- return SYNCTEX_STATUS_OK;
- } else if (0>already_read) {
-
- int errnum = 0;
- const char * error_string = gzerror(SYNCTEX_FILE, &errnum);
- if (Z_ERRNO == errnum) {
-
- _synctex_error("gzread error from the file system (%i)",errno);
- return SYNCTEX_STATUS_ERROR;
- } else if (errnum) {
- _synctex_error("gzread error (%i:%i,%s)",already_read,errnum,error_string);
- return SYNCTEX_STATUS_ERROR;
- }
- }
-
- gzclose(SYNCTEX_FILE);
- SYNCTEX_FILE = NULL;
- SYNCTEX_END = SYNCTEX_CUR;
- SYNCTEX_CUR = SYNCTEX_START;
- * SYNCTEX_END = '\0';
- size = SYNCTEX_END - SYNCTEX_CUR;
- return SYNCTEX_STATUS_EOF;
- }
-
- size = available;
- return SYNCTEX_STATUS_EOF;
- # undef size
- }
- synctex_status_t _synctex_next_line(synctex_scanner_t scanner) {
- synctex_status_t status = SYNCTEX_STATUS_OK;
- size_t available = 0;
- if (NULL == scanner) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- infinite_loop:
- while(SYNCTEX_CUR<SYNCTEX_END) {
- if (*SYNCTEX_CUR == '\n') {
- ++SYNCTEX_CUR;
- available = 1;
- return _synctex_buffer_get_available_size(scanner, &available);
- }
- ++SYNCTEX_CUR;
- }
-
- available = 1;
- status = _synctex_buffer_get_available_size(scanner, &available);
- if (status<=0) {
- return status;
- }
- goto infinite_loop;
- }
- synctex_status_t _synctex_match_string(synctex_scanner_t scanner, const char * the_string) {
- size_t tested_len = 0;
- size_t remaining_len = 0;
- size_t available = 0;
- synctex_status_t status = 0;
- if (NULL == scanner || NULL == the_string) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- remaining_len = strlen(the_string);
- if (0 == remaining_len) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
-
- available = remaining_len;
- status = _synctex_buffer_get_available_size(scanner,&available);
- if (status<SYNCTEX_STATUS_EOF) {
- return status;
- }
-
- if (available>=remaining_len) {
-
- if (strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) {
- return SYNCTEX_STATUS_NOT_OK;
- }
- return_OK:
-
- SYNCTEX_CUR += remaining_len;
- return SYNCTEX_STATUS_OK;
- } else if (strncmp((char *)SYNCTEX_CUR,the_string,available)) {
-
- return SYNCTEX_STATUS_NOT_OK;
- } else if (SYNCTEX_FILE) {
-
- z_off_t offset = 0L;
-
- the_string += available;
-
- remaining_len -= available;
- tested_len += available;
- SYNCTEX_CUR += available;
- if (0 == remaining_len) {
-
- return tested_len;
- }
-
- offset = gztell(SYNCTEX_FILE);
-
- available = SYNCTEX_CUR - SYNCTEX_START;
-
- offset -= available;
- more_characters:
-
- available = remaining_len;
- status = _synctex_buffer_get_available_size(scanner,&available);
- if (status<SYNCTEX_STATUS_EOF) {
- return status;
- }
- if (available==0) {
-
- return_NOT_OK:
- if (offset != gzseek(SYNCTEX_FILE,offset,SEEK_SET)) {
-
- _synctex_error("can't seek file");
- return SYNCTEX_STATUS_ERROR;
- }
-
- SYNCTEX_CUR = SYNCTEX_END;
- return SYNCTEX_STATUS_NOT_OK;
- }
- if (available<remaining_len) {
-
- if (strncmp((char *)SYNCTEX_CUR,the_string,available)) {
-
- goto return_NOT_OK;
- }
-
- the_string += available;
-
- remaining_len -= available;
- tested_len += available;
- SYNCTEX_CUR += available;
- if (0 == remaining_len) {
-
- return SYNCTEX_STATUS_OK;
- }
- goto more_characters;
- }
-
- if (strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) {
-
- goto return_NOT_OK;
- }
- goto return_OK;
- } else {
-
- return SYNCTEX_STATUS_EOF;
- }
- }
- synctex_status_t _synctex_decode_int(synctex_scanner_t scanner, int* value_ref) {
- char * ptr = NULL;
- char * end = NULL;
- int result = 0;
- size_t available = 0;
- synctex_status_t status = 0;
- 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) {
- return status;
- }
- if (available==0) {
- return SYNCTEX_STATUS_EOF;
- }
- ptr = SYNCTEX_CUR;
- if (*ptr==':' || *ptr==',') {
- ++ptr;
- --available;
- if (available==0) {
- return SYNCTEX_STATUS_NOT_OK;
- }
- }
- result = (int)strtol(ptr, &end, 10);
- if (end>ptr) {
- SYNCTEX_CUR = end;
- if (value_ref) {
- * value_ref = result;
- }
- return SYNCTEX_STATUS_OK;
- }
- return SYNCTEX_STATUS_NOT_OK;
- }
- synctex_status_t _synctex_decode_string(synctex_scanner_t scanner, char ** value_ref) {
- char * end = NULL;
- size_t current_size = 0;
- size_t new_size = 0;
- size_t len = 0;
- size_t available = 0;
- synctex_status_t status = 0;
- if (NULL == scanner || NULL == value_ref) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
-
- if (SYNCTEX_CUR>=SYNCTEX_END) {
- available = 1;
- status = _synctex_buffer_get_available_size(scanner,&available);
- if (status < 0) {
- return status;
- }
- if (0 == available) {
- return SYNCTEX_STATUS_EOF;
- }
- }
-
-
- end = SYNCTEX_CUR;
- * value_ref = NULL;
-
- next_character:
- if (end<SYNCTEX_END) {
- if (*end == '\n') {
-
- len = end - SYNCTEX_CUR;
- if (current_size>UINT_MAX-len-1) {
-
- return UINT_MAX-len-1 - current_size;
- }
- new_size = current_size+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';
- SYNCTEX_CUR += len;
- return SYNCTEX_STATUS_OK;
- }
- free(* value_ref);
- * value_ref = NULL;
- _synctex_error("could not copy memory (1).");
- return SYNCTEX_STATUS_ERROR;
- }
- _synctex_error("could not allocate memory (1).");
- return SYNCTEX_STATUS_ERROR;
- } else {
- ++end;
- goto next_character;
- }
- } else {
-
- len = SYNCTEX_END - SYNCTEX_CUR;
- if (current_size>UINT_MAX-len-1) {
-
- _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)) {
- (* value_ref)[new_size]='\0';
- SYNCTEX_CUR = SYNCTEX_END;
- return SYNCTEX_STATUS_OK;
- }
- free(* value_ref);
- * value_ref = NULL;
- _synctex_error("could not copy memory (2).");
- return SYNCTEX_STATUS_ERROR;
- }
-
- _synctex_error("could not allocate memory (2).");
- return SYNCTEX_STATUS_ERROR;
- }
- }
- 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) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- status = _synctex_match_string(scanner,"Input:");
- if (status<SYNCTEX_STATUS_OK) {
- return status;
- }
-
- input = _synctex_new_input(scanner);
- if (NULL == input) {
- _synctex_error("could not create an input node.");
- return SYNCTEX_STATUS_ERROR;
- }
-
- status = _synctex_decode_int(scanner,&(SYNCTEX_TAG(input)));
- if (status<SYNCTEX_STATUS_OK) {
- _synctex_error("bad format of input node.");
- SYNCTEX_FREE(input);
- return status;
- }
-
- available = 1;
- status = _synctex_buffer_get_available_size(scanner, &available);
- if (status<=SYNCTEX_STATUS_ERROR) {
- return status;
- }
- if (0 == available) {
- return SYNCTEX_STATUS_EOF;
- }
-
- ++SYNCTEX_CUR;
- --available;
-
- status = _synctex_decode_string(scanner,&(SYNCTEX_NAME(input)));
- if (status<SYNCTEX_STATUS_OK) {
- SYNCTEX_FREE(input);
- return status;
- }
-
- SYNCTEX_SET_SIBLING(input,scanner->input);
- scanner->input = input;
- return _synctex_next_line(scanner);
-
- }
- typedef synctex_status_t (*synctex_decoder_t)(synctex_scanner_t,void *);
- synctex_status_t _synctex_scan_named(synctex_scanner_t scanner,const char * name,void * value_ref,synctex_decoder_t decoder);
- 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) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- not_found:
- status = _synctex_match_string(scanner,name);
- if (status<SYNCTEX_STATUS_NOT_OK) {
- return status;
- } else if (status == SYNCTEX_STATUS_NOT_OK) {
- status = _synctex_next_line(scanner);
- if (status<SYNCTEX_STATUS_OK) {
- return status;
- }
- goto not_found;
- }
-
- return (*decoder)(scanner,value_ref);
- }
- synctex_status_t _synctex_scan_preamble(synctex_scanner_t scanner) {
- synctex_status_t status = 0;
- 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) {
- return status;
- }
- status = _synctex_next_line(scanner);
- if (status<SYNCTEX_STATUS_OK) {
- return status;
- }
-
- do {
- status = _synctex_scan_input(scanner);
- if (status<SYNCTEX_STATUS_NOT_OK) {
- return status;
- }
- } while(status == SYNCTEX_STATUS_OK);
-
-
- status = _synctex_scan_named(scanner,"Output:",&(scanner->output_fmt),(synctex_decoder_t)&_synctex_decode_string);
- if (status<SYNCTEX_STATUS_NOT_OK) {
- return status;
- }
- status = _synctex_next_line(scanner);
- 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) {
- return status;
- }
- status = _synctex_next_line(scanner);
- 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) {
- return status;
- }
- status = _synctex_next_line(scanner);
- 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) {
- return status;
- }
- status = _synctex_next_line(scanner);
- 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) {
- return status;
- }
- return _synctex_next_line(scanner);
- }
- synctex_status_t _synctex_scan_float_and_dimension(synctex_scanner_t scanner, float * value_ref) {
- synctex_status_t status = 0;
- char * endptr = NULL;
- float f = 0;
- #ifdef HAVE_SETLOCALE
- char * loc = setlocale(LC_NUMERIC, NULL);
- #endif
- size_t available = 0;
- 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) {
- _synctex_error("problem with float.");
- return status;
- }
- #ifdef HAVE_SETLOCALE
- setlocale(LC_NUMERIC, "C");
- #endif
- f = strtod(SYNCTEX_CUR,&endptr);
- #ifdef HAVE_SETLOCALE
- setlocale(LC_NUMERIC, loc);
- #endif
- 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) {
- f *= 72.27f*65536;
- } 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) {
- f *= 72.27f*65536/2.54f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"mm")) >= SYNCTEX_STATUS_OK) {
- f *= 72.27f*65536/25.4f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"pt")) >= SYNCTEX_STATUS_OK) {
- f *= 65536.0f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"bp")) >= SYNCTEX_STATUS_OK) {
- f *= 72.27f/72*65536.0f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"pc")) >= SYNCTEX_STATUS_OK) {
- f *= 12.0*65536.0f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"sp")) >= SYNCTEX_STATUS_OK) {
- f *= 1.0f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"dd")) >= SYNCTEX_STATUS_OK) {
- f *= 1238.0f/1157*65536.0f;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"cc")) >= SYNCTEX_STATUS_OK) {
- f *= 14856.0f/1157*65536;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"nd")) >= SYNCTEX_STATUS_OK) {
- f *= 685.0f/642*65536;
- } else if (status<0) {
- goto report_unit_error;
- } else if ((status = _synctex_match_string(scanner,"nc")) >= SYNCTEX_STATUS_OK) {
- f *= 1370.0f/107*65536;
- } else if (status<0) {
- goto report_unit_error;
- }
- *value_ref = f;
- return SYNCTEX_STATUS_OK;
- }
- synctex_status_t _synctex_scan_post_scriptum(synctex_scanner_t scanner) {
- synctex_status_t status = 0;
- char * endptr = NULL;
- #ifdef HAVE_SETLOCALE
- char * loc = setlocale(LC_NUMERIC, NULL);
- #endif
- if (NULL == scanner) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
-
- post_scriptum_not_found:
- status = _synctex_match_string(scanner,"Post scriptum:");
- if (status<SYNCTEX_STATUS_NOT_OK) {
- return status;
- }
- if (status == SYNCTEX_STATUS_NOT_OK) {
- status = _synctex_next_line(scanner);
- if (status<SYNCTEX_STATUS_EOF) {
- return status;
- } else if (status<SYNCTEX_STATUS_OK) {
- return SYNCTEX_STATUS_OK;
- }
- goto post_scriptum_not_found;
- }
-
- next_line:
- status = _synctex_next_line(scanner);
- if (status<SYNCTEX_STATUS_EOF) {
- return status;
- } else if (status<SYNCTEX_STATUS_OK) {
- return SYNCTEX_STATUS_OK;
- }
-
- status = _synctex_match_string(scanner,"Magnification:");
- if (status == SYNCTEX_STATUS_OK ) {
- #ifdef HAVE_SETLOCALE
- setlocale(LC_NUMERIC, "C");
- #endif
- scanner->unit = strtod(SYNCTEX_CUR,&endptr);
- #ifdef HAVE_SETLOCALE
- setlocale(LC_NUMERIC, loc);
- #endif
- if (endptr == SYNCTEX_CUR) {
- _synctex_error("bad magnification in the post scriptum, a float was expected.");
- return SYNCTEX_STATUS_ERROR;
- }
- 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){
- report_record_problem:
- _synctex_error("Problem reading the Post Scriptum records");
- return status;
- }
- status = _synctex_match_string(scanner,"X Offset:");
- if (status == SYNCTEX_STATUS_OK) {
- status = _synctex_scan_float_and_dimension(scanner, &(scanner->x_offset));
- 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){
- goto report_record_problem;
- }
- status = _synctex_match_string(scanner,"Y Offset:");
- if (status==SYNCTEX_STATUS_OK) {
- status = _synctex_scan_float_and_dimension(scanner, &(scanner->y_offset));
- 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){
- goto report_record_problem;
- }
- goto next_line;
- }
- int _synctex_scan_postamble(synctex_scanner_t scanner) {
- int status = 0;
- if (NULL == scanner) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- status = _synctex_match_string(scanner,"Postamble:");
- if (status < SYNCTEX_STATUS_OK) {
- return status;
- }
- count_again:
- status = _synctex_next_line(scanner);
- 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) {
- return status;
- } else if (status < SYNCTEX_STATUS_OK) {
- status = _synctex_next_line(scanner);
- if (status<SYNCTEX_STATUS_OK) {
- return status;
- }
- goto count_again;
- }
-
- return _synctex_scan_post_scriptum(scanner);
- }
- synctex_status_t _synctex_setup_visible_box(synctex_node_t box) {
- if (box) {
- switch(box->class->type) {
- case synctex_node_type_hbox:
- 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);
- SYNCTEX_HEIGHT_V(box) = SYNCTEX_HEIGHT(box);
- SYNCTEX_DEPTH_V(box) = SYNCTEX_DEPTH(box);
- return SYNCTEX_STATUS_OK;
- }
- return SYNCTEX_STATUS_ERROR;
- }
- }
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- synctex_status_t _synctex_horiz_box_setup_visible(synctex_node_t node,int h, int v) {
- # ifdef __DARWIN_UNIX03
- # pragma unused(v)
- # endif
- int itsBtm, itsTop;
- if (NULL == node || node->class->type != synctex_node_type_hbox) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
- if (SYNCTEX_WIDTH_V(node)<0) {
- itsBtm = SYNCTEX_HORIZ_V(node);
- itsTop = SYNCTEX_HORIZ_V(node)-SYNCTEX_WIDTH_V(node);
- if (h<itsBtm) {
- SYNCTEX_HORIZ_V(node) = h;
- SYNCTEX_WIDTH_V(node) = SYNCTEX_HORIZ_V(node) - 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) {
- SYNCTEX_HORIZ_V(node) = h;
- SYNCTEX_WIDTH_V(node) = itsTop - SYNCTEX_HORIZ_V(node);
- } else if (h>itsTop) {
- SYNCTEX_WIDTH_V(node) = h - SYNCTEX_HORIZ_V(node);
- }
- }
- return SYNCTEX_STATUS_OK;
- }
- # 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;
- 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);
- }
- synctex_status_t _synctex_scan_sheet(synctex_scanner_t scanner, synctex_node_t sheet) {
- synctex_node_t parent = sheet;
- synctex_node_t child = NULL;
- synctex_node_t sibling = NULL;
- synctex_node_t box = sheet;
- int friend_index = 0;
- synctex_info_t * info = NULL;
- synctex_status_t status = 0;
- size_t available = 0;
- if ((NULL == scanner) || (NULL == sheet)) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
-
- prepare_loop:
- 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))) {
- # define SYNCTEX_DECODE_FAILED(WHAT) \
- (_synctex_decode_int(scanner,&(info[WHAT].INT))<SYNCTEX_STATUS_OK)
- 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad vbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- parent = child;
- child = NULL;
- goto child_loop;
- } else {
- _synctex_error("Can't create vbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_setup_visible_box(child)<SYNCTEX_STATUS_OK
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad hbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child));
- SYNCTEX_SET_CHILD(parent,child);
- parent = child;
- child = NULL;
- goto child_loop;
- } else {
- _synctex_error("Can't create hbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) {
- scan_teehs:
- ++SYNCTEX_CUR;
- 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 == SYNCTEX_CHAR_BEGIN_SHEET) {
-
- ++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) {
- _synctex_error("Missing anchor.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto prepare_loop;
- } else {
-
- ++SYNCTEX_CUR;
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Unexpected end.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto prepare_loop;
- }
- } else {
- available = 1;
- status = _synctex_buffer_get_available_size(scanner,&available);
- if (status<SYNCTEX_STATUS_OK && available>0){
- _synctex_error("Uncomplete sheet(0)");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- } else {
- goto prepare_loop;
- }
- }
- _synctex_bail();
- child_loop:
- if (SYNCTEX_CUR<SYNCTEX_END) {
- if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_VBOX) {
- goto scan_vbox;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_VBOX) {
- scan_xobv:
- ++SYNCTEX_CUR;
- 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)) {
-
- SYNCTEX_UPDATE_BOX_FRIEND(parent);
- }
- child = parent;
- parent = SYNCTEX_PARENT(child);
- } else {
- _synctex_error("Unexpected end of vbox, ignored.");
- }
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Uncomplete sheet.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto sibling_loop;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_HBOX) {
- goto scan_hbox;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_HBOX) {
- scan_xobh:
- ++SYNCTEX_CUR;
- if ((parent) && parent->class->type == synctex_node_type_hbox) {
- if (NULL == child) {
-
- SYNCTEX_UPDATE_BOX_FRIEND(parent);
- }
-
- SYNCTEX_SET_NEXT_HORIZ_BOX(box,parent);
- box = parent;
- child = parent;
- parent = SYNCTEX_PARENT(child);
- } else {
- _synctex_error("Unexpected enf of hbox, ignored.");
- }
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Uncomplete sheet.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto sibling_loop;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_VBOX) {
- ++SYNCTEX_CUR;
- if (NULL != (child = _synctex_new_void_vbox(scanner))
- && NULL != (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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad void vbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- #define SYNCTEX_UPDATE_FRIEND(NODE)\
- friend_index = (info[SYNCTEX_TAG_IDX].INT+info[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;
- SYNCTEX_UPDATE_FRIEND(child);
- goto sibling_loop;
- } else {
- _synctex_error("Can't create vbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_HBOX) {
- ++SYNCTEX_CUR;
- if (NULL != (child = _synctex_new_void_hbox(scanner))
- && NULL != (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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad void hbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("Can't create void hbox record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_KERN) {
- ++SYNCTEX_CUR;
- if (NULL != (child = _synctex_new_kern(scanner))
- && NULL != (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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad kern record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)-SYNCTEX_WIDTH(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("Can't create kern record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_GLUE) {
- ++SYNCTEX_CUR;
- if (NULL != (child = _synctex_new_glue(scanner))
- && NULL != (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)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad glue record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- SYNCTEX_UPDATE_FRIEND(child);
- goto sibling_loop;
- } else {
- _synctex_error("Can't create glue record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_MATH) {
- ++SYNCTEX_CUR;
- if (NULL != (child = _synctex_new_math(scanner))
- && NULL != (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)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad math record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- SYNCTEX_UPDATE_FRIEND(child);
- goto sibling_loop;
- } else {
- _synctex_error("Can't create math record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BOUNDARY) {
- ++SYNCTEX_CUR;
- if (NULL != (child = _synctex_new_boundary(scanner))
- && NULL != (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)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad boundary record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_CHILD(parent,child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- SYNCTEX_UPDATE_FRIEND(child);
- goto sibling_loop;
- } else {
- _synctex_error("Can't create math record.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) {
- goto scan_teehs;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_SHEET) {
-
- ++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_CUR;
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Unexpected end.");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto child_loop;
- }
- } else {
- available = 1;
- status = _synctex_buffer_get_available_size(scanner,&available);
- if (status<SYNCTEX_STATUS_OK && available>0){
- _synctex_error("Uncomplete sheet(0)");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- } else {
- goto child_loop;
- }
- }
- _synctex_bail();
- sibling_loop:
- if (SYNCTEX_CUR<SYNCTEX_END) {
- if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_VBOX) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_vbox(scanner))
- && NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad vbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- parent = sibling;
- child = NULL;
- goto child_loop;
- } else {
- _synctex_error("Can't create vbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_VBOX) {
- goto scan_xobv;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BEGIN_HBOX) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_hbox(scanner)) &&
- NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_setup_visible_box(sibling)<SYNCTEX_STATUS_OK
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad hbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child));
- parent = child;
- child = NULL;
- goto child_loop;
- } else {
- _synctex_error("Can't create hbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_HBOX) {
- goto scan_xobh;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_VBOX) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_void_vbox(scanner)) &&
- NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad void vbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- SYNCTEX_UPDATE_FRIEND(child);
- goto sibling_loop;
- } else {
- _synctex_error("can't create void vbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_VOID_HBOX) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_void_hbox(scanner)) &&
- NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad void hbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("can't create void hbox record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_KERN) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_kern(scanner))
- && NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad kern record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)-SYNCTEX_WIDTH(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("Can't create kern record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_GLUE) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_glue(scanner))
- && NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad glue record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("Can't create glue record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_MATH) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_math(scanner))
- && NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad math record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("Can't create math record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_BOUNDARY) {
- ++SYNCTEX_CUR;
- if (NULL != (sibling = _synctex_new_boundary(scanner))
- && NULL != (info = SYNCTEX_INFO(sibling))) {
- 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)
- || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad boundary record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- SYNCTEX_SET_SIBLING(child,sibling);
- child = sibling;
- SYNCTEX_UPDATE_FRIEND(child);
- _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child));
- goto sibling_loop;
- } else {
- _synctex_error("Can't create boundary record (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_END_SHEET) {
- goto scan_teehs;
- } else if (*SYNCTEX_CUR == SYNCTEX_CHAR_ANCHOR) {
- ++SYNCTEX_CUR;
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Missing anchor (2).");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto sibling_loop;
- } else {
- ++SYNCTEX_CUR;
-
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- goto sibling_loop;
- }
- } else {
- available = 1;
- status = _synctex_buffer_get_available_size(scanner,&available);
- if (status<SYNCTEX_STATUS_OK && available>0){
- goto sibling_loop;
- } else {
- _synctex_error("Uncomplete sheet(2)");
- SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR);
- }
- }
- # undef SYNCTEX_DECODE_FAILED
- }
- synctex_status_t _synctex_scan_content(synctex_scanner_t scanner) {
- synctex_node_t sheet = NULL;
- synctex_status_t status = 0;
- if (NULL == scanner) {
- return SYNCTEX_STATUS_BAD_ARGUMENT;
- }
-
- 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) {
- _synctex_error("malloc:2");
- return SYNCTEX_STATUS_ERROR;
- }
- }
-
- content_not_found:
- status = _synctex_match_string(scanner,"Content:");
- if (status<SYNCTEX_STATUS_EOF) {
- return status;
- }
- if (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) {
- _synctex_error("Uncomplete Content.");
- return SYNCTEX_STATUS_ERROR;
- }
- if (status == SYNCTEX_STATUS_NOT_OK) {
- goto content_not_found;
- }
- next_sheet:
- if (*SYNCTEX_CUR != SYNCTEX_CHAR_BEGIN_SHEET) {
- status = _synctex_scan_postamble(scanner);
- if (status < SYNCTEX_STATUS_EOF) {
- _synctex_error("Bad content.");
- return status;
- }
- if (status<SYNCTEX_STATUS_OK) {
- status = _synctex_next_line(scanner);
- if (status < SYNCTEX_STATUS_OK) {
- _synctex_error("Bad content.");
- return status;
- }
- goto next_sheet;
- }
- return SYNCTEX_STATUS_OK;
- }
- ++SYNCTEX_CUR;
-
- sheet = _synctex_new_sheet(scanner);
- status = _synctex_decode_int(scanner,&(SYNCTEX_PAGE(sheet)));
- 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) {
- _synctex_error("Uncomplete file.");
- goto bail;
- }
- status = _synctex_scan_sheet(scanner,sheet);
- if (status<SYNCTEX_STATUS_OK) {
- _synctex_error("Bad sheet content.");
- goto bail;
- }
- SYNCTEX_SET_SIBLING(sheet,scanner->sheet);
- scanner->sheet = sheet;
- sheet = NULL;
-
- do {
- status = _synctex_scan_input(scanner);
- if (status<SYNCTEX_STATUS_EOF) {
- _synctex_error("Bad input section.");
- goto bail;
- }
- }
- while(status >= SYNCTEX_STATUS_OK);
- goto next_sheet;
- }
- 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);
- synctex_scanner_t synctex_scanner_new_with_output_file(const char * output, const char * build_directory, int parse) {
- gzFile file = NULL;
- char * synctex = NULL;
- synctex_scanner_t scanner = NULL;
- synctex_io_mode_t io_mode = 0;
-
- if (sizeof(int)>sizeof(void*)) {
- _synctex_error("INTERNAL INCONSISTENCY: int's are unexpectedly bigger than pointers, bailing out.");
- return NULL;
- }
-
- if (SYNCTEX_BUFFER_SIZE >= UINT_MAX) {
- _synctex_error("SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (1)");
- return NULL;
- }
-
- if (SYNCTEX_BUFFER_SIZE < SYNCTEX_BUFFER_MIN_SIZE) {
- _synctex_error("SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (2)");
- return NULL;
- }
-
- 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) {
- _synctex_error("SyncTeX: malloc problem");
- free(synctex);
- gzclose(file);
- return NULL;
- }
-
- 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)) {
- _synctex_error("! synctex_scanner_new_with_output_file: Copy problem, scanner's output is not reliable.");
- }
- scanner->synctex = synctex;
- SYNCTEX_FILE = file;
- 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_mode_ref);
- 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) {
-
- 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);
-
- size = strlen(output)+strlen(synctex_suffix)+strlen(synctex_suffix_gz)+1;
- synctex_name = (char *)malloc(size);
- if (NULL == synctex_name) {
- _synctex_error("! __synctex_open: Memory problem (1)\n");
- return 1;
- }
-
- if (synctex_name != strcpy(synctex_name,output)) {
- _synctex_error("! __synctex_open: Copy problem\n");
- return_on_error:
- free(synctex_name);
- free(quoteless_synctex_name);
- return 2;
- }
-
- _synctex_strip_last_path_extension(synctex_name);
- if (!strlen(synctex_name)) {
- goto return_on_error;
- }
-
- if (add_quotes) {
- char * quoted = NULL;
- if (_synctex_copy_with_quoting_last_path_component(synctex_name,"ed,size) || (NULL == quoted)) {
-
- goto return_on_error;
- }
- quoteless_synctex_name = synctex_name;
- synctex_name = quoted;
- }
-
- 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;
- }
-
- 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 (errno != ENOENT) {
-
- _synctex_error("SyncTeX: could not open %s, error %i\n",synctex_name,errno);
- goto return_on_error;
- }
-
- 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 |= synctex_io_gz_mask;
- mode = _synctex_get_io_mode_name(io_mode);
-
- 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 (errno != ENOENT) {
-
- _synctex_error("SyncTeX: could not open %s, error %i\n",synctex_name,errno);
- }
- goto return_on_error;
- }
- }
-
- if (quoteless_synctex_name) {
- gzclose(the_file);
- 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);
-
- if (NULL == (the_file = gzopen(synctex_name,mode))) {
-
- if (errno != ENOENT) {
-
- _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_synctex_name,mode))) {
-
- if (errno != ENOENT) {
-
- _synctex_error("SyncTeX: could not open renamed %s, error %i\n",quoteless_synctex_name,errno);
- }
- goto return_on_error;
- }
-
- free(synctex_name);
- synctex_name = quoteless_synctex_name;
- quoteless_synctex_name = NULL;
- }
- }
-
- * file_ref = the_file;
- * io_mode_ref = io_mode;
- * synctex_name_ref = synctex_name;
- return 0;
- }
- return 3;
- }
- 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_mode_ref);
- if ((result || !*file_ref) && build_directory && strlen(build_directory)) {
- char * build_output;
- 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;
- is_absolute = _synctex_path_is_absolute(build_directory);
- if (!is_absolute) {
- size += strlen(output);
- }
- if ((build_output = (char *)malloc(size))) {
- if (is_absolute) {
- build_output[0] = '\0';
- } else {
- if (build_output != strcpy(build_output,output)) {
- return -4;
- }
- build_output[lpc-output]='\0';
- }
- if (build_output == strcat(build_output,build_directory)) {
-
- if (!SYNCTEX_IS_PATH_SEPARATOR(build_output[strlen(build_directory)-1])) {
- if (build_output != strcat(build_output,"/")) {
- return -2;
- }
- }
-
- if (build_output != strcat(build_output,lpc)) {
- return -3;
- }
- return __synctex_open(build_output,synctex_name_ref,file_ref,add_quotes,io_mode_ref);
- }
- }
- return -1;
- }
- return result;
- # undef synctex_name
- # undef the_file
- }
- void synctex_scanner_free(synctex_scanner_t scanner) {
- if (NULL == scanner) {
- return;
- }
- if (SYNCTEX_FILE) {
- gzclose(SYNCTEX_FILE);
- SYNCTEX_FILE = NULL;
- }
- SYNCTEX_FREE(scanner->sheet);
- SYNCTEX_FREE(scanner->input);
- free(SYNCTEX_START);
- free(scanner->output_fmt);
- free(scanner->output);
- free(scanner->synctex);
- free(scanner->lists_of_friends);
- free(scanner);
- }
- synctex_scanner_t synctex_scanner_parse(synctex_scanner_t scanner) {
- synctex_status_t status = 0;
- if (!scanner || scanner->flags.has_parsed) {
- return scanner;
- }
- scanner->flags.has_parsed=1;
- scanner->pre_magnification = 1000;
- scanner->pre_unit = 8192;
- scanner->pre_x_offset = scanner->pre_y_offset = 578;
-
- scanner->x_offset = scanner->y_offset = 6.027e23f;
- scanner->class[synctex_node_type_sheet] = synctex_class_sheet;
- scanner->class[synctex_node_type_input] = synctex_class_input;
- (scanner->class[synctex_node_type_input]).scanner = scanner;
- (scanner->class[synctex_node_type_sheet]).scanner = scanner;
- scanner->class[synctex_node_type_vbox] = synctex_class_vbox;
- (scanner->class[synctex_node_type_vbox]).scanner = scanner;
- scanner->class[synctex_node_type_void_vbox] = synctex_class_void_vbox;
- (scanner->class[synctex_node_type_void_vbox]).scanner = scanner;
- scanner->class[synctex_node_type_hbox] = synctex_class_hbox;
- (scanner->class[synctex_node_type_hbox]).scanner = scanner;
- scanner->class[synctex_node_type_void_hbox] = synctex_class_void_hbox;
- (scanner->class[synctex_node_type_void_hbox]).scanner = scanner;
- scanner->class[synctex_node_type_kern] = synctex_class_kern;
- (scanner->class[synctex_node_type_kern]).scanner = scanner;
- scanner->class[synctex_node_type_glue] = synctex_class_glue;
- (scanner->class[synctex_node_type_glue]).scanner = scanner;
- scanner->class[synctex_node_type_math] = synctex_class_math;
- (scanner->class[synctex_node_type_math]).scanner = 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);
- if (NULL == SYNCTEX_START) {
- _synctex_error("SyncTeX: malloc error");
- synctex_scanner_free(scanner);
- return NULL;
- }
- SYNCTEX_END = SYNCTEX_START+SYNCTEX_BUFFER_SIZE;
-
- *SYNCTEX_END = '\0';
- SYNCTEX_CUR = SYNCTEX_END;
- status = _synctex_scan_preamble(scanner);
- 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) {
- _synctex_error("SyncTeX Error: Bad content\n");
- goto bailey;
- }
-
- free((void *)SYNCTEX_START);
- SYNCTEX_START = SYNCTEX_CUR = SYNCTEX_END = NULL;
- gzclose(SYNCTEX_FILE);
- SYNCTEX_FILE = NULL;
-
-
- if (scanner->pre_unit<=0) {
- scanner->pre_unit = 8192;
- }
- if (scanner->pre_magnification<=0) {
- scanner->pre_magnification = 1000;
- }
- if (scanner->unit <= 0) {
-
- scanner->unit = scanner->pre_unit / 65781.76;
- } else {
-
- scanner->unit *= scanner->pre_unit / 65781.76;
- }
- scanner->unit *= scanner->pre_magnification / 1000.0;
- if (scanner->x_offset > 6e23) {
-
- scanner->x_offset = scanner->pre_x_offset * (scanner->pre_unit / 65781.76);
- scanner->y_offset = scanner->pre_y_offset * (scanner->pre_unit / 65781.76);
- } else {
-
- scanner->x_offset /= 65781.76f;
- scanner->y_offset /= 65781.76f;
- }
- return scanner;
- #undef SYNCTEX_FILE
- }
- int synctex_scanner_pre_x_offset(synctex_scanner_t scanner){
- return scanner?scanner->pre_x_offset:0;
- }
- int synctex_scanner_pre_y_offset(synctex_scanner_t scanner){
- return scanner?scanner->pre_y_offset:0;
- }
- int synctex_scanner_x_offset(synctex_scanner_t scanner){
- return scanner?scanner->x_offset:0;
- }
- int synctex_scanner_y_offset(synctex_scanner_t scanner){
- return scanner?scanner->y_offset:0;
- }
- float synctex_scanner_magnification(synctex_scanner_t scanner){
- return scanner?scanner->unit:1;
- }
- void synctex_scanner_display(synctex_scanner_t scanner) {
- if (NULL == scanner) {
- return;
- }
- printf("The scanner:\noutput:%s\noutput_fmt:%s\nversion:%i\n",scanner->output,scanner->output_fmt,scanner->version);
- printf("pre_unit:%i\nx_offset:%i\ny_offset:%i\n",scanner->pre_unit,scanner->pre_x_offset,scanner->pre_y_offset);
- printf("count:%i\npost_magnification:%f\npost_x_offset:%f\npost_y_offset:%f\n",
- scanner->count,scanner->unit,scanner->x_offset,scanner->y_offset);
- printf("The input:\n");
- SYNCTEX_DISPLAY(scanner->input);
- if (scanner->count<1000) {
- printf("The sheets:\n");
- SYNCTEX_DISPLAY(scanner->sheet);
- printf("The friends:\n");
- if (scanner->lists_of_friends) {
- int i = scanner->number_of_lists;
- synctex_node_t node;
- while(i--) {
- printf("Friend index:%i\n",i);
- node = (scanner->lists_of_friends)[i];
- while(node) {
- printf("%s:%i,%i\n",
- synctex_node_isa(node),
- SYNCTEX_TAG(node),
- SYNCTEX_LINE(node)
- );
- node = SYNCTEX_FRIEND(node);
- }
- }
- }
- } else {
- printf("SyncTeX Warning: Too many objects\n");
- }
- }
- const char * synctex_scanner_get_name(synctex_scanner_t scanner,int tag) {
- synctex_node_t input = NULL;
- if (NULL == scanner) {
- return NULL;
- }
- input = scanner->input;
- do {
- if (tag == SYNCTEX_TAG(input)) {
- return (SYNCTEX_NAME(input));
- }
- } while((input = SYNCTEX_SIBLING(input)) != NULL);
- return NULL;
- }
- 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) {
- return 0;
- }
- input = scanner->input;
- do {
- if (_synctex_is_equivalent_file_name(name,(SYNCTEX_NAME(input)))) {
- return SYNCTEX_TAG(input);
- }
- } while((input = SYNCTEX_SIBLING(input)) != NULL);
- return 0;
- }
- 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)) {
-
- char_index -= 1;
- if (!SYNCTEX_IS_PATH_SEPARATOR(name[char_index])) {
-
- int result = _synctex_scanner_get_tag(scanner,name);
- if (result) {
- return result;
- } else {
-
- const char * relative = name;
- const char * ptr = scanner->output;
- while((strlen(relative) > 0) && (strlen(ptr) > 0) && (*relative == *ptr))
- {
- relative += 1;
- ptr += 1;
- }
-
- while(relative > name) {
- if (SYNCTEX_IS_PATH_SEPARATOR(*(relative-1))) {
- break;
- }
- relative -= 1;
- }
- if ((relative > name) && (result = _synctex_scanner_get_tag(scanner,relative))) {
- return result;
- }
- if (SYNCTEX_IS_PATH_SEPARATOR(name[0])) {
-
- while(0<char_index) {
- char_index -= 1;
- if (SYNCTEX_IS_PATH_SEPARATOR(name[char_index])
- && (result = _synctex_scanner_get_tag(scanner,name+char_index+1))) {
- return result;
- }
- }
- }
- }
- return result;
- }
- }
- return 0;
- }
- synctex_node_t synctex_scanner_input(synctex_scanner_t scanner) {
- return scanner?scanner->input:NULL;
- }
- const char * synctex_scanner_get_output_fmt(synctex_scanner_t scanner) {
- return NULL != scanner && scanner->output_fmt?scanner->output_fmt:"";
- }
- const char * synctex_scanner_get_output(synctex_scanner_t scanner) {
- return NULL != scanner && scanner->output?scanner->output:"";
- }
- const char * synctex_scanner_get_synctex(synctex_scanner_t scanner) {
- return NULL != scanner && scanner->synctex?scanner->synctex:"";
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Public node attributes
- # endif
- int synctex_node_h(synctex_node_t node){
- if (!node) {
- return 0;
- }
- return SYNCTEX_HORIZ(node);
- }
- int synctex_node_v(synctex_node_t node){
- if (!node) {
- return 0;
- }
- return SYNCTEX_VERT(node);
- }
- int synctex_node_width(synctex_node_t node){
- if (!node) {
- return 0;
- }
- return SYNCTEX_WIDTH(node);
- }
- int synctex_node_box_h(synctex_node_t node){
- if (!node) {
- return 0;
- }
- if (SYNCTEX_IS_BOX(node)) {
- result:
- return SYNCTEX_HORIZ(node);
- }
- 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) {
- return 0;
- }
- if (SYNCTEX_IS_BOX(node)) {
- result:
- return SYNCTEX_VERT(node);
- }
- 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) {
- return 0;
- }
- if (SYNCTEX_IS_BOX(node)) {
- result:
- return SYNCTEX_WIDTH(node);
- }
- 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) {
- return 0;
- }
- if (SYNCTEX_IS_BOX(node)) {
- result:
- return SYNCTEX_HEIGHT(node);
- }
- 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) {
- return 0;
- }
- if (SYNCTEX_IS_BOX(node)) {
- result:
- return SYNCTEX_DEPTH(node);
- }
- if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) {
- goto result;
- }
- return 0;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Public node visible attributes
- # endif
- float synctex_node_visible_h(synctex_node_t 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) {
- 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) {
- return 0;
- }
- return SYNCTEX_WIDTH(node)*node->class->scanner->unit;
- }
- float synctex_node_box_visible_h(synctex_node_t node){
- if (!node) {
- return 0;
- }
- switch(node->class->type) {
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
- return SYNCTEX_HORIZ(node)*node->class->scanner->unit+node->class->scanner->x_offset;
- case synctex_node_type_hbox:
- 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)) {
- goto result;
- }
- return 0;
- }
- float synctex_node_box_visible_v(synctex_node_t node){
- if (!node) {
- return 0;
- }
- switch(node->class->type) {
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
- return SYNCTEX_VERT(node)*node->class->scanner->unit+node->class->scanner->y_offset;
- case synctex_node_type_hbox:
- 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)) {
- goto result;
- }
- return 0;
- }
- float synctex_node_box_visible_width(synctex_node_t node){
- if (!node) {
- return 0;
- }
- switch(node->class->type) {
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
- return SYNCTEX_WIDTH(node)*node->class->scanner->unit;
- case synctex_node_type_hbox:
- result:
- return SYNCTEX_WIDTH_V(node)*node->class->scanner->unit;
- }
- 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) {
- return 0;
- }
- switch(node->class->type) {
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
- return SYNCTEX_HEIGHT(node)*node->class->scanner->unit;
- case synctex_node_type_hbox:
- result:
- return SYNCTEX_HEIGHT_V(node)*node->class->scanner->unit;
- }
- 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) {
- return 0;
- }
- switch(node->class->type) {
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
- return SYNCTEX_DEPTH(node)*node->class->scanner->unit;
- case synctex_node_type_hbox:
- result:
- return SYNCTEX_DEPTH_V(node)*node->class->scanner->unit;
- }
- if ((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) {
- goto result;
- }
- return 0;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Other public node attributes
- # endif
- int synctex_node_page(synctex_node_t node){
- synctex_node_t parent = NULL;
- if (!node) {
- return -1;
- }
- parent = SYNCTEX_PARENT(node);
- while(parent) {
- node = parent;
- parent = SYNCTEX_PARENT(node);
- }
- if (node->class->type == synctex_node_type_sheet) {
- return SYNCTEX_PAGE(node);
- }
- return -1;
- }
- int synctex_node_tag(synctex_node_t node) {
- return node?SYNCTEX_TAG(node):-1;
- }
- int synctex_node_line(synctex_node_t node) {
- return node?SYNCTEX_LINE(node):-1;
- }
- int synctex_node_column(synctex_node_t node) {
- # ifdef __DARWIN_UNIX03
- # pragma unused(node)
- # endif
- return -1;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Sheet
- # endif
- synctex_node_t synctex_sheet_content(synctex_scanner_t scanner,int page) {
- if (scanner) {
- synctex_node_t sheet = scanner->sheet;
- while(sheet) {
- if (page == SYNCTEX_PAGE(sheet)) {
- return SYNCTEX_CHILD(sheet);
- }
- sheet = SYNCTEX_SIBLING(sheet);
- }
- }
- return NULL;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Query
- # endif
- int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,int column) {
- # ifdef __DARWIN_UNIX03
- # pragma unused(column)
- # endif
- int tag = synctex_scanner_get_tag(scanner,name);
- size_t size = 0;
- int friend_index = 0;
- int max_line = 0;
- synctex_node_t node = NULL;
- if (tag == 0) {
- printf("SyncTeX Warning: No tag for %s\n",name);
- return -1;
- }
- free(SYNCTEX_START);
- SYNCTEX_CUR = SYNCTEX_END = SYNCTEX_START = NULL;
- max_line = line < INT_MAX-scanner->number_of_lists ? line+scanner->number_of_lists:INT_MAX;
- while(line<max_line) {
-
- friend_index = (tag+line)%(scanner->number_of_lists);
- if ((node = (scanner->lists_of_friends)[friend_index])) {
- do {
- if ((synctex_node_type(node)>=synctex_node_type_boundary)
- && (tag == SYNCTEX_TAG(node))
- && (line == SYNCTEX_LINE(node))) {
- if (SYNCTEX_CUR == SYNCTEX_END) {
- size += 16;
- SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *));
- SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START;
- SYNCTEX_START = SYNCTEX_END;
- SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *);
- }
- *(synctex_node_t *)SYNCTEX_CUR = node;
- SYNCTEX_CUR += sizeof(synctex_node_t);
- }
- } while((node = SYNCTEX_FRIEND(node)));
- if (SYNCTEX_START == NULL) {
-
- node = (scanner->lists_of_friends)[friend_index];
- do {
- if ((synctex_node_type(node)>=synctex_node_type_kern)
- && (tag == SYNCTEX_TAG(node))
- && (line == SYNCTEX_LINE(node))) {
- if (SYNCTEX_CUR == SYNCTEX_END) {
- size += 16;
- SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *));
- SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START;
- SYNCTEX_START = SYNCTEX_END;
- SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *);
- }
- *(synctex_node_t *)SYNCTEX_CUR = node;
- SYNCTEX_CUR += sizeof(synctex_node_t);
- }
- } while((node = SYNCTEX_FRIEND(node)));
- if (SYNCTEX_START == NULL) {
-
- node = (scanner->lists_of_friends)[friend_index];
- do {
- if ((tag == SYNCTEX_TAG(node))
- && (line == SYNCTEX_LINE(node))) {
- if (SYNCTEX_CUR == SYNCTEX_END) {
- size += 16;
- SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *));
- SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START;
- SYNCTEX_START = SYNCTEX_END;
- SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *);
- }
- *(synctex_node_t *)SYNCTEX_CUR = node;
- SYNCTEX_CUR += sizeof(synctex_node_t);
- }
- } while((node = SYNCTEX_FRIEND(node)));
- }
- }
- SYNCTEX_END = SYNCTEX_CUR;
-
- 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;
- end_ref -= 1;
- while(start_ref < end_ref) {
- node = *start_ref;
- *start_ref = *end_ref;
- *end_ref = node;
- start_ref += 1;
- end_ref -= 1;
- }
-
- start_ref = (synctex_node_t *)SYNCTEX_START;
- end_ref = (synctex_node_t *)SYNCTEX_START;
- next_end:
- end_ref += 1;
- if (end_ref < (synctex_node_t *)SYNCTEX_END) {
- node = *end_ref;
- while((node = SYNCTEX_PARENT(node))) {
- if (SYNCTEX_PARENT(*start_ref) == node) {
- goto next_end;
- }
- }
- start_ref += 1;
- *start_ref = *end_ref;
- goto next_end;
- }
- start_ref += 1;
- SYNCTEX_END = (char *)start_ref;
- SYNCTEX_CUR = NULL;
- return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t);
- }
- SYNCTEX_CUR = NULL;
-
- }
- # if defined(__SYNCTEX_STRONG_DISPLAY_QUERY__)
- break;
- # else
- ++line;
- # endif
- }
- return 0;
- }
- synctex_node_t synctex_next_result(synctex_scanner_t scanner) {
- if (NULL == SYNCTEX_CUR) {
- SYNCTEX_CUR = SYNCTEX_START;
- } else {
- SYNCTEX_CUR+=sizeof(synctex_node_t);
- }
- if (SYNCTEX_CUR<SYNCTEX_END) {
- return *(synctex_node_t*)SYNCTEX_CUR;
- } else {
- return NULL;
- }
- }
- typedef struct {
- int h;
- int v;
- } synctex_point_t;
- typedef struct {
- int left;
- int right;
- } synctex_distances_t;
- typedef struct {
- synctex_point_t left;
- synctex_point_t right;
- } synctex_offsets_t;
- typedef struct {
- synctex_node_t left;
- synctex_node_t right;
- } synctex_node_set_t;
- SYNCTEX_INLINE static synctex_node_t _synctex_smallest_container(synctex_node_t node, synctex_node_t other_node);
- synctex_bool_t _synctex_point_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible);
- int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible);
- static synctex_node_t _synctex_eq_deepest_container(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible);
- 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);
- SYNCTEX_INLINE static synctex_node_t _synctex_eq_closest_child(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible);
- #define SYNCTEX_MASK_LEFT 1
- #define SYNCTEX_MASK_RIGHT 2
- int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v) {
- synctex_node_t sheet = NULL;
- synctex_node_t node = NULL;
- synctex_node_t other_node = NULL;
- synctex_point_t hitPoint = {0,0};
- synctex_node_set_t bestNodes = {NULL,NULL};
- synctex_distances_t bestDistances = {INT_MAX,INT_MAX};
- synctex_node_t bestContainer = NULL;
- if (NULL == (scanner = synctex_scanner_parse(scanner)) || 0 >= scanner->unit) {
- return 0;
- }
-
- hitPoint.h = (h-scanner->x_offset)/scanner->unit;
- hitPoint.v = (v-scanner->y_offset)/scanner->unit;
-
- free(SYNCTEX_START);
- SYNCTEX_START = SYNCTEX_END = SYNCTEX_CUR = NULL;
-
- sheet = scanner->sheet;
- while((sheet) && SYNCTEX_PAGE(sheet) != page) {
- sheet = SYNCTEX_SIBLING(sheet);
- }
- if (NULL == sheet) {
- return -1;
- }
-
-
- if ((node = SYNCTEX_NEXT_HORIZ_BOX(sheet))) {
- do {
- if (_synctex_point_in_box(hitPoint,node,synctex_YES)) {
-
- end:
-
- if ((other_node = SYNCTEX_NEXT_HORIZ_BOX(node))) {
- do {
- 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)));
- }
-
- 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))
- || (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) {
- ((synctex_node_t *)SYNCTEX_START)[0] = bestNodes.right;
- ((synctex_node_t *)SYNCTEX_START)[1] = bestNodes.left;
- } else {
- ((synctex_node_t *)SYNCTEX_START)[0] = bestNodes.left;
- ((synctex_node_t *)SYNCTEX_START)[1] = bestNodes.right;
- }
- SYNCTEX_END = SYNCTEX_START + 2*sizeof(synctex_node_t);
- SYNCTEX_CUR = NULL;
- return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t);
- }
- return SYNCTEX_STATUS_ERROR;
- }
-
- if (bestDistances.left>bestDistances.right) {
- bestNodes.left = bestNodes.right;
- }
- bestNodes.right = NULL;
- } else if (bestNodes.right) {
- bestNodes.left = bestNodes.right;
- } else if (!bestNodes.left){
- bestNodes.left = node;
- }
- 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;
- return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t);
- }
- return SYNCTEX_STATUS_ERROR;
- }
- } while ((node = SYNCTEX_NEXT_HORIZ_BOX(node)));
-
- }
-
- if ((node = SYNCTEX_CHILD(sheet))) {
- goto end;
- }
- return 0;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Utilities
- # endif
- int _synctex_bail(void) {
- _synctex_error("SyncTeX ERROR\n");
- return -1;
- }
- 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) {
- int min,med,max;
- switch(node->class->type) {
-
- case synctex_node_type_hbox:
-
- min = visible?SYNCTEX_HORIZ_V(node):SYNCTEX_HORIZ(node);
- max = min + (visible?SYNCTEX_ABS_WIDTH_V(node):SYNCTEX_ABS_WIDTH(node));
-
- if (hitPoint.h<min) {
- return min - hitPoint.h;
- } else if (hitPoint.h>max) {
- return max - hitPoint.h;
- } else {
- return 0;
- }
- break;
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
-
- min = SYNCTEX_HORIZ(node);
- max = min + SYNCTEX_ABS_WIDTH(node);
-
- if (hitPoint.h<min) {
- return min - hitPoint.h;
- } else if (hitPoint.h>max) {
- return max - hitPoint.h;
- } else {
- return 0;
- }
- break;
- case synctex_node_type_kern:
-
- max = SYNCTEX_WIDTH(node);
- if (max<0) {
- min = SYNCTEX_HORIZ(node);
- max = min - max;
- } else {
- min = -max;
- max = SYNCTEX_HORIZ(node);
- min += max;
- }
- med = (min+max)/2;
-
- if (hitPoint.h<min) {
- return min - hitPoint.h + 1;
- } else if (hitPoint.h>max) {
- return max - hitPoint.h - 1;
- } else if (hitPoint.h>med) {
-
- return max - hitPoint.h + 1;
- } else {
- return min - hitPoint.h - 1;
- }
- case synctex_node_type_glue:
- case synctex_node_type_math:
- return SYNCTEX_HORIZ(node) - hitPoint.h;
- }
- }
- return INT_MAX;
- }
- int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,synctex_bool_t visible);
- int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,synctex_bool_t visible) {
- # ifdef __DARWIN_UNIX03
- # pragma unused(visible)
- # endif
- if (node) {
- int min,max;
- switch(node->class->type) {
-
- case synctex_node_type_hbox:
-
- min = SYNCTEX_VERT_V(node);
- max = min + SYNCTEX_ABS_DEPTH_V(node);
- min -= SYNCTEX_ABS_HEIGHT_V(node);
-
- if (hitPoint.v<min) {
- return min - hitPoint.v;
- } else if (hitPoint.v>max) {
- return max - hitPoint.v;
- } else {
- return 0;
- }
- break;
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_void_hbox:
-
- min = SYNCTEX_VERT(node);
- max = min + SYNCTEX_ABS_DEPTH(node);
- min -= SYNCTEX_ABS_HEIGHT(node);
-
- if (hitPoint.v<min) {
- return min - hitPoint.v;
- } else if (hitPoint.v>max) {
- return max - hitPoint.v;
- } else {
- return 0;
- }
- break;
- case synctex_node_type_kern:
- case synctex_node_type_glue:
- case synctex_node_type_math:
- return SYNCTEX_VERT(node) - hitPoint.v;
- }
- }
- return INT_MAX;
- }
- 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)) {
- return 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) {
- return node;
- }
- 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)
- && 0 == _synctex_point_v_distance(hitPoint,node,visible)) {
- return synctex_YES;
- }
- }
- return synctex_NO;
- }
- int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible) {
- # ifdef __DARWIN_UNIX03
- # pragma unused(visible)
- # endif
- int result = INT_MAX;
- if (node) {
- int minH,maxH,minV,maxV;
- switch(node->class->type) {
-
- case synctex_node_type_vbox:
- case synctex_node_type_void_vbox:
- case synctex_node_type_hbox:
- case synctex_node_type_void_hbox:
-
- minH = SYNCTEX_HORIZ(node);
- maxH = minH + SYNCTEX_ABS_WIDTH(node);
- minV = SYNCTEX_VERT(node);
- maxV = minV + SYNCTEX_ABS_DEPTH(node);
- minV -= SYNCTEX_ABS_HEIGHT(node);
-
- if (hitPoint.v<minV) {
- if (hitPoint.h<minH) {
-
- result = minV - hitPoint.v + minH - hitPoint.h;
- } else if (hitPoint.h<=maxH) {
-
- result = minV - hitPoint.v;
- } else {
-
- result = minV - hitPoint.v + hitPoint.h - maxH;
- }
- } else if (hitPoint.v<=maxV) {
- if (hitPoint.h<minH) {
-
- result = minH - hitPoint.h;
- } else if (hitPoint.h<=maxH) {
-
- result = 0;
- } else {
-
- result = hitPoint.h - maxH;
- }
- } else {
- if (hitPoint.h<minH) {
-
- result = hitPoint.v - maxV + minH - hitPoint.h;
- } else if (hitPoint.h<=maxH) {
-
- result = hitPoint.v - maxV;
- } else {
-
- result = hitPoint.v - maxV + hitPoint.h - maxH;
- }
- }
- break;
- case synctex_node_type_kern:
- maxH = SYNCTEX_WIDTH(node);
- if (maxH<0) {
- minH = SYNCTEX_HORIZ(node);
- maxH = minH - maxH;
- } else {
- minH = -maxH;
- maxH = SYNCTEX_HORIZ(node);
- minH += maxH;
- }
- minV = SYNCTEX_VERT(node);
- 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) {
- result = hitPoint.v - minV + hitPoint.h - maxH;
- } else {
- result = minV - hitPoint.v + hitPoint.h - maxH;
- }
- } else if (hitPoint.v>minV) {
- result = hitPoint.v - minV;
- } else {
- result = minV - hitPoint.v;
- }
- break;
- case synctex_node_type_glue:
- case synctex_node_type_math:
- minH = SYNCTEX_HORIZ(node);
- minV = SYNCTEX_VERT(node);
- 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) {
- result = hitPoint.v - minV + hitPoint.h - minH;
- } else {
- result = minV - hitPoint.v + hitPoint.h - minH;
- }
- break;
- }
- }
- return result;
- }
- static synctex_node_t _synctex_eq_deepest_container(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible) {
- 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:
-
- if ((child = SYNCTEX_CHILD(node))) {
- do {
- if ((result = _synctex_eq_deepest_container(hitPoint,child,visible))) {
- return result;
- }
- } while((child = SYNCTEX_SIBLING(child)));
- }
-
- if (_synctex_point_in_box(hitPoint,node,visible)) {
-
- if ((node->class->type == synctex_node_type_vbox) && (child = SYNCTEX_CHILD(node))) {
- int bestDistance = INT_MAX;
- do {
- if (SYNCTEX_CHILD(child)) {
- int distance = _synctex_node_distance_to_point(hitPoint,child,visible);
- if (distance < bestDistance) {
- bestDistance = distance;
- node = child;
- }
- }
- } while((child = SYNCTEX_SIBLING(child)));
- }
- return node;
- }
- }
- }
- return NULL;
- }
- 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))) {
- do {
- int off7 = _synctex_point_h_distance(hitPoint,node,visible);
- if (off7 > 0) {
-
- 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)
- && (SYNCTEX_LINE(bestNodesRef->right) > SYNCTEX_LINE(node)
- || (SYNCTEX_LINE(bestNodesRef->right) == SYNCTEX_LINE(node)
- && SYNCTEX_COLUMN(bestNodesRef->right) > SYNCTEX_COLUMN(node)))) {
- bestNodesRef->right = node;
- result |= SYNCTEX_MASK_RIGHT;
- }
- }
- } else if (off7 == 0) {
-
- bestDistancesRef->left = bestDistancesRef->right = 0;
- bestNodesRef->left = node;
- bestNodesRef->right = NULL;
- result |= SYNCTEX_MASK_LEFT;
- } else {
- off7 = -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)
- && (SYNCTEX_LINE(bestNodesRef->left) > SYNCTEX_LINE(node)
- || (SYNCTEX_LINE(bestNodesRef->left) == SYNCTEX_LINE(node)
- && SYNCTEX_COLUMN(bestNodesRef->left) > SYNCTEX_COLUMN(node)))) {
- bestNodesRef->left = node;
- result |= SYNCTEX_MASK_LEFT;
- }
- }
- }
- } while((node = SYNCTEX_SIBLING(node)));
- if (result & SYNCTEX_MASK_LEFT) {
-
- if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) {
- bestNodesRef->left = node;
- }
- if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) {
- bestNodesRef->left = node;
- }
- }
- if (result & SYNCTEX_MASK_RIGHT) {
-
- if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) {
- bestNodesRef->right = node;
- }
- if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) {
- bestNodesRef->right = node;
- }
- }
- }
- return result;
- }
- 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))) {
- do {
- int off7 = _synctex_point_v_distance(hitPoint,node,visible);
- if (off7 > 0) {
-
- 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)
- && (SYNCTEX_LINE(bestNodesRef->right) > SYNCTEX_LINE(node)
- || (SYNCTEX_LINE(bestNodesRef->right) == SYNCTEX_LINE(node)
- && SYNCTEX_COLUMN(bestNodesRef->right) > SYNCTEX_COLUMN(node)))) {
- bestNodesRef->right = node;
- result |= SYNCTEX_MASK_RIGHT;
- }
- }
- } else if (off7 == 0) {
- bestDistancesRef->left = bestDistancesRef->right = 0;
- bestNodesRef->left = node;
- bestNodesRef->right = NULL;
- result |= SYNCTEX_MASK_LEFT;
- } else {
- off7 = -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)
- && (SYNCTEX_LINE(bestNodesRef->left) > SYNCTEX_LINE(node)
- || (SYNCTEX_LINE(bestNodesRef->left) == SYNCTEX_LINE(node)
- && SYNCTEX_COLUMN(bestNodesRef->left) > SYNCTEX_COLUMN(node)))) {
- bestNodesRef->left = node;
- result |= SYNCTEX_MASK_LEFT;
- }
- }
- }
- } while((node = SYNCTEX_SIBLING(node)));
- if (result & SYNCTEX_MASK_LEFT) {
-
- if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) {
- bestNodesRef->left = node;
- }
- if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) {
- bestNodesRef->left = node;
- }
- }
- if (result & SYNCTEX_MASK_RIGHT) {
-
- if ((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) {
- bestNodesRef->right = node;
- }
- if ((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) {
- bestNodesRef->right = node;
- }
- }
- }
- 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) {
- switch(node->class->type) {
- case synctex_node_type_hbox:
- return __synctex_eq_get_closest_children_in_hbox(hitPoint, node, bestNodesRef, bestDistancesRef,visible);
- case synctex_node_type_vbox:
- return __synctex_eq_get_closest_children_in_vbox(hitPoint, node, bestNodesRef, bestDistancesRef,visible);
- }
- }
- return 0;
- }
- 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))) {
- do {
- int distance = _synctex_node_distance_to_point(hitPoint,node,visible);
- synctex_node_t candidate = NULL;
- 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))) {
- best_node = candidate;
- }
- }
- } while((node = SYNCTEX_SIBLING(node)));
- }
- 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) {
- 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)) {
- 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))) {
- 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) {
- best_distance = distance;
- best_node = child;
- }
- }
- }
- }
- }
- return best_node;
- }
- }
- }
- return NULL;
- }
- # ifdef SYNCTEX_NOTHING
- # pragma mark -
- # pragma mark Updater
- # endif
- typedef int (*synctex_fprintf_t)(void *, const char * , ...);
- # define SYNCTEX_BITS_PER_BYTE 8
- struct __synctex_updater_t {
- void *file;
- synctex_fprintf_t fprintf;
- int length;
- struct _flags {
- unsigned int no_gz:1;
- unsigned int reserved:SYNCTEX_BITS_PER_BYTE*sizeof(int)-1;
- } flags;
- };
- # define SYNCTEX_FILE updater->file
- # define SYNCTEX_NO_GZ ((updater->flags).no_gz)
- # define SYNCTEX_fprintf (*(updater->fprintf))
- 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 = 0;
- const char * mode = NULL;
-
- updater = (synctex_updater_t)_synctex_malloc(sizeof(synctex_updater_t));
- if (NULL == updater) {
- _synctex_error("! synctex_updater_new_with_file: malloc problem");
- return NULL;
- }
- 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;
- }
-
- gzclose(SYNCTEX_FILE);
- SYNCTEX_FILE = NULL;
- 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);
- 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);
- goto return_on_error;
- }
- updater->fprintf = (synctex_fprintf_t)(&fprintf);
- } else {
- if (NULL == (SYNCTEX_FILE = (void *)gzopen(synctex,mode))) {
- goto no_write_error;
- }
- updater->fprintf = (synctex_fprintf_t)(&gzprintf);
- }
- printf("SyncTeX: updating %s...",synctex);
- free(synctex);
- return updater;
- }
- void synctex_updater_append_magnification(synctex_updater_t updater, char * magnification){
- if (NULL==updater) {
- return;
- }
- 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) {
- return;
- }
- 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) {
- return;
- }
- 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) {
- return;
- }
- if (updater->length>0) {
- SYNCTEX_fprintf(SYNCTEX_FILE,"!%i\n",updater->length);
- }
- if (SYNCTEX_NO_GZ) {
- fclose((FILE *)SYNCTEX_FILE);
- } else {
- gzclose((gzFile)SYNCTEX_FILE);
- }
- free(updater);
- printf("... done.\n");
- return;
- }
|