/* Ċ Open ĠAsset ĠImport ĠLibrary Ġ( assimp ) Ċ ---------------------------------------------------------------------- Ċ Ċ Copyright Ġ( c ) Ġ 2 0 0 6 - 2 0 1 7 , Ġass imp Ġteam Ċ Ċ All Ġrights Ġreserved . Ċ Ċ Red ist ribution Ġand Ġuse Ġof Ġthis Ġsoftware Ġin Ġsource Ġand Ġbinary Ġforms , Ċ with Ġor Ġwithout Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ċ following Ġconditions Ġare Ġmet : Ċ Ċ * ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove ĊĠ Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe ĊĠ Ġfollowing Ġdisclaimer . Ċ Ċ * ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove ĊĠ Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe ĊĠ Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ġand / or Ġother ĊĠ Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ċ * ĠNeither Ġthe Ġname Ġof Ġthe Ġass imp Ġteam , Ġnor Ġthe Ġnames Ġof Ġits ĊĠ Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts ĊĠ Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior ĊĠ Ġwritten Ġpermission Ġof Ġthe Ġass imp Ġteam . Ċ Ċ THIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ċ " AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT Ċ LIMIT ED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR Ċ A ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT Ċ OWNER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ SPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT Ċ LIMIT ED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , Ċ DATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY Ċ THE ORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ OF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ċ ---------------------------------------------------------------------- Ċ */ Ċ Ċ package Ġass imp . format . fb x Ċ Ċ import Ġass imp .* Ċ import Ġglm _. c Ċ import Ġglm _. f Ċ import Ġk ool . rem Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . reflect . K Mutable Property 0 ĊĊ Ċ // Ġtab Ġwidth Ġfor Ġlogging Ġcolumns Ċ val ĠASS IMP _ FB X _ TAB _ WIDTH Ġ= Ġ 4 Ċ Ċ /** ĠR ough Ġclassification Ġfor Ġtext ĠF BX Ġtokens Ġused Ġfor Ġconstructing Ġthe Ġbasic Ġscope Ġhierarchy . Ġ*/ Ċ enum Ġclass ĠTokenType Ġ{ ĊĠĠĠ Ġ/** Ġ{ ĠĠ Ġ*/ ĊĠĠĠ ĠOPEN _ BRACK ET , ĊĠĠĠ Ġ/** Ġ} ĠĠ Ġ*/ ĊĠĠĠ ĠCLOSE _ BRACK ET , ĊĠĠĠ Ġ/** Ġ'" bl abl ub b "', Ġ' 2 ', Ġ'* 1 4 ' Ġ- Ġvery Ġgeneral Ġtoken Ġclass , Ġfurther Ġprocessing Ġhappens Ġat Ġa Ġlater Ġstage . ĠĠ Ġ*/ ĊĠĠĠ ĠDATA , ĊĠĠĠ ĠBINARY _ DATA , ĊĠĠĠ Ġ/** Ġ, ĠĠ Ġ*/ ĊĠĠĠ ĠCOM MA , ĊĠĠĠ Ġ/** Ġbl ub b : Ġ Ġ*/ ĊĠĠĠ ĠKEY ; ĊĊĠĠĠ Ġval Ġi Ġ= Ġordinal Ċ } Ċ Ċ /** ĠRepresents Ġa Ġsingle Ġtoken Ġin Ġa ĠF BX Ġfile . ĠTokens Ġare Ġclass ified Ġby Ġthe ĠTokenType Ġenum erated Ġtypes . Ċ Ġ* Ċ Ġ* Ġ ĠOff ers Ġiterator Ġprotocol . ĠTokens Ġare Ġimmutable . Ġ*/ Ċ class ĠToken ( ĊĠĠĠĠĠĠĠ Ġvar Ġbegin : ĠInt , ĊĠĠĠĠĠĠĠ Ġvar Ġend : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠTokenType , ĊĠĠĠĠĠĠĠ Ġline : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġ_ column : ĠInt Ġ= ĠBINARY _ MARKER Ċ ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( begin Ġ!= Ġ- 1 Ġ&& Ġend Ġ!= Ġ- 1 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(_ column Ġ== ĠBINARY _ MARKER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( end Ġ>= Ġbegin ) Ġ// Ġbinary Ġtokens Ġmay Ġhave Ġzero Ġlength Ġbecause Ġthey Ġare Ġsometimes Ġd um m ies Ġinserted Ġby ĠToken ize Binary () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( end Ġ- Ġbegin Ġ> Ġ 0 ) Ġ// Ġtokens Ġmust Ġbe Ġof Ġnon - zero Ġlength ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġfull Ġstring Ġcopy Ġfor Ġthe Ġsole Ġpurpose Ġthat Ġit Ġnicely Ġappears Ġin Ġm svc 's Ġdebugger Ġwindow . ĊĠĠĠ Ġvar Ġcontents Ġ= Ġ"" ĊĊĠĠĠ Ġvar Ġline Ġ= Ġline ĊĊĠĠĠ Ġinline Ġvar Ġoffset : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġline ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcolumn Ġ= Ġ_ column ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! is Binary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Binary Ġget () Ġ= Ġ_ column Ġ== ĠBINARY _ MARKER ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ type , Ġ${ if Ġ( is Binary ) Ġ" offset Ġ 0 x $ offset " Ġelse Ġ" line Ġ$ line , Ġcol Ġ$ column "} " ĊĊĠĠĠ Ġval Ġstring Contents Ġget () Ġ= ĠString ( ByteArray ( end Ġ- Ġbegin , Ġ{ Ġbuffer [ begin Ġ+ Ġit ] Ġ})) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠBINARY _ MARKER Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparse AsString : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠTokenType . DATA ) Ġparse Error (" expected ĠTOK _ DATA Ġtoken ", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Binary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ begin ]. c Ġ!= Ġ' S ') Ġparse Error (" failed Ġto Ġparse ĠS ( tring ), Ġunexpected Ġdata Ġtype Ġ( binary )", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġstring Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġbuffer . getInt ( begin Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( end Ġ- Ġbegin Ġ== Ġ 5 Ġ+ Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( ByteArray ( len , Ġ{ Ġbuffer [ begin Ġ+ Ġ 5 Ġ+ Ġit ] Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġend Ġ- Ġbegin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ< Ġ 2 ) Ġparse Error (" token Ġis Ġtoo Ġshort Ġto Ġhold Ġa Ġstring ", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġbuffer [ begin ]. c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġbuffer [ end Ġ- Ġ 1 ]. c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ!= Ġ'"' Ġ|| Ġe Ġ!= Ġ'" ') Ġparse Error (" expected Ġdouble Ġquoted Ġstring ", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( ByteArray ( length Ġ- Ġ 2 , Ġ{ Ġbuffer [ begin Ġ+ Ġ 1 Ġ+ Ġit ] Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparse As Int : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠTokenType . DATA ) Ġparse Error (" expected ĠTOK _ DATA Ġtoken ", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Binary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ begin ]. c Ġ!= Ġ' I ') Ġparse Error (" failed Ġto Ġparse ĠI ( nt ), Ġunexpected Ġdata Ġtype Ġ( binary )", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . getInt ( begin Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( end Ġ- Ġbegin Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . str tol 1 0 ( begin , Ġend ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparse As Id : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠTokenType . DATA ) Ġparse Error (" expected ĠTOK _ DATA Ġtoken ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Binary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ begin ]. c Ġ!= Ġ' L ') Ġparse Error (" failed Ġto Ġparse ĠID , Ġunexpected Ġdata Ġtype , Ġexpected ĠL ( ong ) Ġ( binary )", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . getLong ( begin Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠXXX : Ġshould Ġuse Ġsize _ t Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġend Ġ- Ġbegin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( length Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbegin Out Max Ġ= Ġint ArrayOf ( begin , Ġ 0 , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġbuffer . str to ul 1 0 _ 6 4 ( begin Out Max ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( begin Out Max [ 1 ] Ġ> Ġend ) Ġparse Error (" failed Ġto Ġparse ĠID Ġ( text )", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparse As Int 6 4 : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠTokenType . DATA ) Ġparse Error (" expected ĠTOK _ DATA Ġtoken ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Binary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ begin ]. c Ġ!= Ġ' L ') Ġparse Error (" failed Ġto Ġparse ĠInt 6 4 , Ġunexpected Ġdata Ġtype ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . getLong ( begin Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠXXX : Ġshould Ġuse Ġsize _ t Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġend Ġ- Ġbegin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( length Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbegin Out Max Ġ= Ġint ArrayOf ( begin , Ġ 0 , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġbuffer . str tol 1 0 _ 6 4 ( begin , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( begin Out Max [ 1 ] Ġ> Ġend ) Ġparse Error (" failed Ġto Ġparse ĠInt 6 4 Ġ( text )", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġsame Ġas ĠID Ġparsing , Ġexcept Ġthere Ġis Ġa Ġtrailing Ġaster isk Ġ Ġ*/ ĊĠĠĠ Ġval Ġparse As Dim : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠTokenType . DATA ) Ġparse Error (" expected ĠTOK _ DATA Ġtoken ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Binary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ begin ]. c Ġ!= Ġ' L ') Ġparse Error (" failed Ġto Ġparse ĠInt 6 4 , Ġunexpected Ġdata Ġtype ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . getLong ( begin Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ begin ]. c Ġ!= Ġ'* ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Error (" expected Ġaster isk Ġbefore Ġarray Ġdimension ", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġend Ġ- Ġ++ begin ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Error (" expected Ġvalid Ġinteger Ġnumber Ġafter Ġaster isk ", Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . str tol 1 0 _ 6 4 ( begin , Ġend ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparse As Float : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= ĠTokenType . DATA ) Ġparse Error (" expected ĠTOK _ DATA Ġtoken ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Binary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( buffer . get ( begin ). c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' F ' Ġ-> Ġbuffer . get Float ( begin Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' D ' Ġ-> Ġbuffer . getDouble ( begin Ġ+ Ġ 1 ). f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparse Error (" failed Ġto Ġparse ĠF ( loat ) Ġor ĠD ( o uble ), Ġunexpected Ġdata Ġtype Ġ( binary )", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġcopy Ġthe Ġinput Ġstring Ġto Ġa Ġtemporary Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġ- Ġnext Ġin Ġthe Ġf bx Ġtoken Ġstream Ġcomes Ġ', ', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġfast _ at of Ġcould Ġinterpret Ġas Ġdecimal Ġpoint . Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ# define ĠMAX _ FLOAT _ LENGTH Ġ 3 1 ĠTODO Ġcheck Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġtemp Ġ[ MAX _ FLOAT _ LENGTH Ġ+ Ġ 1 ]; Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġsize _ t Ġlength Ġ= Ġstatic _ cast < size _ t >( t . end () Ġ- Ġt . begin ()); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġstd :: copy ( t . begin (), Ġt . end (), Ġtemp ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ std :: min ( static _ cast < size _ t >( MAX _ FLOAT _ LENGTH ), Ġlength )] Ġ= Ġ'\ 0 '; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . fast _ at of ( begin , Ġend ). f ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġval Ġparse As Dim : Ċ } Ċ Ċ /** ĠMain ĠF BX Ġtokenizer Ġfunction . ĠTransform Ġinput Ġbuffer Ġinto Ġa Ġlist Ġof Ġpre processed Ġtokens . Ċ Ġ* Ċ Ġ* Ġ ĠSk ips Ġover Ġcomments Ġand Ġgenerates Ġline Ġand Ġcolumn Ġnumbers . Ċ Ġ* Ċ Ġ* Ġ@ param Ġoutput Tokens ĠRe ceiv es Ġa Ġlist Ġof Ġall Ġtokens Ġin Ġthe Ġinput Ġdata . Ċ Ġ* Ġ@ param Ġchars ĠText ual Ġinput Ġbuffer Ġto Ġbe Ġprocessed , Ġ 0 - terminated . Ċ Ġ* Ġ@ throw ĠException Ġif Ġsomething Ġgoes Ġwrong Ġ*/ Ċ fun Ġtokenize ( output Tokens : ĠArrayList < Token >, Ġinput : ĠByteBuffer ) Ġ{ Ċ Ċ // ĠĠĠ Ġassert ( input . isNotEmpty ()) Ġ Ġ// ĠTODO ĊĊĠĠĠ Ġ// Ġline Ġand Ġcolumn Ġnumbers Ġnumbers Ġare Ġone - based ĊĠĠĠ Ġvar Ġline Ġ= Ġ 1 ĊĠĠĠ Ġvar Ġcolumn Ġ= Ġ 1 ĊĊĠĠĠ Ġvar Ġcomment Ġ= Ġfalse ĊĠĠĠ Ġvar Ġin Double Quotes Ġ= Ġfalse ĊĠĠĠ Ġvar Ġpending Data Token Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġchars Ġ= Ġinput ĊĊĠĠĠ Ġvar Ġcur Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġbegin Ġ= Ġtrue ĊĊĠĠĠ Ġwhile Ġ( cur Ġ+ Ġ 1 Ġ< Ġchars . rem ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! begin ) Ġcolumn Ġ+= Ġif Ġ( chars [ cur ++ ]. c Ġ== ĠHT ) ĠASS IMP _ FB X _ TAB _ WIDTH Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ Ġbegin Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġchars [ cur ]. c ĊĊĠĠĠĠĠĠĠ Ġif Ġ( c . is Line End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ line ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġhave Ġanother Ġline End Ġat Ġthe Ġnext Ġposition Ġ( typ ically Ġ\ f \ n ), Ġmove Ġdirectly Ġto Ġnext Ġchar Ġ(\ n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Ġ+ Ġ 1 Ġ< Ġchars . rem Ġ&& Ġchars [ cur Ġ+ Ġ 1 ]. c . is Line End ) Ġc Ġ= Ġchars [++ cur ]. c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( comment ) Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( in Double Quotes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\" ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Double Quotes Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken End Ġ= Ġcur ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Data Token Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\" ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Begin Ġ!= Ġ- 1 ) Ġtokenize Error (" unexpected Ġdouble - quote ", Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Begin Ġ= Ġcur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Double Quotes Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ'; ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ'{ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Tokens Ġ+= ĠToken ( cur , Ġcur Ġ+ Ġ 1 , ĠTokenType . OPEN _ BRACK ET , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ' }') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Tokens Ġ+= ĠToken ( cur , Ġcur Ġ+ Ġ 1 , ĠTokenType . CLOSE _ BRACK ET , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ', ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Data Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn , ĠTokenType . DATA , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Tokens Ġ+= ĠToken ( cur , Ġcur Ġ+ Ġ 1 , ĠTokenType . COMMA , Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ': ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Data Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn , ĠTokenType . KEY , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtokenize Error (" unexpected Ġcolon ", Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( c . is Space Or NewLine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Begin Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpeek Ġahead Ġand Ġcheck Ġif Ġthe Ġnext Ġtoken Ġis Ġa Ġcolon Ġin Ġwhich Ġcase Ġthis Ġcounts Ġas ĠKEY Ġtoken . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= ĠTokenType . DATA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpeek Ġ= Ġcur ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġp Ġ= Ġchars [ peek ]. c ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( p Ġ!= ĠN UL Ġ&& Ġp . is Space Or NewLine ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ== Ġ': ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠTokenType . KEY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġpeek ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Ġ= Ġchars [++ peek ]. c ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Data Token ( output Tokens , Ġchars , Ġ:: token Begin , Ġ:: token End , Ġline , Ġcolumn , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Data Token Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken End Ġ= Ġcur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Begin Ġ== Ġ- 1 ) Ġtoken Begin Ġ= Ġcur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Data Token Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġvar Ġtoken Begin Ġ= Ġ- 1 Ċ private Ġvar Ġtoken End Ġ= Ġ- 1 Ċ Ċ /** Ġsignal Ġtoken ization Ġerror , Ġthis Ġis Ġalways Ġun recover able . ĠThrows ĠError . Ġ Ġ*/ Ċ fun Ġtokenize Error ( message : ĠString , Ġline : ĠInt , Ġcolumn : ĠInt ): ĠNothing Ġ= Ġthrow ĠException ( Util . add Line And Column (" FB X - Token ize ", Ġmessage , Ġline , Ġcolumn )) ĊĊ Ċ // ĠĠĠ Ġ/** ĠToken izer Ġfunction Ġfor Ġbinary ĠF BX Ġfiles . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ġ ĠEmit s Ġa Ġtoken Ġlist Ġsuitable Ġfor Ġdirect Ġparsing . Ċ // ĠĠĠĠ Ġ* Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġoutput _ tokens ĠRe ceiv es Ġa Ġlist Ġof Ġall Ġtokens Ġin Ġthe Ġinput Ġdata . Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġinput _ buffer ĠBinary Ġinput Ġbuffer Ġto Ġbe Ġprocessed . Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġlength ĠLength Ġof Ġinput Ġbuffer , Ġin Ġbytes . ĠThere Ġis Ġno Ġ 0 - terminal . Ċ // ĠĠĠĠ Ġ* Ġ@ throw ĠDead ly Import Error Ġif Ġsomething Ġgoes Ġwrong Ġ*/ Ċ // ĠĠĠ Ġvoid ĠToken ize Binary ( Token List & Ġoutput _ tokens , Ġconst Ġchar * Ġinput , Ġunsigned Ġint Ġlength ); Ċ Ċ /** ĠProcess Ġa Ġpotential Ġdata Ġtoken Ġup Ġto Ġ' cur ', Ġadding Ġit Ġto Ġ' output Tokens '. ĠĠ Ġ*/ Ċ fun Ġprocess Data Token ( output Tokens : ĠArrayList < Token >, Ġchars : ĠByteBuffer , Ġstart : ĠK Mutable Property 0 < Int >, Ġend : ĠK Mutable Property 0 < Int >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline : ĠInt , Ġcolumn : ĠInt , Ġtype : ĠTokenType Ġ= ĠTokenType . DATA , Ġmust Have Token : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠ Ġif Ġ( start () Ġ!= Ġ- 1 Ġ&& Ġend () Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsanity Ġcheck : ĊĠĠĠĠĠĠĠ Ġ// Ġtokens Ġshould Ġhave Ġno Ġwhitespace Ġoutside Ġquoted Ġtext Ġand Ġ[ start , end ] Ġshould Ġproperly Ġde limit Ġthe Ġvalid Ġrange . ĊĠĠĠĠĠĠĠ Ġvar Ġin Double Quotes Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstart () .. end ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġchars [ i ]. c ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\" ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Double Quotes Ġ= Ġ! in Double Quotes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! in Double Quotes Ġ&& Ġc . is Space Or NewLine ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokenize Error (" unexpected Ġwhitespace Ġin Ġtoken ", Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( in Double Quotes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokenize Error (" non - terminated Ġdouble Ġquotes ", Ġline , Ġcolumn ) ĊĠĠĠĠĠĠĠ Ġoutput Tokens Ġ+= ĠToken ( start (), Ġend () Ġ+ Ġ 1 , Ġtype , Ġline , Ġcolumn ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( must Have Token ) ĊĠĠĠĠĠĠĠ Ġtokenize Error (" unexpected Ġcharacter , Ġexpected Ġdata Ġtoken ", Ġline , Ġcolumn ) ĊĊĠĠĠ Ġstart . set (- 1 ) ĊĠĠĠ Ġend . set (- 1 ) Ċ }