/******************************************************************************* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 0 - 2 0 1 1 ĠLu aj . org . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġorg . lu aj . vm 2 . lib Ċ Ċ import Ġorg . lu aj . vm 2 .* Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠSub class Ġof Ġ[ Lib Function ] Ġwhich Ġimplements Ġthe Ġlua Ġstandard Ġpackage Ġand Ġmodule Ċ Ġ* Ġlibrary Ġfunctions . Ċ Ġ* Ċ Ġ* Ġ< h 3 > Lua ĠEnvironment ĠVariables </ h 3 > Ċ Ġ* ĠThe Ġfollowing Ġvariables Ġare Ġavailable Ġto Ġlua Ġs cri ps Ġwhen Ġthis Ġlibrary Ġhas Ġbeen Ġloaded : Ċ Ġ* Ċ Ġ* Ġ Ġ* Ġ`" package . loaded "` ĠLua Ġtable Ġof Ġloaded Ġmodules . Ċ Ġ* Ġ Ġ* Ġ`" package . path "` ĠSearch Ġpath Ġfor Ġlua Ġscripts . Ċ Ġ* Ġ Ġ* Ġ`" package . preload "` ĠLua Ġtable Ġof Ġun initialized Ġpreload Ġfunctions . Ċ Ġ* Ġ Ġ* Ġ`" package . search ers "` ĠLua Ġtable Ġof Ġfunctions Ġthat Ġsearch Ġfor Ġobject Ġto Ġload . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ< h 3 > Java ĠEnvironment ĠVariables </ h 3 > Ċ Ġ* ĠThese ĠJava Ġenvironment Ġvariables Ġaffect Ġthe Ġlibrary Ġbehavior : Ċ Ġ* Ċ Ġ* Ġ Ġ* Ġ`" lu aj . package . path "` ĠInitial Ġvalue Ġfor Ġ`" package . path " `. Ġ ĠDefault Ġvalue Ġis Ġ`" ?. lua "` Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ< h 3 > Loading </ h 3 > Ċ Ġ* ĠTypically , Ġthis Ġlibrary Ġis Ġincluded Ġas Ġpart Ġof Ġa Ġcall Ġto Ġeither Ċ Ġ* Ġ[ org . lu aj . vm 2 . lib . j se . J se Platform . standard Globals ] Ġor Ġ[ org . lu aj . vm 2 . lib . j me . J me Platform . standard Globals ] Ċ Ġ* Ġ< pre > Ġ` Globals Ġglobals Ġ= ĠJ se Platform . standard Globals (); Ċ Ġ* ĠSystem . out . println ( Ġglobals . get (" require "). call " foo ") Ġ); Ċ ` Ġ* Ġ Ġ</ pre > Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTo Ġinstantiate Ġand Ġuse Ġit Ġdirectly , Ċ Ġ* Ġlink Ġit Ġinto Ġyour Ġglobals Ġtable Ġvia Ġ[ Lua Value . load ] Ġusing Ġcode Ġsuch Ġas : Ċ Ġ* Ġ< pre > Ġ` Globals Ġglobals Ġ= Ġnew ĠGlobals (); Ċ Ġ* Ġglobals . load ( new ĠJ se Base Lib ()); Ċ Ġ* Ġglobals . load ( new ĠPackage Lib ()); Ċ Ġ* ĠSystem . out . println ( Ġglobals . get (" require "). call (" foo ") Ġ); Ċ ` Ġ* Ġ Ġ</ pre > Ċ Ġ* Ġ< h 3 > Limit ations </ h 3 > Ċ Ġ* ĠThis Ġlibrary Ġhas Ġbeen Ġimplemented Ġto Ġmatch Ġas Ġclosely Ġas Ġpossible Ġthe Ġbehavior Ġin Ġthe Ġcorresponding Ġlibrary Ġin ĠC . Ċ Ġ* ĠHowever , Ġthe Ġdefault Ġfilesystem Ġsearch Ġsemantics Ġare Ġdifferent Ġand Ġdeleg ated Ġto Ġthe Ġbas Ġlibrary Ċ Ġ* Ġas Ġoutlined Ġin Ġthe Ġ[ Base Lib ] Ġand Ġ[ org . lu aj . vm 2 . lib . j se . J se Base Lib ] Ġdocumentation . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ@ see ĠLib Function Ċ Ġ* Ċ Ġ* Ġ@ see ĠBase Lib Ċ Ġ* Ċ Ġ* Ġ@ see Ġorg . lu aj . vm 2 . lib . j se . J se Base Lib Ċ Ġ* Ċ Ġ* Ġ@ see Ġorg . lu aj . vm 2 . lib . j se . J se Platform Ċ Ġ* Ċ Ġ* Ġ@ see Ġorg . lu aj . vm 2 . lib . j me . J me Platform Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Lua Ġ 5 . 2 ĠPackage ĠLib ĠReference ]( http :// www . lua . org / manual / 5 . 2 / manual . html . 6 . 3 ) Ċ Ġ*/ Ċ class ĠPackage Lib Ġ: ĠTwo Arg Function () Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġglobals Ġthat Ġwere Ġused Ġto Ġload Ġthis Ġlibrary . Ġ Ġ*/ ĊĠĠĠ Ġ@ kotlin . jvm . Jvm Field ĊĠĠĠ Ġinternal Ġvar Ġglobals : ĠGlobals ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠThe Ġtable Ġfor Ġthis Ġpackage . Ġ Ġ*/ ĊĠĠĠ Ġ@ kotlin . jvm . Jvm Field ĊĠĠĠ Ġinternal Ġvar Ġpackage _: ĠLua Table ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠLoader Ġthat Ġloads Ġfrom Ġ` preload ` Ġtable Ġif Ġfound Ġthere Ġ Ġ*/ ĊĠĠĠ Ġ@ kotlin . jvm . Jvm Field ĊĠĠĠ Ġvar Ġpreload _ search er : ĠPre load _ search er ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠLoader Ġthat Ġloads Ġas Ġa Ġlua Ġscript Ġusing Ġthe Ġlua Ġpath Ġcurrently Ġin Ġ[ path ] Ġ Ġ*/ ĊĠĠĠ Ġ@ kotlin . jvm . Jvm Field ĊĠĠĠ Ġvar Ġlua _ search er : ĠLua _ search er ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠLoader Ġthat Ġloads Ġas Ġa ĠJava Ġclass . Ġ ĠClass Ġmust Ġhave Ġpublic Ġconstructor Ġand Ġbe Ġa ĠLua Value . Ġ Ġ*/ ĊĠĠĠ Ġ@ kotlin . jvm . Jvm Field ĊĠĠĠ Ġvar Ġjava _ search er : ĠJava _ search er ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠPerform Ġone - time Ġinitialization Ġon Ġthe Ġlibrary Ġby Ġadding Ġpackage Ġfunctions ĊĠĠĠĠ Ġ* Ġto Ġthe Ġsupplied Ġenvironment , Ġand Ġreturning Ġit Ġas Ġthe Ġreturn Ġvalue . ĊĠĠĠĠ Ġ* ĠIt Ġalso Ġcreates Ġthe Ġpackage . preload Ġand Ġpackage . loaded Ġtables Ġfor Ġuse Ġby ĊĠĠĠĠ Ġ* Ġother Ġlibraries . ĊĠĠĠĠ Ġ* Ġ@ param Ġmod name Ġthe Ġmodule Ġname Ġsupplied Ġif Ġthis Ġis Ġloaded Ġvia Ġ' require '. ĊĠĠĠĠ Ġ* Ġ@ param Ġenv Ġthe Ġenvironment Ġto Ġload Ġinto , Ġtypically Ġa ĠGlobals Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcall ( mod name : ĠLua Value , Ġenv : ĠLua Value ): ĠLua Value Ġ{ ĊĠĠĠĠĠĠĠ Ġglobals Ġ= Ġenv . check globals () ĊĠĠĠĠĠĠĠ Ġglobals !! [" require "] Ġ= Ġrequire () ĊĠĠĠĠĠĠĠ Ġpackage _ Ġ= ĠLua Table () ĊĠĠĠĠĠĠĠ Ġval Ġpackage _ Ġ= Ġpackage _ !! ĊĠĠĠĠĠĠĠ Ġpackage _[ _ LOADED ] Ġ= ĠLua Table () ĊĠĠĠĠĠĠĠ Ġpackage _[ _ PRE LOAD ] Ġ= ĠLua Table () ĊĠĠĠĠĠĠĠ Ġpackage _[ _ PATH ] Ġ= Ġvalue Of ( DEFAULT _ LUA _ PATH !! ) ĊĠĠĠĠĠĠĠ Ġpackage _[ _ LOAD LIB ] Ġ= Ġload lib () ĊĠĠĠĠĠĠĠ Ġpackage _[ _ SEARCH PATH ] Ġ= Ġsearch path () ĊĠĠĠĠĠĠĠ Ġval Ġsearch ers Ġ= ĠLua Table () ĊĠĠĠĠĠĠĠ Ġsearch ers . set ( 1 , Ġrun Ġ{ Ġpreload _ search er Ġ= ĠPre load _ search er (); Ġpreload _ search er !! Ġ}) ĊĠĠĠĠĠĠĠ Ġsearch ers . set ( 2 , Ġrun Ġ{ Ġlua _ search er Ġ= ĠLua _ search er (); Ġlua _ search er !! Ġ}) ĊĠĠĠĠĠĠĠ Ġsearch ers . set ( 3 , Ġrun Ġ{ Ġjava _ search er Ġ= ĠJava _ search er (); Ġjava _ search er !! Ġ}) ĊĠĠĠĠĠĠĠ Ġpackage _[ _ SEARCH ERS ] Ġ= Ġsearch ers ĊĠĠĠĠĠĠĠ Ġpackage _[ _ LOADED ][" package "] Ġ= Ġpackage _ ĊĠĠĠĠĠĠĠ Ġenv [" package "] Ġ= Ġpackage _ ĊĠĠĠĠĠĠĠ Ġglobals !!. package _ Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġreturn Ġenv ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsuspend able Call ( mod name : ĠLua Value , Ġenv : ĠLua Value ): ĠLua Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcall ( mod name , Ġenv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAllow Ġpackages Ġto Ġmark Ġthemselves Ġas Ġloaded Ġ Ġ*/ ĊĠĠĠ Ġfun ĠsetIs Loaded ( name : ĠString , Ġvalue : ĠLua Table ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpackage _ ! ![ _ LOADED ][ name ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġlua Ġpath Ġused Ġby Ġthis Ġlibrary Ġinstance Ġto Ġa Ġnew Ġvalue . ĊĠĠĠĠ Ġ* ĠMer ely Ġsets Ġthe Ġvalue Ġof Ġ[ path ] Ġto Ġbe Ġused Ġin Ġsubsequent Ġsearches . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġset Lua Path ( new Lua Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpackage _ ! ![ _ PATH ] Ġ= Ġvalue Of ( new Lua Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto j string (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" package " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ================= ======= ĠPackage Ġloading Ġ================= ============ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġrequire Ġ( mod name ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠLoads Ġthe Ġgiven Ġmodule . ĠThe Ġfunction Ġstarts Ġby Ġlooking Ġinto Ġthe Ġpackage . loaded Ġtable ĊĠĠĠĠ Ġ* Ġto Ġdetermine Ġwhether Ġmod name Ġis Ġalready Ġloaded . ĠIf Ġit Ġis , Ġthen Ġrequire Ġreturns Ġthe Ġvalue ĊĠĠĠĠ Ġ* Ġstored Ġat Ġpackage . loaded [ mod name ]. ĠOtherwise , Ġit Ġtries Ġto Ġfind Ġa Ġloader Ġfor Ġthe Ġmodule . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTo Ġfind Ġa Ġloader , Ġrequire Ġis Ġguide d Ġby Ġthe Ġpackage . search ers Ġsequence . ĊĠĠĠĠ Ġ* ĠBy Ġchanging Ġthis Ġsequence , Ġwe Ġcan Ġchange Ġhow Ġrequire Ġlooks Ġfor Ġa Ġmodule . ĊĠĠĠĠ Ġ* ĠThe Ġfollowing Ġexplanation Ġis Ġbased Ġon Ġthe Ġdefault Ġconfiguration Ġfor Ġpackage . search ers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFirst Ġrequire Ġqueries Ġpackage . preload [ mod name ]. ĠIf Ġit Ġhas Ġa Ġvalue , Ġthis Ġvalue ĊĠĠĠĠ Ġ* Ġ( which Ġshould Ġbe Ġa Ġfunction ) Ġis Ġthe Ġloader . ĠOtherwise Ġrequire Ġsearches Ġfor Ġa ĠLua Ġloader Ġusing ĊĠĠĠĠ Ġ* Ġthe Ġpath Ġstored Ġin Ġpackage . path . ĠIf Ġthat Ġalso Ġfails , Ġit Ġsearches Ġfor Ġa ĠJava Ġloader Ġusing ĊĠĠĠĠ Ġ* Ġthe Ġclasspath , Ġusing Ġthe Ġpublic Ġdefault Ġconstructor , Ġand Ġcasting Ġthe Ġinstance Ġto ĠLua Function . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOnce Ġa Ġloader Ġis Ġfound , Ġrequire Ġcalls Ġthe Ġloader Ġwith Ġtwo Ġarguments : Ġmod name Ġand Ġan Ġextra Ġvalue ĊĠĠĠĠ Ġ* Ġdependent Ġon Ġhow Ġit Ġgot Ġthe Ġloader . ĠIf Ġthe Ġloader Ġcame Ġfrom Ġa Ġfile , Ġthis Ġextra Ġvalue Ġis Ġthe Ġfile Ġname . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġloader Ġis Ġa ĠJava Ġinstance Ġof ĠLua Function , Ġthis Ġextra Ġvalue Ġis Ġthe Ġenvironment . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġloader Ġreturns Ġany Ġnon - nil Ġvalue , Ġrequire Ġassigns Ġthe Ġreturned Ġvalue Ġto Ġpackage . loaded [ mod name ]. ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġloader Ġdoes Ġnot Ġreturn Ġa Ġnon - nil Ġvalue Ġand Ġhas Ġnot Ġassigned Ġany Ġvalue Ġto Ġpackage . loaded [ mod name ], ĊĠĠĠĠ Ġ* Ġthen Ġrequire Ġassigns Ġtrue Ġto Ġthis Ġentry . ĊĠĠĠĠ Ġ* ĠIn Ġany Ġcase , Ġrequire Ġreturns Ġthe Ġfinal Ġvalue Ġof Ġpackage . loaded [ mod name ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġany Ġerror Ġloading Ġor Ġrunning Ġthe Ġmodule , Ġor Ġif Ġit Ġcannot Ġfind Ġany Ġloader Ġfor Ġthe Ġmodule , ĊĠĠĠĠ Ġ* Ġthen Ġrequire Ġraises Ġan Ġerror . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass Ġrequire Ġ: ĠOne Arg Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall ( arg : ĠLua Value ): ĠLua Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġarg . check string () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloaded Ġ= Ġpackage _ ! ![ _ LOADED ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġloaded [ name !! ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . to boolean ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ=== Ġ_ SENT IN EL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLua Value . error (" loop Ġor Ġprevious Ġerror Ġloading Ġmodule Ġ'$ name '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġelse Ġmust Ġload Ġit ; Ġiterate Ġover Ġavailable Ġload ers Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtbl Ġ= Ġpackage _ ! ![ _ SEARCH ERS ]. check table () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġloader : ĠVar args ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch er Ġ= Ġtbl ! ![ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search er . is nil ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLua Value . error (" module Ġ'$ name ' Ġnot Ġfound : Ġ$ name $ sb ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġcall Ġloader Ġwith Ġmodule Ġname Ġas Ġargument Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloader Ġ= Ġsearch er . invoke ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loader . is function ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loader . is string ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( loader . to j string ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġthe Ġmodule Ġusing Ġthe Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloaded [ name ] Ġ= Ġ_ SENT IN EL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġloader !!. arg 1 (). call ( name , Ġloader . arg ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . is nil ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded [ name ] Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(( run Ġ{ Ġresult Ġ= Ġloaded [ name ]; Ġresult Ġ}) Ġ=== Ġ_ SENT IN EL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded . set ( name , Ġrun Ġ{ Ġresult Ġ= ĠLua Value . TRUE ; Ġresult !! Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass Ġload lib Ġ: ĠVar Arg Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( args : ĠVar args ): ĠVar args Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . check string ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvar args Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNIL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Of (" dynamic Ġlibraries Ġnot Ġenabled "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Of (" abs ent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke Suspend ( args : ĠVar args ): ĠVar args { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠPre load _ search er Ġ: ĠVar Arg Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( args : ĠVar args ): ĠVar args Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġargs . check string ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` val ` Ġ= Ġpackage _ ! ![ _ PRE LOAD ] ! ![ name !! ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(` val `. is nil ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Of ("\ n \ t no Ġfield Ġpackage . preload [' $ name '] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` val ` ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke Suspend ( args : ĠVar args ): ĠVar args { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠLua _ search er Ġ: ĠVar Arg Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( args : ĠVar args ): ĠVar args Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġargs . check string ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġpackage Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġpackage _ ! ![ _ PATH ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! path . is string ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Of (" package . path Ġis Ġnot Ġa Ġstring ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġsearch path Ġfunction . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġpackage _ ! ![ _ SEARCH PATH ] !!. invoke ( var args Of ( name !! , Ġpath )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDid Ġwe Ġget Ġa Ġresult ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! v . is string ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv . arg ( 2 ). tostring () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġv . arg 1 (). str value () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġload Ġthe Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ= Ġglobals !!. load file ( filename !!. to j string ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( v . arg 1 (). is function ()) Ġvar args Of ( v . arg 1 (), Ġfilename ) Ġelse Ġvar args Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNIL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Of ("'" Ġ+ Ġfilename Ġ+ Ġ" ': Ġ" Ġ+ Ġv . arg ( 2 ). to j string ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreport Ġerror ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke Suspend ( args : ĠVar args ): ĠVar args { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass Ġsearch path Ġ: ĠVar Arg Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( args : ĠVar args ): ĠVar args Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġargs . check j string ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġargs . check j string ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsep Ġ= Ġargs . opt j string ( 3 , Ġ". ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrep Ġ= Ġargs . opt j string ( 4 , ĠFILE _ SEP !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthe Ġpath Ġelements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġe Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġpath !!. length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsb : ĠStringBuilder ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname !!. replace ( sep ! ![ 0 ], Ġrep ! ![ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( e Ġ< Ġn ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġnext Ġtemplate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġe Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġpath . indexOf (' ;', Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġpath . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġpath . substring ( b , Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġfilename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq Ġ= Ġtemplate . indexOf (' ?') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfilename Ġ= Ġtemplate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( q Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename Ġ= Ġtemplate . substring ( 0 , Ġq ) Ġ+ Ġname Ġ+ Ġtemplate . substring ( q Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtry Ġopening Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` is ` Ġ= Ġglobals !!. finder !!. find Resource ( filename ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(` is ` Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` is `. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Of ( filename ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreport Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sb Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\ n \ t " Ġ+ Ġfilename ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvar args Of ( NIL , Ġvalue Of ( sb !!. toString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke Suspend ( args : ĠVar args ): ĠVar args { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠJava _ search er Ġ: ĠVar Arg Function () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( args : ĠVar args ): ĠVar args Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġargs . check j string ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclassname Ġ= Ġto Class name ( name !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠClass . forName ( classname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġc . newInstance () Ġas ĠLua Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . is function ()) Ġ( v Ġas ĠLua Function ). init up value 1 ( globals !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvar args Of ( v , Ġglobals !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue Of ("\ n \ t java Ġload Ġfailed Ġon Ġ'$ classname ', Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke Suspend ( args : ĠVar args ): ĠVar args { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoke ( args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġdefault Ġvalue Ġto Ġuse Ġfor Ġpackage . path . Ġ ĠThis Ġcan Ġbe Ġset Ġwith Ġthe Ġsystem Ġproperty ĊĠĠĠĠĠĠĠĠ Ġ* Ġ`" lu aj . package . path "`, Ġand Ġis Ġ`" ?. lua "` Ġby Ġdefault . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar ĠDEFAULT _ LUA _ PATH : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ LUA _ PATH Ġ= ĠSystem . getProperty (" lu aj . package . path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEFAULT _ LUA _ PATH Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ LUA _ PATH Ġ= Ġ" ?. lua " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ LOADED Ġ= Ġvalue Of (" loaded ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ LOAD LIB Ġ= Ġvalue Of (" load lib ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ PRE LOAD Ġ= Ġvalue Of (" preload ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ PATH Ġ= Ġvalue Of (" path ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ SEARCH PATH Ġ= Ġvalue Of (" search path ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ SEARCH ERS Ġ= Ġvalue Of (" search ers ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ SENT IN EL Ġ= Ġvalue Of ("\ u 0 0 0 1 ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFILE _ SEP Ġ= ĠSystem . getProperty (" file . separator ") ĊĊĠĠĠĠĠĠĠ Ġ/** ĠConvert Ġlua Ġfilename Ġto Ġvalid Ġclass Ġname Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġto Class name ( filename : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġfilename . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filename . endsWith (". lua ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ-= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( k Ġin Ġ 0 Ġuntil Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġfilename [ k ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Class name Part ( c ) Ġ|| Ġc Ġ== Ġ'/' Ġ|| Ġc Ġ== Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġfilename [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Class name Part ( c )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( c Ġ== Ġ'/' Ġ|| Ġc Ġ== Ġ'\\ ') Ġ'.' Ġelse Ġ'_' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( n Ġ== Ġj ) Ġfilename Ġelse Ġfilename . substring ( 0 , Ġj ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Class name Part ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ>= Ġ' a ' Ġ&& Ġc Ġ<= Ġ' z ' Ġ|| Ġc Ġ>= Ġ' A ' Ġ&& Ġc Ġ<= Ġ' Z ' Ġ|| Ġc Ġ>= Ġ' 0 ' Ġ&& Ġc Ġ<= Ġ' 9 ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'.', Ġ'$ ', Ġ'_' Ġ-> Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ