VariableToken.cs 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956
  1. using System;
  2. using System.Collections.Generic;
  3. using NTERA.EmuEra.Game.EraEmu.GameData.Expression;
  4. using NTERA.EmuEra.Game.EraEmu.GameProc;
  5. using NTERA.EmuEra.Game.EraEmu.Sub;
  6. namespace NTERA.EmuEra.Game.EraEmu.GameData.Variable
  7. {
  8. //IndexOutOfRangeException, ArgumentOutOfRangeExceptionを投げることがある。VariableTermの方で処理すること。
  9. //引数は整数しか受け付けない。*.csvを利用した置換はVariableTermの方で処理すること
  10. internal abstract class VariableToken
  11. {
  12. protected VariableToken(VariableCode varCode, VariableData varData)
  13. {
  14. Code = varCode;
  15. VariableType = ((varCode & VariableCode.__INTEGER__) == VariableCode.__INTEGER__) ? typeof(Int64) : typeof(string);
  16. VarCodeInt = (int)(varCode & VariableCode.__LOWERCASE__);
  17. varName = varCode.ToString();
  18. this.varData = varData;
  19. IsForbid = false;
  20. IsPrivate = false;
  21. IsReference = false;
  22. Dimension = 0;
  23. IsGlobal = (Code == VariableCode.GLOBAL) || (Code == VariableCode.GLOBALS);
  24. if ((Code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__)
  25. Dimension = 1;
  26. if ((Code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__)
  27. Dimension = 2;
  28. if ((Code & VariableCode.__ARRAY_3D__) == VariableCode.__ARRAY_3D__)
  29. Dimension = 3;
  30. IsSavedata = false;
  31. if ((Code == VariableCode.GLOBAL) || (Code == VariableCode.GLOBALS))
  32. IsSavedata = true;
  33. else if ((Code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
  34. {
  35. IsSavedata = true;
  36. }
  37. else if (((Code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__)
  38. && ((Code & VariableCode.__CALC__) != VariableCode.__CALC__)
  39. && ((Code & VariableCode.__UNCHANGEABLE__) != VariableCode.__UNCHANGEABLE__)
  40. && ((Code & VariableCode.__LOCAL__) != VariableCode.__LOCAL__)
  41. && (!varName.StartsWith("NOTUSE_")))
  42. {
  43. VariableCode flag = Code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__ | VariableCode.__CHARACTER_DATA__);
  44. switch (flag)
  45. {
  46. case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__:
  47. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER__)
  48. IsSavedata = true;
  49. break;
  50. case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__:
  51. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING__)
  52. IsSavedata = true;
  53. break;
  54. case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
  55. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER_ARRAY__)
  56. IsSavedata = true;
  57. break;
  58. case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
  59. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING_ARRAY__)
  60. IsSavedata = true;
  61. break;
  62. case VariableCode.__INTEGER__:
  63. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_INTEGER__)
  64. IsSavedata = true;
  65. break;
  66. case VariableCode.__STRING__:
  67. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_STRING__)
  68. IsSavedata = true;
  69. break;
  70. case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
  71. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_INTEGER_ARRAY__)
  72. IsSavedata = true;
  73. break;
  74. case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
  75. if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_STRING_ARRAY__)
  76. IsSavedata = true;
  77. break;
  78. }
  79. }
  80. }
  81. public readonly VariableCode Code;
  82. public readonly int VarCodeInt;
  83. protected readonly VariableData varData;
  84. protected string varName;
  85. public Type VariableType { get; protected set; }
  86. public bool CanRestructure { get; protected set; }
  87. public string Name => varName;
  88. //CodeEEにしているけど実際はExeEEかもしれない
  89. public virtual Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  90. { throw new CodeEE("整数型でない変数" + varName + "を整数型として呼び出しました"); }
  91. public virtual string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  92. { throw new CodeEE("文字列型でない変数" + varName + "を文字列型として呼び出しました"); }
  93. public virtual void SetValue(Int64 value, Int64[] arguments)
  94. { throw new CodeEE("整数型でない変数" + varName + "を整数型として呼び出しました"); }
  95. public virtual void SetValue(string value, Int64[] arguments)
  96. { throw new CodeEE("文字列型でない変数" + varName + "を文字列型として呼び出しました"); }
  97. public virtual void SetValue(Int64[] values, Int64[] arguments)
  98. { throw new CodeEE("整数型配列でない変数" + varName + "を整数型配列として呼び出しました"); }
  99. public virtual void SetValue(string[] values, Int64[] arguments)
  100. { throw new CodeEE("文字列型配列でない変数" + varName + "を文字列型配列として呼び出しました"); }
  101. public virtual void SetValueAll(Int64 value, int start, int end, int charaPos)
  102. { throw new CodeEE("整数型配列でない変数" + varName + "を整数型配列として呼び出しました"); }
  103. public virtual void SetValueAll(string value, int start, int end, int charaPos)
  104. { throw new CodeEE("文字列型配列でない変数" + varName + "を文字列型配列として呼び出しました"); }
  105. public virtual Int64 PlusValue(Int64 value, Int64[] arguments)
  106. { throw new CodeEE("整数型でない変数" + varName + "を整数型として呼び出しました"); }
  107. public virtual Int32 GetLength()
  108. { throw new CodeEE("配列型でない変数" + varName + "の長さを取得しようとしました"); }
  109. public virtual Int32 GetLength(int dimension)
  110. { throw new CodeEE("配列型でない変数" + varName + "の長さを取得しようとしました"); }
  111. public virtual object GetArray()
  112. {
  113. if (IsCharacterData)
  114. throw new CodeEE("キャラクタ変数" + varName + "を非キャラ変数として呼び出しました");
  115. throw new CodeEE("配列型でない変数" + varName + "の配列を取得しようとしました");
  116. }
  117. public virtual object GetArrayChara(int charano)
  118. {
  119. if (!IsCharacterData)
  120. throw new CodeEE("非キャラクタ変数" + varName + "をキャラ変数として呼び出しました");
  121. throw new CodeEE("配列型でない変数" + varName + "の配列を取得しようとしました");
  122. }
  123. public void throwOutOfRangeException(Int64[] arguments, Exception e)
  124. {
  125. CheckElement(arguments, new[] { true, true, true });
  126. throw e;
  127. }
  128. public virtual void CheckElement(Int64[] arguments, bool[] doCheck) { }
  129. public void CheckElement(Int64[] arguments)
  130. {
  131. CheckElement(arguments, new[] { true, true, true });
  132. }
  133. public virtual void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  134. {
  135. CheckElement(arguments, new[] { true, true, true });
  136. }
  137. public int CodeInt => VarCodeInt;
  138. public VariableCode CodeFlag => Code & VariableCode.__UPPERCASE__;
  139. public bool IsNull => Code == VariableCode.__NULL__;
  140. public bool IsCharacterData => ((Code & VariableCode.__CHARACTER_DATA__) == VariableCode.__CHARACTER_DATA__);
  141. public bool IsInteger => ((Code & VariableCode.__INTEGER__) == VariableCode.__INTEGER__);
  142. public bool IsString => ((Code & VariableCode.__STRING__) == VariableCode.__STRING__);
  143. public bool IsArray1D => ((Code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__);
  144. public bool IsArray2D => ((Code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__);
  145. public bool IsArray3D => ((Code & VariableCode.__ARRAY_3D__) == VariableCode.__ARRAY_3D__);
  146. /// <summary>
  147. /// 1810alpha007 諸事情によりReadOnlyからIsConstに改名。
  148. /// </summary>
  149. public virtual bool IsConst => ((Code & VariableCode.__UNCHANGEABLE__) == VariableCode.__UNCHANGEABLE__);
  150. public bool IsCalc => ((Code & VariableCode.__CALC__) == VariableCode.__CALC__);
  151. public bool IsLocal => ((Code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__);
  152. public bool CanForbid => ((Code & VariableCode.__CAN_FORBID__) == VariableCode.__CAN_FORBID__);
  153. public bool IsForbid { get; protected set; }
  154. public bool IsPrivate { get; protected set; }
  155. public bool IsGlobal { get; protected set; }
  156. public bool IsSavedata { get; protected set; }
  157. public bool IsReference { get; protected set; }
  158. public int Dimension { get; protected set; }
  159. }
  160. internal abstract class CharaVariableToken : VariableToken
  161. {
  162. protected CharaVariableToken(VariableCode varCode, VariableData varData)
  163. : base(varCode, varData)
  164. {
  165. sizes = CharacterData.CharacterVarLength(varCode, varData.Constant);
  166. if (sizes != null)
  167. {
  168. totalSize = 1;
  169. for (int i = 0; i < sizes.Length; i++)
  170. totalSize *= sizes[i];
  171. IsForbid = totalSize == 0;
  172. }
  173. IsPrivate = false;
  174. CanRestructure = false;
  175. }
  176. protected int[] sizes;
  177. protected int totalSize;
  178. public override Int32 GetLength()
  179. {
  180. if (sizes.Length == 1)
  181. return sizes[0];
  182. if (sizes.Length == 0)
  183. throw new CodeEE("非配列型のキャラ変数" + varName + "の長さを取得しようとしました");
  184. throw new CodeEE(Dimension + "次元配列型のキャラ変数" + varName + "の長さを次元を指定せずに取得しようとしました");
  185. }
  186. public override Int32 GetLength(int dimension)
  187. {
  188. if (sizes.Length == 0)
  189. throw new CodeEE("非配列型のキャラ変数" + varName + "の長さを取得しようとしました");
  190. if (dimension < sizes.Length)
  191. return sizes[dimension];
  192. throw new CodeEE("配列型変数のキャラ変数" + varName + "の存在しない次元の長さを取得しようとしました");
  193. }
  194. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  195. {
  196. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= varData.CharacterList.Count)))
  197. throw new CodeEE("Character array variable " + varName + " at the first argument (" + arguments[0] + ") is out of range of the character registration number");
  198. if (doCheck.Length > 1 && sizes.Length > 0 && doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= sizes[0])))
  199. throw new CodeEE("Character array variable " + varName + " at the second argument (" + arguments[1] + ") is out of range of the array");
  200. if (doCheck.Length > 2 && sizes.Length > 1 && doCheck[2] && ((arguments[2] < 0) || (arguments[2] >= sizes[1])))
  201. throw new CodeEE("Character array variable " + varName + " at the third argument (" + arguments[2] + ") is out of range of the array");
  202. }
  203. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  204. {
  205. CheckElement(arguments);
  206. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  207. if ((index1 < 0) || (index1 > sizes[0]))
  208. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  209. if ((index2 < 0) || (index2 > sizes[0]))
  210. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  211. }
  212. }
  213. internal abstract class UserDefinedVariableToken : VariableToken
  214. {
  215. protected UserDefinedVariableToken(VariableCode varCode, UserDefinedVariableData data)
  216. : base(varCode, null)
  217. {
  218. varName = data.Name;
  219. IsPrivate = data.Private;
  220. isConst = data.Const;
  221. sizes = data.Lengths;
  222. IsGlobal = data.Global;
  223. IsSavedata = data.Save;
  224. //Dimension = sizes.Length;
  225. totalSize = 1;
  226. for (int i = 0; i < sizes.Length; i++)
  227. totalSize *= sizes[i];
  228. IsForbid = totalSize == 0;
  229. CanRestructure = isConst;
  230. }
  231. public abstract void SetDefault();
  232. protected bool isConst;
  233. protected int[] sizes;
  234. protected int totalSize;
  235. //public bool IsGlobal { get; protected set; }
  236. //public bool IsSavedata { get; protected set; }
  237. public override bool IsConst => isConst;
  238. public override Int32 GetLength()
  239. {
  240. if (Dimension == 1)
  241. return sizes[0];
  242. throw new CodeEE(Dimension + "次元配列型変数" + varName + "の長さを取得しようとしました");
  243. }
  244. public override Int32 GetLength(int dimension)
  245. {
  246. if (dimension < Dimension)
  247. return sizes[dimension];
  248. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  249. }
  250. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  251. {
  252. //if (array == null)
  253. // throw new ExeEE("プライベート変数" + varName + "の配列が用意されていない");
  254. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= sizes[0])))
  255. throw new CodeEE("配列型変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  256. if (sizes.Length >= 2 && ((arguments[1] < 0) || (arguments[1] >= sizes[1])))
  257. throw new CodeEE("配列型変数" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
  258. if (sizes.Length >= 3 && ((arguments[2] < 0) || (arguments[2] >= sizes[2])))
  259. throw new CodeEE("配列型変数" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
  260. }
  261. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  262. {
  263. CheckElement(arguments);
  264. if ((index1 < 0) || (index1 > sizes[Dimension - 1]))
  265. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  266. if ((index2 < 0) || (index2 > sizes[Dimension - 1]))
  267. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  268. }
  269. public abstract void In();
  270. public abstract void Out();
  271. public bool IsStatic { get; protected set; }
  272. }
  273. internal abstract class UserDefinedCharaVariableToken : CharaVariableToken
  274. {
  275. protected UserDefinedCharaVariableToken(VariableCode varCode, UserDefinedVariableData data, VariableData varData, int arrayIndex)
  276. : base(varCode, varData)
  277. {
  278. ArrayIndex = arrayIndex;
  279. DimData = data;
  280. varName = data.Name;
  281. sizes = data.Lengths;
  282. IsGlobal = data.Global;
  283. IsSavedata = data.Save;
  284. //Dimension = sizes.Length;
  285. totalSize = 1;
  286. for (int i = 0; i < sizes.Length; i++)
  287. totalSize *= sizes[i];
  288. IsForbid = totalSize == 0;
  289. }
  290. public readonly UserDefinedVariableData DimData;
  291. public readonly int ArrayIndex;
  292. public override object GetArrayChara(int charano)
  293. {
  294. return varData.CharacterList[charano].UserDefCVarDataList[ArrayIndex];
  295. }
  296. }
  297. //1808beta009 廃止 UserDefinedVariableTokenで一括して扱う
  298. //internal abstract class PrivateVariableToken : UserDefinedVariableToken
  299. //{
  300. // protected PrivateVariableToken(VariableCode varCode, UserDefinedVariableData data)
  301. // : base(varCode, data)
  302. // {
  303. // IsPrivate = true;
  304. // }
  305. //}
  306. /// <summary>
  307. /// 1808beta009 追加
  308. /// 参照型。public もあるよ
  309. /// </summary>
  310. internal abstract class ReferenceToken : UserDefinedVariableToken
  311. {
  312. protected ReferenceToken(VariableCode varCode, UserDefinedVariableData data)
  313. : base(varCode, data)
  314. {
  315. CanRestructure = false;
  316. IsStatic = !data.Private;
  317. IsReference = true;
  318. arrayList = new List<Array>();
  319. IsForbid = false;
  320. }
  321. protected List<Array> arrayList;
  322. protected Array array;
  323. public override void SetDefault()
  324. {//Defaultのセットは参照元がやるべき
  325. }
  326. public override Int32 GetLength()
  327. {
  328. if (array == null)
  329. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  330. if (Dimension != 1)
  331. throw new CodeEE(Dimension + "次元配列型変数" + varName + "の長さを取得しようとしました");
  332. return array.Length;
  333. }
  334. public override Int32 GetLength(int dimension)
  335. {
  336. if (array == null)
  337. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  338. if (dimension < Dimension)
  339. return array.GetLength(dimension);
  340. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  341. }
  342. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  343. {
  344. if (array == null)
  345. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  346. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
  347. throw new CodeEE("配列型変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  348. if (Dimension >= 2 && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
  349. throw new CodeEE("配列型変数" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
  350. if (Dimension >= 3 && ((arguments[2] < 0) || (arguments[2] >= array.GetLength(2))))
  351. throw new CodeEE("配列型変数" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
  352. }
  353. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  354. {
  355. CheckElement(arguments);
  356. if ((index1 < 0) || (index1 > array.GetLength(Dimension - 1)))
  357. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  358. if ((index2 < 0) || (index2 > array.GetLength(Dimension - 1)))
  359. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  360. }
  361. int counter;
  362. public override void In()
  363. {
  364. if (counter > 0)
  365. arrayList.Add(array);
  366. counter++;
  367. array = null;
  368. }
  369. public override void Out()
  370. {
  371. //arrayList.RemoveAt(arrayList.Count - 1);
  372. if (arrayList.Count > 0)
  373. {
  374. array = arrayList[arrayList.Count - 1];
  375. arrayList.RemoveAt(arrayList.Count - 1);
  376. }
  377. else
  378. array = null;
  379. counter--;
  380. }
  381. public override object GetArray()
  382. {
  383. if (array == null)
  384. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  385. return array;
  386. }
  387. public void SetRef(Array refArray)
  388. {
  389. array = refArray;
  390. }
  391. /// <summary>
  392. /// 型が一致するかどうか(参照可能かどうか)
  393. /// </summary>
  394. /// <param name="rother"></param>
  395. /// <returns></returns>
  396. public bool MatchType(VariableToken rother, bool allowChara, out string errMes)
  397. {
  398. errMes = "";
  399. if (rother == null)
  400. { errMes = "参照先変数は省略できません"; return false; }
  401. if (rother.IsCalc)
  402. { errMes = "疑似変数は参照できません"; return false; }
  403. //TODO constの参照
  404. //if (rother.IsConst != this.isConst)
  405. if (rother.IsConst)
  406. { errMes = "定数は参照できません"; return false; }
  407. //1812 ローカル参照の条件変更
  408. //ローカルかつDYNAMICなREFはローカル参照できる
  409. if ((!IsPrivate) && (rother.IsPrivate || rother.IsLocal))
  410. { errMes = "広域の参照変数はローカル変数を参照できません"; return false; }
  411. ////1810beta002 ローカル参照禁止
  412. //if ((!rother.IsReference) && (rother.IsPrivate || rother.IsLocal))
  413. //{ errMes = "ローカル変数は参照できません"; return false; }
  414. if (rother.IsCharacterData && !allowChara)
  415. { errMes = "キャラ変数は参照できません"; return false; }
  416. if (IsInteger != rother.IsInteger)
  417. { errMes = "型が異なる変数は参照できません"; return false; }
  418. if (Dimension != rother.Dimension)
  419. { errMes = "次元数が異なる変数は参照できません"; return false; }
  420. return true;
  421. }
  422. }
  423. internal abstract class LocalVariableToken : VariableToken
  424. {
  425. public LocalVariableToken(VariableCode varCode, VariableData varData, string subId, int size)
  426. : base(varCode, varData)
  427. {
  428. CanRestructure = false;
  429. subID = subId;
  430. this.size = size;
  431. }
  432. public abstract void SetDefault();
  433. public abstract void resize(int newSize);
  434. protected string subID;
  435. protected int size;
  436. public override Int32 GetLength()
  437. {
  438. return size;
  439. }
  440. public override Int32 GetLength(int dimension)
  441. {
  442. if (dimension == 0)
  443. return size;
  444. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  445. }
  446. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  447. {
  448. //if (array == null)
  449. // throw new ExeEE("プライベート変数" + varName + "の配列が用意されていない");
  450. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= size)))
  451. throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  452. }
  453. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  454. {
  455. CheckElement(arguments);
  456. if ((index1 < 0) || (index1 > size))
  457. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  458. if ((index2 < 0) || (index2 > size))
  459. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  460. }
  461. }
  462. //サブクラスの詳細はVariableData以外は知らなくてよい
  463. internal sealed partial class VariableData
  464. {
  465. #region 変数
  466. private sealed class IntVariableToken : VariableToken
  467. {
  468. public IntVariableToken(VariableCode varCode, VariableData varData)
  469. : base(varCode, varData)
  470. {
  471. CanRestructure = false;
  472. array = varData.DataInteger;
  473. }
  474. Int64[] array;
  475. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  476. {
  477. return array[VarCodeInt];
  478. }
  479. public override void SetValue(Int64 value, Int64[] arguments)
  480. {
  481. array[VarCodeInt] = value;
  482. }
  483. public override void SetValueAll(long value, int start, int end, int charaPos)
  484. {
  485. array[VarCodeInt] = value;
  486. }
  487. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  488. {
  489. array[VarCodeInt] += value;
  490. return array[VarCodeInt];
  491. }
  492. }
  493. private sealed class Int1DVariableToken : VariableToken
  494. {
  495. public Int1DVariableToken(VariableCode varCode, VariableData varData)
  496. : base(varCode, varData)
  497. {
  498. CanRestructure = false;
  499. array = varData.DataIntegerArray[VarCodeInt];
  500. IsForbid = array.Length == 0;
  501. }
  502. Int64[] array;
  503. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  504. {
  505. return array[arguments[0]];
  506. }
  507. public override void SetValue(Int64 value, Int64[] arguments)
  508. {
  509. array[arguments[0]] = value;
  510. }
  511. public override void SetValue(Int64[] values, Int64[] arguments)
  512. {
  513. int start = (int)arguments[0];
  514. int end = start + values.Length;
  515. for (int i = start; i < end; i++)
  516. array[i] = values[i - start];
  517. }
  518. public override void SetValueAll(long value, int start, int end, int charaPos)
  519. {
  520. for (int i = start; i < end; i++)
  521. array[i] = value;
  522. }
  523. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  524. {
  525. array[arguments[0]] += value;
  526. return array[arguments[0]];
  527. }
  528. public override Int32 GetLength()
  529. { return array.Length; }
  530. public override Int32 GetLength(int dimension)
  531. {
  532. if (dimension == 0)
  533. return array.Length;
  534. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  535. }
  536. public override object GetArray() { return array; }
  537. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  538. {
  539. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
  540. throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  541. }
  542. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  543. {
  544. CheckElement(arguments);
  545. if ((index1 < 0) || (index1 > array.Length))
  546. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  547. if ((index2 < 0) || (index2 > array.Length))
  548. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  549. }
  550. }
  551. private sealed class Int2DVariableToken : VariableToken
  552. {
  553. public Int2DVariableToken(VariableCode varCode, VariableData varData)
  554. : base(varCode, varData)
  555. {
  556. CanRestructure = false;
  557. array = varData.DataIntegerArray2D[VarCodeInt];
  558. IsForbid = array.Length == 0;
  559. }
  560. Int64[,] array;
  561. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  562. {
  563. return array[arguments[0], arguments[1]];
  564. }
  565. public override void SetValue(Int64 value, Int64[] arguments)
  566. {
  567. array[arguments[0], arguments[1]] = value;
  568. }
  569. public override void SetValue(Int64[] values, Int64[] arguments)
  570. {
  571. int start = (int)arguments[1];
  572. int end = start + values.Length;
  573. for (int i = start; i < end; i++)
  574. array[arguments[0], i] = values[i - start];
  575. }
  576. public override void SetValueAll(long value, int start, int end, int charaPos)
  577. {
  578. int a1 = array.GetLength(0);
  579. int a2 = array.GetLength(1);
  580. for (int i = 0; i < a1; i++)
  581. for (int j = 0; j < a2; j++)
  582. array[i, j] = value;
  583. }
  584. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  585. {
  586. array[arguments[0], arguments[1]] += value;
  587. return array[arguments[0], arguments[1]];
  588. }
  589. public override Int32 GetLength()
  590. { throw new CodeEE("2次元配列型変数" + varName + "の長さを取得しようとしました"); }
  591. public override Int32 GetLength(int dimension)
  592. {
  593. if ((dimension == 0) || (dimension == 1))
  594. return array.GetLength(dimension);
  595. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  596. }
  597. public override object GetArray() { return array; }
  598. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  599. {
  600. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
  601. throw new CodeEE("二次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  602. if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
  603. throw new CodeEE("二次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
  604. }
  605. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  606. {
  607. CheckElement(arguments);
  608. if ((index1 < 0) || (index1 > array.GetLength(1)))
  609. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  610. if ((index2 < 0) || (index2 > array.GetLength(1)))
  611. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  612. }
  613. }
  614. private sealed class Int3DVariableToken : VariableToken
  615. {
  616. public Int3DVariableToken(VariableCode varCode, VariableData varData)
  617. : base(varCode, varData)
  618. {
  619. CanRestructure = false;
  620. array = varData.DataIntegerArray3D[VarCodeInt];
  621. IsForbid = array.Length == 0;
  622. }
  623. Int64[, ,] array;
  624. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  625. {
  626. return array[arguments[0], arguments[1], arguments[2]];
  627. }
  628. public override void SetValue(Int64 value, Int64[] arguments)
  629. {
  630. array[arguments[0], arguments[1], arguments[2]] = value;
  631. }
  632. public override void SetValue(Int64[] values, Int64[] arguments)
  633. {
  634. int start = (int)arguments[2];
  635. int end = start + values.Length;
  636. for (int i = start; i < end; i++)
  637. array[arguments[0], arguments[1], i] = values[i - start];
  638. }
  639. public override void SetValueAll(long value, int start, int end, int charaPos)
  640. {
  641. int a1 = array.GetLength(0);
  642. int a2 = array.GetLength(1);
  643. int a3 = array.GetLength(2);
  644. for (int i = 0; i < a1; i++)
  645. for (int j = 0; j < a2; j++)
  646. for (int k = 0; k < a3; k++)
  647. array[i, j, k] = value;
  648. }
  649. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  650. {
  651. array[arguments[0], arguments[1], arguments[2]] += value;
  652. return array[arguments[0], arguments[1], arguments[2]];
  653. }
  654. public override Int32 GetLength()
  655. { throw new CodeEE("3次元配列型変数" + varName + "の長さを取得しようとしました"); }
  656. public override Int32 GetLength(int dimension)
  657. {
  658. if ((dimension == 0) || (dimension == 1) || (dimension == 2))
  659. return array.GetLength(dimension);
  660. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  661. }
  662. public override object GetArray() { return array; }
  663. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  664. {
  665. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
  666. throw new CodeEE("三次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  667. if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
  668. throw new CodeEE("三次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
  669. if (doCheck[2] && ((arguments[2] < 0) || (arguments[2] >= array.GetLength(2))))
  670. throw new CodeEE("三次元配列" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
  671. }
  672. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  673. {
  674. CheckElement(arguments);
  675. if ((index1 < 0) || (index1 > array.GetLength(2)))
  676. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  677. if ((index2 < 0) || (index2 > array.GetLength(2)))
  678. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  679. }
  680. }
  681. private sealed class StrVariableToken : VariableToken
  682. {
  683. public StrVariableToken(VariableCode varCode, VariableData varData)
  684. : base(varCode, varData)
  685. {
  686. CanRestructure = false;
  687. array = varData.DataString;
  688. IsForbid = array.Length == 0;
  689. }
  690. string[] array;
  691. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  692. {
  693. return array[VarCodeInt];
  694. }
  695. public override void SetValue(string value, Int64[] arguments)
  696. {
  697. array[VarCodeInt] = value;
  698. }
  699. public override void SetValueAll(string value, int start, int end, int charaPos)
  700. {
  701. array[VarCodeInt] = value;
  702. }
  703. }
  704. private sealed class Str1DVariableToken : VariableToken
  705. {
  706. public Str1DVariableToken(VariableCode varCode, VariableData varData)
  707. : base(varCode, varData)
  708. {
  709. CanRestructure = false;
  710. array = varData.DataStringArray[VarCodeInt];
  711. IsForbid = array.Length == 0;
  712. }
  713. string[] array;
  714. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  715. {
  716. //Bartoum : Str.csv variable names switch here, so we try to translate
  717. return Translation.translate(array[arguments[0]], "Str", translate);
  718. }
  719. public override void SetValue(string value, Int64[] arguments)
  720. {
  721. array[arguments[0]] = value;
  722. }
  723. public override void SetValue(string[] values, Int64[] arguments)
  724. {
  725. int start = (int)arguments[0];
  726. int end = start + values.Length;
  727. for (int i = start; i < end; i++)
  728. array[i] = values[i - start];
  729. }
  730. public override void SetValueAll(string value, int start, int end, int charaPos)
  731. {
  732. for (int i = start; i < end; i++)
  733. array[i] = value;
  734. }
  735. public override Int32 GetLength()
  736. { return array.Length; }
  737. public override Int32 GetLength(int dimension)
  738. {
  739. if (dimension == 0)
  740. return array.Length;
  741. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  742. }
  743. public override object GetArray() { return array; }
  744. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  745. {
  746. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
  747. throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  748. }
  749. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  750. {
  751. CheckElement(arguments);
  752. if ((index1 < 0) || (index1 > array.Length))
  753. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  754. if ((index2 < 0) || (index2 > array.Length))
  755. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  756. }
  757. }
  758. private sealed class Str2DVariableToken : VariableToken
  759. {
  760. public Str2DVariableToken(VariableCode varCode, VariableData varData)
  761. : base(varCode, varData)
  762. {
  763. CanRestructure = false;
  764. array = varData.DataStringArray2D[VarCodeInt];
  765. IsForbid = array.Length == 0;
  766. }
  767. string[,] array;
  768. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  769. {
  770. return array[arguments[0], arguments[1]];
  771. }
  772. public override void SetValue(string value, Int64[] arguments)
  773. {
  774. array[arguments[0], arguments[1]] = value;
  775. }
  776. public override void SetValue(string[] values, Int64[] arguments)
  777. {
  778. int start = (int)arguments[1];
  779. int end = start + values.Length;
  780. for (int i = start; i < end; i++)
  781. array[arguments[0], i] = values[i - start];
  782. }
  783. public override void SetValueAll(string value, int start, int end, int charaPos)
  784. {
  785. int a1 = array.GetLength(0);
  786. int a2 = array.GetLength(1);
  787. for (int i = 0; i < a1; i++)
  788. for (int j = 0; j < a2; j++)
  789. array[i, j] = value;
  790. }
  791. public override Int32 GetLength()
  792. { throw new CodeEE("2次元配列型変数" + varName + "の長さを取得しようとしました"); }
  793. public override Int32 GetLength(int dimension)
  794. {
  795. if ((dimension == 0) || (dimension == 1))
  796. return array.GetLength(dimension);
  797. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  798. }
  799. public override object GetArray() { return array; }
  800. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  801. {
  802. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
  803. throw new CodeEE("二次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  804. if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
  805. throw new CodeEE("二次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
  806. }
  807. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  808. {
  809. CheckElement(arguments);
  810. if ((index1 < 0) || (index1 > array.GetLength(1)))
  811. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  812. if ((index2 < 0) || (index2 > array.GetLength(1)))
  813. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  814. }
  815. }
  816. private sealed class Str3DVariableToken : VariableToken
  817. {
  818. public Str3DVariableToken(VariableCode varCode, VariableData varData)
  819. : base(varCode, varData)
  820. {
  821. CanRestructure = false;
  822. array = varData.DataStringArray3D[VarCodeInt];
  823. IsForbid = array.Length == 0;
  824. }
  825. string[, ,] array;
  826. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  827. {
  828. return array[arguments[0], arguments[1], arguments[2]];
  829. }
  830. public override void SetValue(string value, Int64[] arguments)
  831. {
  832. array[arguments[0], arguments[1], arguments[2]] = value;
  833. }
  834. public override void SetValue(string[] values, Int64[] arguments)
  835. {
  836. int start = (int)arguments[2];
  837. int end = start + values.Length;
  838. for (int i = start; i < end; i++)
  839. array[arguments[0], arguments[1], i] = values[i - start];
  840. }
  841. public override void SetValueAll(string value, int start, int end, int charaPos)
  842. {
  843. int a1 = array.GetLength(0);
  844. int a2 = array.GetLength(1);
  845. int a3 = array.GetLength(2);
  846. for (int i = 0; i < a1; i++)
  847. for (int j = 0; j < a2; j++)
  848. for (int k = 0; k < a3; k++)
  849. array[i, j, k] = value;
  850. }
  851. public override Int32 GetLength()
  852. { throw new CodeEE("3次元配列型変数" + varName + "の長さを取得しようとしました"); }
  853. public override Int32 GetLength(int dimension)
  854. {
  855. if ((dimension == 0) || (dimension == 1) || (dimension == 2))
  856. return array.GetLength(dimension);
  857. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  858. }
  859. public override object GetArray() { return array; }
  860. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  861. {
  862. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
  863. throw new CodeEE("三次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  864. if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
  865. throw new CodeEE("三次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
  866. if (doCheck[2] && ((arguments[2] < 0) || (arguments[2] >= array.GetLength(2))))
  867. throw new CodeEE("三次元配列" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
  868. }
  869. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  870. {
  871. CheckElement(arguments);
  872. if ((index1 < 0) || (index1 > array.GetLength(2)))
  873. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  874. if ((index2 < 0) || (index2 > array.GetLength(2)))
  875. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  876. }
  877. }
  878. private sealed class CharaIntVariableToken : CharaVariableToken
  879. {
  880. public CharaIntVariableToken(VariableCode varCode, VariableData varData)
  881. : base(varCode, varData)
  882. {
  883. CanRestructure = false;
  884. }
  885. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  886. {
  887. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  888. return chara.DataInteger[VarCodeInt];
  889. }
  890. public override void SetValue(Int64 value, Int64[] arguments)
  891. {
  892. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  893. chara.DataInteger[VarCodeInt] = value;
  894. }
  895. public override void SetValueAll(long value, int start, int end, int charaPos)
  896. {
  897. varData.CharacterList[charaPos].setValueAll(VarCodeInt, value);
  898. //CharacterData chara = varData.CharacterList[charaPos];
  899. //chara.DataInteger[VarCodeInt] = value;
  900. }
  901. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  902. {
  903. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  904. chara.DataInteger[VarCodeInt] += value;
  905. return chara.DataInteger[VarCodeInt];
  906. }
  907. }
  908. private sealed class CharaInt1DVariableToken : CharaVariableToken
  909. {
  910. public CharaInt1DVariableToken(VariableCode varCode, VariableData varData)
  911. : base(varCode, varData)
  912. {
  913. CanRestructure = false;
  914. }
  915. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  916. {
  917. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  918. return chara.DataIntegerArray[VarCodeInt][arguments[1]];
  919. }
  920. public override void SetValue(Int64 value, Int64[] arguments)
  921. {
  922. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  923. chara.DataIntegerArray[VarCodeInt][arguments[1]] = value;
  924. }
  925. public override void SetValue(Int64[] values, Int64[] arguments)
  926. {
  927. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  928. Int64[] array = chara.DataIntegerArray[VarCodeInt];
  929. int start = (int)arguments[1];
  930. int end = start + values.Length;
  931. for (int i = start; i < end; i++)
  932. array[i] = values[i - start];
  933. }
  934. public override void SetValueAll(long value, int start, int end, int charaPos)
  935. {
  936. varData.CharacterList[charaPos].setValueAll1D(VarCodeInt, value, start, end);
  937. //CharacterData chara = varData.CharacterList[charaPos];
  938. //Int64[] array = chara.DataIntegerArray[VarCodeInt];
  939. //for (int i = start; i < end; i++)
  940. // array[i] = value;
  941. }
  942. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  943. {
  944. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  945. chara.DataIntegerArray[VarCodeInt][arguments[1]] += value;
  946. return chara.DataIntegerArray[VarCodeInt][arguments[1]];
  947. }
  948. public override object GetArrayChara(int charano)
  949. {
  950. CharacterData chara = varData.CharacterList[charano];
  951. return chara.DataIntegerArray[VarCodeInt];
  952. }
  953. }
  954. private sealed class CharaStrVariableToken : CharaVariableToken
  955. {
  956. public CharaStrVariableToken(VariableCode varCode, VariableData varData)
  957. : base(varCode, varData)
  958. {
  959. CanRestructure = false;
  960. }
  961. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  962. {
  963. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  964. return chara.DataString[VarCodeInt];
  965. }
  966. public override void SetValue(string value, Int64[] arguments)
  967. {
  968. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  969. chara.DataString[VarCodeInt] = value;
  970. }
  971. public override void SetValueAll(string value, int start, int end, int charaPos)
  972. {
  973. varData.CharacterList[charaPos].setValueAll(VarCodeInt, value);
  974. //CharacterData chara = varData.CharacterList[charaPos];
  975. //chara.DataString[VarCodeInt] = value;
  976. }
  977. }
  978. private sealed class CharaStr1DVariableToken : CharaVariableToken
  979. {
  980. public CharaStr1DVariableToken(VariableCode varCode, VariableData varData)
  981. : base(varCode, varData)
  982. {
  983. CanRestructure = false;
  984. }
  985. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  986. {
  987. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  988. return chara.DataStringArray[VarCodeInt][arguments[1]];
  989. }
  990. public override void SetValue(string value, Int64[] arguments)
  991. {
  992. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  993. chara.DataStringArray[VarCodeInt][arguments[1]] = value;
  994. }
  995. public override void SetValue(string[] values, Int64[] arguments)
  996. {
  997. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  998. string[] array = chara.DataStringArray[VarCodeInt];
  999. int start = (int)arguments[1];
  1000. int end = start + values.Length;
  1001. for (int i = start; i < end; i++)
  1002. array[i] = values[i - start];
  1003. }
  1004. public override void SetValueAll(string value, int start, int end, int charaPos)
  1005. {
  1006. varData.CharacterList[charaPos].setValueAll1D(VarCodeInt, value, start, end);
  1007. //CharacterData chara = varData.CharacterList[charaPos];
  1008. //String[] array = chara.DataStringArray[VarCodeInt];
  1009. //for (int i = start; i < end; i++)
  1010. // array[i] = value;
  1011. }
  1012. public override object GetArrayChara(int charano)
  1013. {
  1014. CharacterData chara = varData.CharacterList[charano];
  1015. return chara.DataStringArray[VarCodeInt];
  1016. }
  1017. }
  1018. private sealed class CharaInt2DVariableToken : CharaVariableToken
  1019. {
  1020. public CharaInt2DVariableToken(VariableCode varCode, VariableData varData)
  1021. : base(varCode, varData)
  1022. {
  1023. CanRestructure = false;
  1024. }
  1025. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1026. {
  1027. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1028. return chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]];
  1029. }
  1030. public override void SetValue(Int64 value, Int64[] arguments)
  1031. {
  1032. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1033. chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]] = value;
  1034. }
  1035. public override void SetValue(Int64[] values, Int64[] arguments)
  1036. {
  1037. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1038. Int64[,] array = chara.DataIntegerArray2D[VarCodeInt];
  1039. int start = (int)arguments[2];
  1040. int end = start + values.Length;
  1041. int index1 = (int)arguments[1];
  1042. for (int i = start; i < end; i++)
  1043. array[index1, i] = values[i - start];
  1044. }
  1045. public override void SetValueAll(long value, int start, int end, int charaPos)
  1046. {
  1047. varData.characterList[charaPos].setValueAll2D(VarCodeInt, value);
  1048. //CharacterData chara = varData.CharacterList[charaPos];
  1049. //Int64[,] array = chara.DataIntegerArray2D[VarCodeInt];
  1050. //int a1 = array.GetLength(0);
  1051. //int a2 = array.GetLength(1);
  1052. //for (int i = 0; i < a1; i++)
  1053. // for (int j = 0; j < a2; j++)
  1054. // array[i, j] = value;
  1055. }
  1056. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1057. {
  1058. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1059. chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]] += value;
  1060. return chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]];
  1061. }
  1062. public override object GetArrayChara(int charano)
  1063. {
  1064. CharacterData chara = varData.CharacterList[charano];
  1065. return chara.DataIntegerArray2D[VarCodeInt];
  1066. }
  1067. }
  1068. private sealed class CharaStr2DVariableToken : CharaVariableToken
  1069. {
  1070. public CharaStr2DVariableToken(VariableCode varCode, VariableData varData)
  1071. : base(varCode, varData)
  1072. {
  1073. CanRestructure = false;
  1074. }
  1075. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1076. {
  1077. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1078. return chara.DataStringArray2D[VarCodeInt][arguments[1], arguments[2]];
  1079. }
  1080. public override void SetValue(string value, Int64[] arguments)
  1081. {
  1082. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1083. chara.DataStringArray2D[VarCodeInt][arguments[1], arguments[2]] = value;
  1084. }
  1085. public override void SetValue(string[] values, Int64[] arguments)
  1086. {
  1087. CharacterData chara = varData.CharacterList[(int)arguments[0]];
  1088. string[,] array = chara.DataStringArray2D[VarCodeInt];
  1089. int start = (int)arguments[2];
  1090. int end = start + values.Length;
  1091. int index1 = (int)arguments[1];
  1092. for (int i = start; i < end; i++)
  1093. array[index1, i] = values[i - start];
  1094. }
  1095. public override void SetValueAll(string value, int start, int end, int charaPos)
  1096. {
  1097. varData.characterList[charaPos].setValueAll2D(VarCodeInt, value);
  1098. //CharacterData chara = varData.CharacterList[charaPos];
  1099. //String[,] array = chara.DataStringArray2D[VarCodeInt];
  1100. //int a1 = array.GetLength(0);
  1101. //int a2 = array.GetLength(1);
  1102. //for (int i = 0; i < a1; i++)
  1103. // for (int j = 0; j < a2; j++)
  1104. // array[i, j] = value;
  1105. }
  1106. public override object GetArrayChara(int charano)
  1107. {
  1108. CharacterData chara = varData.CharacterList[charano];
  1109. return chara.DataStringArray2D[VarCodeInt];
  1110. }
  1111. }
  1112. #endregion
  1113. #region 定数
  1114. private abstract class ConstantToken : VariableToken
  1115. {
  1116. public ConstantToken(VariableCode varCode, VariableData varData)
  1117. : base(varCode, varData)
  1118. {
  1119. CanRestructure = true;
  1120. }
  1121. public override void SetValue(Int64 value, Int64[] arguments)
  1122. { throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
  1123. public override void SetValue(string value, Int64[] arguments)
  1124. { throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
  1125. public override void SetValue(Int64[] values, Int64[] arguments)
  1126. { throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
  1127. public override void SetValue(string[] values, Int64[] arguments)
  1128. { throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
  1129. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1130. { throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
  1131. }
  1132. private sealed class IntConstantToken : ConstantToken
  1133. {
  1134. public IntConstantToken(VariableCode varCode, VariableData varData, Int64 i)
  1135. : base(varCode, varData)
  1136. {
  1137. this.i = i;
  1138. }
  1139. Int64 i;
  1140. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1141. {
  1142. return i;
  1143. }
  1144. }
  1145. private sealed class StrConstantToken : ConstantToken
  1146. {
  1147. public StrConstantToken(VariableCode varCode, VariableData varData, string s)
  1148. : base(varCode, varData)
  1149. {
  1150. this.s = s;
  1151. }
  1152. string s;
  1153. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1154. {
  1155. return s;
  1156. }
  1157. }
  1158. private sealed class Int1DConstantToken : ConstantToken
  1159. {
  1160. public Int1DConstantToken(VariableCode varCode, VariableData varData, Int64[] array)
  1161. : base(varCode, varData)
  1162. {
  1163. this.array = array;
  1164. IsForbid = array.Length == 0;
  1165. }
  1166. Int64[] array;
  1167. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1168. {
  1169. return array[arguments[0]];
  1170. }
  1171. public override Int32 GetLength()
  1172. { return array.Length; }
  1173. public override Int32 GetLength(int dimension)
  1174. {
  1175. if (dimension == 0)
  1176. return array.Length;
  1177. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  1178. }
  1179. public override object GetArray() { return array; }
  1180. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  1181. {
  1182. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
  1183. throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  1184. }
  1185. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  1186. {
  1187. CheckElement(arguments);
  1188. if ((index1 < 0) || (index1 > array.Length))
  1189. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  1190. if ((index2 < 0) || (index2 > array.Length))
  1191. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  1192. }
  1193. }
  1194. private sealed class Str1DConstantToken : ConstantToken
  1195. {
  1196. string name;
  1197. public Str1DConstantToken(VariableCode varCode, VariableData varData, string[] array)
  1198. : base(varCode, varData)
  1199. {
  1200. this.array = array;
  1201. IsForbid = array.Length == 0;
  1202. name = "Base";
  1203. }
  1204. public Str1DConstantToken(VariableCode varCode, VariableData varData, string pname)
  1205. : base(varCode, varData)
  1206. {
  1207. name = pname;
  1208. array = varData.constant.GetCsvNameList(varCode);
  1209. IsForbid = array.Length == 0;
  1210. }
  1211. string[] array;
  1212. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1213. {
  1214. //Changes by Bartoum
  1215. //This is where the _TR files translate. They can only translate stuff that is on a print line
  1216. //Exemple PRINTFORM [%TALENTNAME:X%]
  1217. return Translation.translate(array[arguments[0]], name, translate);
  1218. }
  1219. public override Int32 GetLength()
  1220. { return array.Length; }
  1221. public override Int32 GetLength(int dimension)
  1222. {
  1223. if (dimension == 0)
  1224. return array.Length;
  1225. throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
  1226. }
  1227. public override object GetArray() { return array; }
  1228. public override void CheckElement(Int64[] arguments, bool[] doCheck)
  1229. {
  1230. if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
  1231. throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
  1232. }
  1233. public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
  1234. {
  1235. CheckElement(arguments);
  1236. if ((index1 < 0) || (index1 > array.Length))
  1237. throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
  1238. if ((index2 < 0) || (index2 > array.Length))
  1239. throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
  1240. }
  1241. }
  1242. #endregion
  1243. #region 特殊処理
  1244. private abstract class PseudoVariableToken : VariableToken
  1245. {
  1246. protected PseudoVariableToken(VariableCode varCode, VariableData varData)
  1247. : base(varCode, varData)
  1248. {
  1249. CanRestructure = false;
  1250. }
  1251. public override void SetValue(Int64 value, Int64[] arguments)
  1252. { throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
  1253. public override void SetValue(string value, Int64[] arguments)
  1254. { throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
  1255. public override void SetValue(Int64[] values, Int64[] arguments)
  1256. { throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
  1257. public override void SetValue(string[] values, Int64[] arguments)
  1258. { throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
  1259. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1260. { throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
  1261. public override Int32 GetLength()
  1262. { throw new CodeEE("擬似変数" + varName + "の長さを取得しようとしました"); }
  1263. public override Int32 GetLength(int dimension)
  1264. { throw new CodeEE("擬似変数" + varName + "の長さを取得しようとしました"); }
  1265. public override object GetArray()
  1266. { throw new CodeEE("擬似変数" + varName + "の配列を取得しようとしました"); }
  1267. }
  1268. private sealed class RandToken : PseudoVariableToken
  1269. {
  1270. public RandToken(VariableCode varCode, VariableData varData)
  1271. : base(varCode, varData)
  1272. {
  1273. }
  1274. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1275. {
  1276. Int64 i = arguments[0];
  1277. if (i <= 0)
  1278. throw new CodeEE("RANDの引数に0以下の値(" + i + ")が指定されました");
  1279. return exm.VEvaluator.GetNextRand(i);
  1280. }
  1281. }
  1282. private sealed class CompatiRandToken : PseudoVariableToken
  1283. {
  1284. public CompatiRandToken(VariableCode varCode, VariableData varData)
  1285. : base(varCode, varData)
  1286. {
  1287. }
  1288. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1289. {
  1290. Int64 i = arguments[0];
  1291. if (i == 0)
  1292. return 0L;
  1293. if (i < 0)
  1294. i = -i;
  1295. return exm.VEvaluator.GetNextRand(32768) % i;//0-32767の乱数を引数で除算した余り
  1296. }
  1297. }
  1298. private sealed class CHARANUM_Token : PseudoVariableToken
  1299. {
  1300. public CHARANUM_Token(VariableCode varCode, VariableData varData)
  1301. : base(varCode, varData)
  1302. {
  1303. }
  1304. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1305. {
  1306. return varData.CharacterList.Count;
  1307. }
  1308. }
  1309. private sealed class LASTLOAD_TEXT_Token : PseudoVariableToken
  1310. {
  1311. public LASTLOAD_TEXT_Token(VariableCode varCode, VariableData varData)
  1312. : base(varCode, varData)
  1313. {
  1314. }
  1315. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1316. {
  1317. return varData.LastLoadText;
  1318. }
  1319. }
  1320. private sealed class LASTLOAD_VERSION_Token : PseudoVariableToken
  1321. {
  1322. public LASTLOAD_VERSION_Token(VariableCode varCode, VariableData varData)
  1323. : base(varCode, varData)
  1324. {
  1325. }
  1326. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1327. {
  1328. return varData.LastLoadVersion;
  1329. }
  1330. }
  1331. private sealed class LASTLOAD_NO_Token : PseudoVariableToken
  1332. {
  1333. public LASTLOAD_NO_Token(VariableCode varCode, VariableData varData)
  1334. : base(varCode, varData)
  1335. {
  1336. }
  1337. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1338. {
  1339. return varData.LastLoadNo;
  1340. }
  1341. }
  1342. private sealed class LINECOUNT_Token : PseudoVariableToken
  1343. {
  1344. public LINECOUNT_Token(VariableCode varCode, VariableData varData)
  1345. : base(varCode, varData)
  1346. {
  1347. }
  1348. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1349. {
  1350. return exm.Console.LineCount;
  1351. }
  1352. }
  1353. private sealed class WINDOW_TITLE_Token : VariableToken
  1354. {
  1355. public WINDOW_TITLE_Token(VariableCode varCode, VariableData varData)
  1356. : base(varCode, varData)
  1357. {
  1358. CanRestructure = false;
  1359. }
  1360. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1361. {
  1362. return GlobalStatic.Console.GetWindowTitle();
  1363. }
  1364. public override void SetValue(string value, Int64[] arguments)
  1365. {
  1366. GlobalStatic.Console.SetWindowTitle(value);
  1367. }
  1368. }
  1369. private sealed class MONEYLABEL_Token : VariableToken
  1370. {
  1371. public MONEYLABEL_Token(VariableCode varCode, VariableData varData)
  1372. : base(varCode, varData)
  1373. {
  1374. CanRestructure = true;
  1375. }
  1376. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1377. {
  1378. return Config.Config.MoneyLabel;
  1379. }
  1380. }
  1381. private sealed class DRAWLINESTR_Token : VariableToken
  1382. {
  1383. public DRAWLINESTR_Token(VariableCode varCode, VariableData varData)
  1384. : base(varCode, varData)
  1385. {
  1386. CanRestructure = true;
  1387. }
  1388. public override string GetStrValue(ExpressionMediator exm, long[] arguments, bool translate=false)
  1389. {
  1390. return exm.Console.getDefStBar();
  1391. }
  1392. }
  1393. private sealed class EmptyStrToken : PseudoVariableToken
  1394. {
  1395. public EmptyStrToken(VariableCode varCode, VariableData varData)
  1396. : base(varCode, varData)
  1397. {
  1398. CanRestructure = true;
  1399. }
  1400. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1401. {
  1402. return "";
  1403. }
  1404. }
  1405. private sealed class EmptyIntToken : PseudoVariableToken
  1406. {
  1407. public EmptyIntToken(VariableCode varCode, VariableData varData)
  1408. : base(varCode, varData)
  1409. {
  1410. CanRestructure = true;
  1411. }
  1412. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1413. {
  1414. return 0L;
  1415. }
  1416. }
  1417. private sealed class Debug__FILE__Token : PseudoVariableToken
  1418. {
  1419. public Debug__FILE__Token(VariableCode varCode, VariableData varData)
  1420. : base(varCode, varData)
  1421. {
  1422. CanRestructure = true;
  1423. }
  1424. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1425. {
  1426. LogicalLine line = exm.Process.GetScaningLine();
  1427. if ((line == null) || (line.Position == null))
  1428. return "";
  1429. return line.Position.Filename;
  1430. }
  1431. }
  1432. private sealed class Debug__FUNCTION__Token : PseudoVariableToken
  1433. {
  1434. public Debug__FUNCTION__Token(VariableCode varCode, VariableData varData)
  1435. : base(varCode, varData)
  1436. {
  1437. CanRestructure = true;
  1438. }
  1439. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1440. {
  1441. LogicalLine line = exm.Process.GetScaningLine();
  1442. if ((line == null) || (line.ParentLabelLine == null))
  1443. return "";//システム待機中のデバッグモードから呼び出し
  1444. return line.ParentLabelLine.LabelName;
  1445. }
  1446. }
  1447. private sealed class Debug__LINE__Token : PseudoVariableToken
  1448. {
  1449. public Debug__LINE__Token(VariableCode varCode, VariableData varData)
  1450. : base(varCode, varData)
  1451. {
  1452. CanRestructure = true;
  1453. }
  1454. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1455. {
  1456. LogicalLine line = exm.Process.GetScaningLine();
  1457. if ((line == null) || (line.Position == null))
  1458. return -1L;
  1459. return line.Position.LineNo;
  1460. }
  1461. }
  1462. private sealed class ISTIMEOUTToken : PseudoVariableToken
  1463. {
  1464. public ISTIMEOUTToken(VariableCode varCode, VariableData varData)
  1465. : base(varCode, varData)
  1466. {
  1467. CanRestructure = false;
  1468. }
  1469. public override long GetIntValue(ExpressionMediator exm, long[] arguments)
  1470. {
  1471. return Convert.ToInt64(GlobalStatic.Console.IsTimeOut);
  1472. }
  1473. }
  1474. private sealed class __INT_MAX__Token : PseudoVariableToken
  1475. {
  1476. public __INT_MAX__Token(VariableCode varCode, VariableData varData)
  1477. : base(varCode, varData)
  1478. {
  1479. CanRestructure = true;
  1480. }
  1481. public override long GetIntValue(ExpressionMediator exm, long[] arguments)
  1482. {
  1483. return Int64.MaxValue;
  1484. }
  1485. }
  1486. private sealed class __INT_MIN__Token : PseudoVariableToken
  1487. {
  1488. public __INT_MIN__Token(VariableCode varCode, VariableData varData)
  1489. : base(varCode, varData)
  1490. {
  1491. CanRestructure = true;
  1492. }
  1493. public override long GetIntValue(ExpressionMediator exm, long[] arguments)
  1494. {
  1495. return Int64.MinValue;
  1496. }
  1497. }
  1498. private sealed class EMUERA_VERSIONToken : PseudoVariableToken
  1499. {
  1500. public EMUERA_VERSIONToken(VariableCode varCode, VariableData varData)
  1501. :base(varCode, varData)
  1502. {
  1503. CanRestructure = true;
  1504. }
  1505. public override string GetStrValue(ExpressionMediator exm, long[] arguments, bool translate=false)
  1506. {
  1507. return GlobalStatic.MainWindow.InternalEmueraVer;
  1508. }
  1509. }
  1510. #endregion
  1511. #region LOCAL
  1512. private sealed class LocalInt1DVariableToken : LocalVariableToken
  1513. {
  1514. public LocalInt1DVariableToken(VariableCode varCode, VariableData varData, string subId, int size)
  1515. : base(varCode, varData, subId, size)
  1516. {
  1517. }
  1518. Int64[] array;
  1519. public override void SetDefault()
  1520. {
  1521. if (array != null)
  1522. Array.Clear(array, 0, size);
  1523. }
  1524. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1525. {
  1526. if (array == null)
  1527. array = new Int64[size];
  1528. return array[arguments[0]];
  1529. }
  1530. public override void SetValue(Int64 value, Int64[] arguments)
  1531. {
  1532. if (array == null)
  1533. array = new Int64[size];
  1534. array[arguments[0]] = value;
  1535. }
  1536. public override void SetValue(Int64[] values, Int64[] arguments)
  1537. {
  1538. if (array == null)
  1539. array = new Int64[size];
  1540. int start = (int)arguments[0];
  1541. int end = start + values.Length;
  1542. for (int i = start; i < end; i++)
  1543. array[i] = values[i - start];
  1544. }
  1545. public override void SetValueAll(long value, int start, int end, int charaPos)
  1546. {
  1547. if (array == null)
  1548. array = new Int64[size];
  1549. for (int i = start; i < end; i++)
  1550. array[i] = value;
  1551. }
  1552. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1553. {
  1554. if (array == null)
  1555. array = new Int64[size];
  1556. array[arguments[0]] += value;
  1557. return array[arguments[0]];
  1558. }
  1559. public override object GetArray()
  1560. {
  1561. if (array == null)
  1562. array = new Int64[size];
  1563. return array;
  1564. }
  1565. public override void resize(int newSize)
  1566. {
  1567. size = newSize;
  1568. array = null;
  1569. }
  1570. }
  1571. //Bartoum: this is where ARGS and LOCALS are
  1572. private sealed class LocalStr1DVariableToken : LocalVariableToken
  1573. {
  1574. public LocalStr1DVariableToken(VariableCode varCode, VariableData varData, string subId, int size)
  1575. : base(varCode, varData, subId, size)
  1576. {
  1577. }
  1578. string[] array;
  1579. public override void SetDefault()
  1580. {
  1581. if (array != null)
  1582. Array.Clear(array, 0, size);
  1583. }
  1584. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1585. {
  1586. if (array == null)
  1587. array = new string[size];
  1588. return array[arguments[0]];
  1589. }
  1590. public override void SetValue(string value, Int64[] arguments)
  1591. {
  1592. if (array == null)
  1593. array = new string[size];
  1594. array[arguments[0]] = value;
  1595. }
  1596. public override void SetValue(string[] values, Int64[] arguments)
  1597. {
  1598. if (array == null)
  1599. array = new string[size];
  1600. int start = (int)arguments[0];
  1601. int end = start + values.Length;
  1602. for (int i = start; i < end; i++)
  1603. array[i] = values[i - start];
  1604. }
  1605. public override void SetValueAll(string value, int start, int end, int charaPos)
  1606. {
  1607. if (array == null)
  1608. array = new string[size];
  1609. for (int i = start; i < end; i++)
  1610. array[i] = value;
  1611. }
  1612. public override object GetArray()
  1613. {
  1614. if (array == null)
  1615. array = new string[size];
  1616. return array;
  1617. }
  1618. public override void resize(int newSize)
  1619. {
  1620. size = newSize;
  1621. array = null;
  1622. }
  1623. }
  1624. #endregion
  1625. #region userdef
  1626. //1808beta009 廃止 private static と統合
  1627. //private sealed class UserDefinedInt1DVariableToken : UserDefinedVariableToken
  1628. #region static (広域変数とprivate static の両方を含む)
  1629. private sealed class StaticInt1DVariableToken : UserDefinedVariableToken
  1630. {
  1631. public StaticInt1DVariableToken(UserDefinedVariableData data)
  1632. : base(VariableCode.VAR, data)
  1633. {
  1634. int[] sizes = data.Lengths;
  1635. IsStatic = true;
  1636. array = new Int64[sizes[0]];
  1637. defArray = data.DefaultInt;
  1638. if (defArray != null)
  1639. Array.Copy(defArray, array, defArray.Length);
  1640. }
  1641. Int64[] array;
  1642. Int64[] defArray;
  1643. public override void SetDefault()
  1644. {
  1645. Array.Clear(array, 0, totalSize);
  1646. if (defArray != null)
  1647. Array.Copy(defArray, array, defArray.Length);
  1648. }
  1649. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1650. {
  1651. return array[arguments[0]];
  1652. }
  1653. public override void SetValue(Int64 value, Int64[] arguments)
  1654. {
  1655. array[arguments[0]] = value;
  1656. }
  1657. public override void SetValue(Int64[] values, Int64[] arguments)
  1658. {
  1659. int start = (int)arguments[0];
  1660. int end = start + values.Length;
  1661. for (int i = start; i < end; i++)
  1662. array[i] = values[i - start];
  1663. }
  1664. public override void SetValueAll(long value, int start, int end, int charaPos)
  1665. {
  1666. for (int i = start; i < end; i++)
  1667. array[i] = value;
  1668. }
  1669. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1670. {
  1671. array[arguments[0]] += value;
  1672. return array[arguments[0]];
  1673. }
  1674. public override object GetArray() { return array; }
  1675. public override void In() { }
  1676. public override void Out() { }
  1677. }
  1678. private sealed class StaticInt2DVariableToken : UserDefinedVariableToken
  1679. {
  1680. public StaticInt2DVariableToken(UserDefinedVariableData data)
  1681. : base(VariableCode.VAR2D, data)
  1682. {
  1683. int[] sizes = data.Lengths;
  1684. IsStatic = true;
  1685. array = new Int64[sizes[0], sizes[1]];
  1686. }
  1687. Int64[,] array;
  1688. public override void SetDefault()
  1689. {
  1690. Array.Clear(array, 0, totalSize);
  1691. }
  1692. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1693. {
  1694. return array[arguments[0], arguments[1]];
  1695. }
  1696. public override void SetValue(Int64 value, Int64[] arguments)
  1697. {
  1698. array[arguments[0], arguments[1]] = value;
  1699. }
  1700. public override void SetValue(Int64[] values, Int64[] arguments)
  1701. {
  1702. int start = (int)arguments[1];
  1703. int end = start + values.Length;
  1704. for (int i = start; i < end; i++)
  1705. array[arguments[0], i] = values[i - start];
  1706. }
  1707. public override void SetValueAll(long value, int start, int end, int charaPos)
  1708. {
  1709. int a1 = array.GetLength(0);
  1710. int a2 = array.GetLength(1);
  1711. for (int i = 0; i < a1; i++)
  1712. for (int j = 0; j < a2; j++)
  1713. array[i, j] = value;
  1714. }
  1715. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1716. {
  1717. array[arguments[0], arguments[1]] += value;
  1718. return array[arguments[0], arguments[1]];
  1719. }
  1720. public override object GetArray() { return array; }
  1721. public override void In() { }
  1722. public override void Out() { }
  1723. }
  1724. private sealed class StaticInt3DVariableToken : UserDefinedVariableToken
  1725. {
  1726. public StaticInt3DVariableToken(UserDefinedVariableData data)
  1727. : base(VariableCode.VAR3D, data)
  1728. {
  1729. int[] sizes = data.Lengths;
  1730. IsStatic = true;
  1731. array = new Int64[sizes[0], sizes[1], sizes[2]];
  1732. }
  1733. Int64[, ,] array;
  1734. public override void SetDefault()
  1735. {
  1736. Array.Clear(array, 0, totalSize);
  1737. }
  1738. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1739. {
  1740. return array[arguments[0], arguments[1], arguments[2]];
  1741. }
  1742. public override void SetValue(Int64 value, Int64[] arguments)
  1743. {
  1744. array[arguments[0], arguments[1], arguments[2]] = value;
  1745. }
  1746. public override void SetValue(Int64[] values, Int64[] arguments)
  1747. {
  1748. int start = (int)arguments[2];
  1749. int end = start + values.Length;
  1750. for (int i = start; i < end; i++)
  1751. array[arguments[0], arguments[1], i] = values[i - start];
  1752. }
  1753. public override void SetValueAll(long value, int start, int end, int charaPos)
  1754. {
  1755. int a1 = array.GetLength(0);
  1756. int a2 = array.GetLength(1);
  1757. int a3 = array.GetLength(2);
  1758. for (int i = 0; i < a1; i++)
  1759. for (int j = 0; j < a2; j++)
  1760. for (int k = 0; k < a3; k++)
  1761. array[i, j, k] = value;
  1762. }
  1763. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1764. {
  1765. array[arguments[0], arguments[1], arguments[2]] += value;
  1766. return array[arguments[0], arguments[1], arguments[2]];
  1767. }
  1768. public override object GetArray() { return array; }
  1769. public override void In() { }
  1770. public override void Out() { }
  1771. }
  1772. //Bartoum: this is where user string variables are
  1773. private sealed class StaticStr1DVariableToken : UserDefinedVariableToken
  1774. {
  1775. public StaticStr1DVariableToken(UserDefinedVariableData data)
  1776. : base(VariableCode.VARS, data)
  1777. {
  1778. int[] sizes = data.Lengths;
  1779. IsStatic = true;
  1780. array = new string[sizes[0]];
  1781. defArray = data.DefaultStr;
  1782. if (defArray != null)
  1783. Array.Copy(defArray, array, defArray.Length);
  1784. }
  1785. string[] array;
  1786. string[] defArray;
  1787. public override void SetDefault()
  1788. {
  1789. Array.Clear(array, 0, totalSize);
  1790. if (defArray != null)
  1791. Array.Copy(defArray, array, defArray.Length);
  1792. }
  1793. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1794. {
  1795. return array[arguments[0]];
  1796. }
  1797. public override void SetValue(string value, Int64[] arguments)
  1798. {
  1799. array[arguments[0]] = value;
  1800. }
  1801. public override void SetValue(string[] values, Int64[] arguments)
  1802. {
  1803. int start = (int)arguments[0];
  1804. int end = start + values.Length;
  1805. for (int i = start; i < end; i++)
  1806. array[i] = values[i - start];
  1807. }
  1808. public override void SetValueAll(string value, int start, int end, int charaPos)
  1809. {
  1810. for (int i = start; i < end; i++)
  1811. array[i] = value;
  1812. }
  1813. public override object GetArray() { return array; }
  1814. public override void In() { }
  1815. public override void Out() { }
  1816. }
  1817. private sealed class StaticStr2DVariableToken : UserDefinedVariableToken
  1818. {
  1819. public StaticStr2DVariableToken(UserDefinedVariableData data)
  1820. : base(VariableCode.VARS2D, data)
  1821. {
  1822. int[] sizes = data.Lengths;
  1823. IsStatic = true;
  1824. array = new string[sizes[0], sizes[1]];
  1825. }
  1826. string[,] array;
  1827. public override void SetDefault()
  1828. {
  1829. Array.Clear(array, 0, totalSize);
  1830. }
  1831. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1832. {
  1833. return array[arguments[0], arguments[1]];
  1834. }
  1835. public override void SetValue(string value, Int64[] arguments)
  1836. {
  1837. array[arguments[0], arguments[1]] = value;
  1838. }
  1839. public override void SetValue(string[] values, Int64[] arguments)
  1840. {
  1841. int start = (int)arguments[1];
  1842. int end = start + values.Length;
  1843. for (int i = start; i < end; i++)
  1844. array[arguments[0], i] = values[i - start];
  1845. }
  1846. public override void SetValueAll(string value, int start, int end, int charaPos)
  1847. {
  1848. int a1 = array.GetLength(0);
  1849. int a2 = array.GetLength(1);
  1850. for (int i = 0; i < a1; i++)
  1851. for (int j = 0; j < a2; j++)
  1852. array[i, j] = value;
  1853. }
  1854. public override object GetArray() { return array; }
  1855. public override void In() { }
  1856. public override void Out() { }
  1857. }
  1858. private sealed class StaticStr3DVariableToken : UserDefinedVariableToken
  1859. {
  1860. public StaticStr3DVariableToken(UserDefinedVariableData data)
  1861. : base(VariableCode.VARS3D, data)
  1862. {
  1863. int[] sizes = data.Lengths;
  1864. IsStatic = true;
  1865. array = new string[sizes[0], sizes[1], sizes[2]];
  1866. }
  1867. string[, ,] array;
  1868. public override void SetDefault()
  1869. {
  1870. Array.Clear(array, 0, totalSize);
  1871. }
  1872. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  1873. {
  1874. return array[arguments[0], arguments[1], arguments[2]];
  1875. }
  1876. public override void SetValue(string value, Int64[] arguments)
  1877. {
  1878. array[arguments[0], arguments[1], arguments[2]] = value;
  1879. }
  1880. public override void SetValue(string[] values, Int64[] arguments)
  1881. {
  1882. int start = (int)arguments[2];
  1883. int end = start + values.Length;
  1884. for (int i = start; i < end; i++)
  1885. array[arguments[0], arguments[1], i] = values[i - start];
  1886. }
  1887. public override void SetValueAll(string value, int start, int end, int charaPos)
  1888. {
  1889. int a1 = array.GetLength(0);
  1890. int a2 = array.GetLength(1);
  1891. int a3 = array.GetLength(2);
  1892. for (int i = 0; i < a1; i++)
  1893. for (int j = 0; j < a2; j++)
  1894. for (int k = 0; k < a3; k++)
  1895. array[i, j, k] = value;
  1896. }
  1897. public override object GetArray() { return array; }
  1898. public override void In() { }
  1899. public override void Out() { }
  1900. }
  1901. #endregion
  1902. #region private dynamic
  1903. private sealed class PrivateInt1DVariableToken : UserDefinedVariableToken
  1904. {
  1905. public PrivateInt1DVariableToken(UserDefinedVariableData data)
  1906. : base(VariableCode.VAR, data)
  1907. {
  1908. int[] sizes = data.Lengths;
  1909. IsStatic = false;
  1910. arrayList = new List<Int64[]>();
  1911. defArray = data.DefaultInt;
  1912. }
  1913. readonly List<Int64[]> arrayList;
  1914. Int64[] array;
  1915. Int64[] defArray;
  1916. //int counter = 0;
  1917. public override void SetDefault()
  1918. {
  1919. }
  1920. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1921. {
  1922. return array[arguments[0]];
  1923. }
  1924. public override void SetValue(Int64 value, Int64[] arguments)
  1925. {
  1926. array[arguments[0]] = value;
  1927. }
  1928. public override void SetValue(Int64[] values, Int64[] arguments)
  1929. {
  1930. int start = (int)arguments[0];
  1931. int end = start + values.Length;
  1932. for (int i = start; i < end; i++)
  1933. array[i] = values[i - start];
  1934. }
  1935. public override void SetValueAll(long value, int start, int end, int charaPos)
  1936. {
  1937. for (int i = start; i < end; i++)
  1938. array[i] = value;
  1939. }
  1940. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  1941. {
  1942. array[arguments[0]] += value;
  1943. return array[arguments[0]];
  1944. }
  1945. public override object GetArray() { return array; }
  1946. public override void In()
  1947. {
  1948. if (array != null)
  1949. arrayList.Add(array);
  1950. //counter++;
  1951. array = new Int64[sizes[0]];
  1952. if (defArray != null)
  1953. Array.Copy(defArray, array, defArray.Length);
  1954. }
  1955. public override void Out()
  1956. {
  1957. //counter--;
  1958. //arrayList.RemoveAt(arrayList.Count - 1);
  1959. if (arrayList.Count > 0)
  1960. {
  1961. array = arrayList[arrayList.Count - 1];
  1962. arrayList.RemoveAt(arrayList.Count - 1);
  1963. }
  1964. else
  1965. array = null;
  1966. }
  1967. }
  1968. private sealed class PrivateInt2DVariableToken : UserDefinedVariableToken
  1969. {
  1970. public PrivateInt2DVariableToken(UserDefinedVariableData data)
  1971. : base(VariableCode.VAR2D, data)
  1972. {
  1973. int[] sizes = data.Lengths;
  1974. IsStatic = false;
  1975. arrayList = new List<Int64[,]>();
  1976. }
  1977. readonly List<Int64[,]> arrayList;
  1978. Int64[,] array;
  1979. //int counter = 0;
  1980. public override void SetDefault() { }
  1981. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  1982. {
  1983. return array[arguments[0], arguments[1]];
  1984. }
  1985. public override void SetValue(Int64 value, Int64[] arguments)
  1986. {
  1987. array[arguments[0], arguments[1]] = value;
  1988. }
  1989. public override void SetValue(Int64[] values, Int64[] arguments)
  1990. {
  1991. int start = (int)arguments[1];
  1992. int end = start + values.Length;
  1993. for (int i = start; i < end; i++)
  1994. array[arguments[0], i] = values[i - start];
  1995. }
  1996. public override void SetValueAll(long value, int start, int end, int charaPos)
  1997. {
  1998. int a1 = array.GetLength(0);
  1999. int a2 = array.GetLength(1);
  2000. for (int i = 0; i < a1; i++)
  2001. for (int j = 0; j < a2; j++)
  2002. array[i, j] = value;
  2003. }
  2004. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2005. {
  2006. array[arguments[0], arguments[1]] += value;
  2007. return array[arguments[0], arguments[1]];
  2008. }
  2009. public override object GetArray() { return array; }
  2010. public override void In()
  2011. {
  2012. if (array != null)
  2013. arrayList.Add(array);
  2014. //counter++;
  2015. array = new Int64[sizes[0], sizes[1]];
  2016. }
  2017. public override void Out()
  2018. {
  2019. //counter--;
  2020. //arrayList.RemoveAt(arrayList.Count - 1);
  2021. if (arrayList.Count > 0)
  2022. {
  2023. array = arrayList[arrayList.Count - 1];
  2024. arrayList.RemoveAt(arrayList.Count - 1);
  2025. }
  2026. else
  2027. array = null;
  2028. }
  2029. }
  2030. private sealed class PrivateInt3DVariableToken : UserDefinedVariableToken
  2031. {
  2032. public PrivateInt3DVariableToken(UserDefinedVariableData data)
  2033. : base(VariableCode.VAR3D, data)
  2034. {
  2035. int[] sizes = data.Lengths;
  2036. IsStatic = false;
  2037. arrayList = new List<Int64[, ,]>();
  2038. }
  2039. readonly List<Int64[, ,]> arrayList;
  2040. Int64[, ,] array;
  2041. //int counter = 0;
  2042. public override void SetDefault() { }
  2043. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  2044. {
  2045. return array[arguments[0], arguments[1], arguments[2]];
  2046. }
  2047. public override void SetValue(Int64 value, Int64[] arguments)
  2048. {
  2049. array[arguments[0], arguments[1], arguments[2]] = value;
  2050. }
  2051. public override void SetValue(Int64[] values, Int64[] arguments)
  2052. {
  2053. int start = (int)arguments[2];
  2054. int end = start + values.Length;
  2055. for (int i = start; i < end; i++)
  2056. array[arguments[0], arguments[1], i] = values[i - start];
  2057. }
  2058. public override void SetValueAll(long value, int start, int end, int charaPos)
  2059. {
  2060. int a1 = array.GetLength(0);
  2061. int a2 = array.GetLength(1);
  2062. int a3 = array.GetLength(2);
  2063. for (int i = 0; i < a1; i++)
  2064. for (int j = 0; j < a2; j++)
  2065. for (int k = 0; k < a3; k++)
  2066. array[i, j, k] = value;
  2067. }
  2068. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2069. {
  2070. array[arguments[0], arguments[1], arguments[2]] += value;
  2071. return array[arguments[0], arguments[1], arguments[2]];
  2072. }
  2073. public override object GetArray() { return array; }
  2074. public override void In()
  2075. {
  2076. if (array != null)
  2077. arrayList.Add(array);
  2078. //counter++;
  2079. array = new Int64[sizes[0], sizes[1], sizes[2]];
  2080. }
  2081. public override void Out()
  2082. {
  2083. //counter--;
  2084. //arrayList.RemoveAt(arrayList.Count - 1);
  2085. if (arrayList.Count > 0)
  2086. {
  2087. array = arrayList[arrayList.Count - 1];
  2088. arrayList.RemoveAt(arrayList.Count - 1);
  2089. }
  2090. else
  2091. array = null;
  2092. }
  2093. }
  2094. private sealed class PrivateStr1DVariableToken : UserDefinedVariableToken
  2095. {
  2096. public PrivateStr1DVariableToken(UserDefinedVariableData data)
  2097. : base(VariableCode.VARS, data)
  2098. {
  2099. int[] sizes = data.Lengths;
  2100. IsStatic = false;
  2101. arrayList = new List<string[]>();
  2102. defArray = data.DefaultStr;
  2103. }
  2104. //int counter = 0;
  2105. readonly List<string[]> arrayList;
  2106. string[] array;
  2107. string[] defArray;
  2108. public override void SetDefault()
  2109. {
  2110. }
  2111. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2112. {
  2113. return array[arguments[0]];
  2114. }
  2115. public override void SetValue(string value, Int64[] arguments)
  2116. {
  2117. array[arguments[0]] = value;
  2118. }
  2119. public override void SetValue(string[] values, Int64[] arguments)
  2120. {
  2121. int start = (int)arguments[0];
  2122. int end = start + values.Length;
  2123. for (int i = start; i < end; i++)
  2124. array[i] = values[i - start];
  2125. }
  2126. public override void SetValueAll(string value, int start, int end, int charaPos)
  2127. {
  2128. for (int i = start; i < end; i++)
  2129. array[i] = value;
  2130. }
  2131. public override object GetArray() { return array; }
  2132. public override void In()
  2133. {
  2134. //counter++;
  2135. if (array != null)
  2136. arrayList.Add(array);
  2137. array = new string[sizes[0]];
  2138. if (defArray != null)
  2139. Array.Copy(defArray, array, defArray.Length);
  2140. //arrayList.Add(array);
  2141. }
  2142. public override void Out()
  2143. {
  2144. //counter--;
  2145. //arrayList.RemoveAt(arrayList.Count - 1);
  2146. if (arrayList.Count > 0)
  2147. {
  2148. array = arrayList[arrayList.Count - 1];
  2149. arrayList.RemoveAt(arrayList.Count - 1);
  2150. }
  2151. else
  2152. array = null;
  2153. }
  2154. }
  2155. private sealed class PrivateStr2DVariableToken : UserDefinedVariableToken
  2156. {
  2157. public PrivateStr2DVariableToken(UserDefinedVariableData data)
  2158. : base(VariableCode.VARS2D, data)
  2159. {
  2160. int[] sizes = data.Lengths;
  2161. IsStatic = false;
  2162. arrayList = new List<string[,]>();
  2163. }
  2164. //int counter = 0;
  2165. readonly List<string[,]> arrayList;
  2166. string[,] array;
  2167. public override void SetDefault()
  2168. {
  2169. }
  2170. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2171. {
  2172. return array[arguments[0], arguments[1]];
  2173. }
  2174. public override void SetValue(string value, Int64[] arguments)
  2175. {
  2176. array[arguments[0], arguments[1]] = value;
  2177. }
  2178. public override void SetValue(string[] values, Int64[] arguments)
  2179. {
  2180. int start = (int)arguments[1];
  2181. int end = start + values.Length;
  2182. for (int i = start; i < end; i++)
  2183. array[arguments[0], i] = values[i - start];
  2184. }
  2185. public override void SetValueAll(string value, int start, int end, int charaPos)
  2186. {
  2187. int a1 = array.GetLength(0);
  2188. int a2 = array.GetLength(1);
  2189. for (int i = 0; i < a1; i++)
  2190. for (int j = 0; j < a2; j++)
  2191. array[i, j] = value;
  2192. }
  2193. public override object GetArray() { return array; }
  2194. public override void In()
  2195. {
  2196. //counter++;
  2197. if (array != null)
  2198. arrayList.Add(array);
  2199. array = new string[sizes[0], sizes[1]];
  2200. //arrayList.Add(array);
  2201. }
  2202. public override void Out()
  2203. {
  2204. //counter--;
  2205. //arrayList.RemoveAt(arrayList.Count - 1);
  2206. if (arrayList.Count > 0)
  2207. {
  2208. array = arrayList[arrayList.Count - 1];
  2209. arrayList.RemoveAt(arrayList.Count - 1);
  2210. }
  2211. else
  2212. array = null;
  2213. }
  2214. }
  2215. private sealed class PrivateStr3DVariableToken : UserDefinedVariableToken
  2216. {
  2217. public PrivateStr3DVariableToken(UserDefinedVariableData data)
  2218. : base(VariableCode.VARS3D, data)
  2219. {
  2220. int[] sizes = data.Lengths;
  2221. IsStatic = false;
  2222. arrayList = new List<string[, ,]>();
  2223. }
  2224. //int counter = 0;
  2225. readonly List<string[, ,]> arrayList;
  2226. string[, ,] array;
  2227. public override void SetDefault() { }
  2228. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2229. {
  2230. return array[arguments[0], arguments[1], arguments[2]];
  2231. }
  2232. public override void SetValue(string value, Int64[] arguments)
  2233. {
  2234. array[arguments[0], arguments[1], arguments[2]] = value;
  2235. }
  2236. public override void SetValue(string[] values, Int64[] arguments)
  2237. {
  2238. int start = (int)arguments[2];
  2239. int end = start + values.Length;
  2240. for (int i = start; i < end; i++)
  2241. array[arguments[0], arguments[1], i] = values[i - start];
  2242. }
  2243. public override void SetValueAll(string value, int start, int end, int charaPos)
  2244. {
  2245. int a1 = array.GetLength(0);
  2246. int a2 = array.GetLength(1);
  2247. int a3 = array.GetLength(2);
  2248. for (int i = 0; i < a1; i++)
  2249. for (int j = 0; j < a2; j++)
  2250. for (int k = 0; k < a3; k++)
  2251. array[i, j, k] = value;
  2252. }
  2253. public override object GetArray() { return array; }
  2254. public override void In()
  2255. {
  2256. //counter++;
  2257. if (array != null)
  2258. arrayList.Add(array);
  2259. array = new string[sizes[0], sizes[1], sizes[2]];
  2260. //arrayList.Add(array);
  2261. }
  2262. public override void Out()
  2263. {
  2264. //counter--;
  2265. //arrayList.RemoveAt(arrayList.Count - 1);
  2266. if (arrayList.Count > 0)
  2267. {
  2268. array = arrayList[arrayList.Count - 1];
  2269. arrayList.RemoveAt(arrayList.Count - 1);
  2270. }
  2271. else
  2272. array = null;
  2273. }
  2274. }
  2275. #endregion
  2276. #region ref
  2277. //1808beta009で追加
  2278. /// <summary>
  2279. /// public staticとprivate dynamicをクラスレベルでは区別しない
  2280. /// 1808beta009時点ではprivate dynamicのみ
  2281. /// </summary>
  2282. private sealed class ReferenceInt1DToken : ReferenceToken
  2283. {
  2284. public ReferenceInt1DToken(UserDefinedVariableData data)
  2285. : base(VariableCode.REF, data)
  2286. {
  2287. CanRestructure = false;
  2288. IsStatic = !data.Private;
  2289. }
  2290. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  2291. {
  2292. if (array == null)
  2293. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2294. return ((Int64[])array)[arguments[0]];
  2295. }
  2296. public override void SetValue(Int64 value, Int64[] arguments)
  2297. {
  2298. if (array == null)
  2299. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2300. ((Int64[])array)[arguments[0]] = value;
  2301. }
  2302. public override void SetValue(Int64[] values, Int64[] arguments)
  2303. {
  2304. if (array == null)
  2305. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2306. int start = (int)arguments[0];
  2307. int end = start + values.Length;
  2308. for (int i = start; i < end; i++)
  2309. ((Int64[])array)[i] = values[i - start];
  2310. }
  2311. public override void SetValueAll(long value, int start, int end, int charaPos)
  2312. {
  2313. if (array == null)
  2314. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2315. for (int i = start; i < end; i++)
  2316. ((Int64[])array)[i] = value;
  2317. }
  2318. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2319. {
  2320. if (array == null)
  2321. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2322. ((Int64[])array)[arguments[0]] += value;
  2323. return ((Int64[])array)[arguments[0]];
  2324. }
  2325. }
  2326. private sealed class ReferenceInt2DToken : ReferenceToken
  2327. {
  2328. public ReferenceInt2DToken(UserDefinedVariableData data)
  2329. : base(VariableCode.REF2D, data)
  2330. {
  2331. CanRestructure = false;
  2332. IsStatic = !data.Private;
  2333. }
  2334. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  2335. {
  2336. if (array == null)
  2337. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2338. return ((Int64[,])array)[arguments[0], arguments[1]];
  2339. }
  2340. public override void SetValue(Int64 value, Int64[] arguments)
  2341. {
  2342. if (array == null)
  2343. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2344. ((Int64[,])array)[arguments[0], arguments[1]] = value;
  2345. }
  2346. public override void SetValue(Int64[] values, Int64[] arguments)
  2347. {
  2348. int start = (int)arguments[2];
  2349. int end = start + values.Length;
  2350. for (int i = start; i < end; i++)
  2351. ((Int64[,])array)[arguments[0], i] = values[i - start];
  2352. }
  2353. public override void SetValueAll(long value, int start, int end, int charaPos)
  2354. {
  2355. int a1 = array.GetLength(0);
  2356. int a2 = array.GetLength(1);
  2357. for (int i = 0; i < a1; i++)
  2358. for (int j = 0; j < a2; j++)
  2359. ((Int64[,])array)[i, j] = value;
  2360. }
  2361. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2362. {
  2363. if (array == null)
  2364. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2365. ((Int64[,])array)[arguments[0], arguments[1]] += value;
  2366. return ((Int64[,])array)[arguments[0], arguments[1]];
  2367. }
  2368. }
  2369. private sealed class ReferenceInt3DToken : ReferenceToken
  2370. {
  2371. public ReferenceInt3DToken(UserDefinedVariableData data)
  2372. : base(VariableCode.REF3D, data)
  2373. {
  2374. CanRestructure = false;
  2375. IsStatic = !data.Private;
  2376. }
  2377. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  2378. {
  2379. if (array == null)
  2380. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2381. return ((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]];
  2382. }
  2383. public override void SetValue(Int64 value, Int64[] arguments)
  2384. {
  2385. if (array == null)
  2386. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2387. ((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]] = value;
  2388. }
  2389. public override void SetValue(Int64[] values, Int64[] arguments)
  2390. {
  2391. int start = (int)arguments[2];
  2392. int end = start + values.Length;
  2393. for (int i = start; i < end; i++)
  2394. ((Int64[, ,])array)[arguments[0], arguments[1], i] = values[i - start];
  2395. }
  2396. public override void SetValueAll(long value, int start, int end, int charaPos)
  2397. {
  2398. int a1 = array.GetLength(0);
  2399. int a2 = array.GetLength(1);
  2400. int a3 = array.GetLength(2);
  2401. for (int i = 0; i < a1; i++)
  2402. for (int j = 0; j < a2; j++)
  2403. for (int k = 0; k < a3; k++)
  2404. ((Int64[, ,])array)[i, j, k] = value;
  2405. }
  2406. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2407. {
  2408. if (array == null)
  2409. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2410. ((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]] += value;
  2411. return ((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]];
  2412. }
  2413. }
  2414. private sealed class ReferenceStr1DToken : ReferenceToken
  2415. {
  2416. public ReferenceStr1DToken(UserDefinedVariableData data)
  2417. : base(VariableCode.REFS, data)
  2418. {
  2419. CanRestructure = false;
  2420. IsStatic = !data.Private;
  2421. }
  2422. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2423. {
  2424. if (array == null)
  2425. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2426. return ((string[])array)[arguments[0]];
  2427. }
  2428. public override void SetValue(string value, Int64[] arguments)
  2429. {
  2430. if (array == null)
  2431. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2432. ((string[])array)[arguments[0]] = value;
  2433. }
  2434. public override void SetValue(string[] values, Int64[] arguments)
  2435. {
  2436. if (array == null)
  2437. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2438. int start = (int)arguments[0];
  2439. int end = start + values.Length;
  2440. for (int i = start; i < end; i++)
  2441. ((string[])array)[i] = values[i - start];
  2442. }
  2443. public override void SetValueAll(string value, int start, int end, int charaPos)
  2444. {
  2445. if (array == null)
  2446. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2447. for (int i = start; i < end; i++)
  2448. ((string[])array)[i] = value;
  2449. }
  2450. }
  2451. private sealed class ReferenceStr2DToken : ReferenceToken
  2452. {
  2453. public ReferenceStr2DToken(UserDefinedVariableData data)
  2454. : base(VariableCode.REFS2D, data)
  2455. {
  2456. CanRestructure = false;
  2457. IsStatic = !data.Private;
  2458. }
  2459. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2460. {
  2461. if (array == null)
  2462. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2463. return ((string[,])array)[arguments[0], arguments[1]];
  2464. }
  2465. public override void SetValue(string value, Int64[] arguments)
  2466. {
  2467. if (array == null)
  2468. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2469. ((string[,])array)[arguments[0], arguments[1]] = value;
  2470. }
  2471. public override void SetValue(string[] values, Int64[] arguments)
  2472. {
  2473. int start = (int)arguments[2];
  2474. int end = start + values.Length;
  2475. for (int i = start; i < end; i++)
  2476. ((string[,])array)[arguments[0], i] = values[i - start];
  2477. }
  2478. public override void SetValueAll(string value, int start, int end, int charaPos)
  2479. {
  2480. int a1 = array.GetLength(0);
  2481. int a2 = array.GetLength(1);
  2482. for (int i = 0; i < a1; i++)
  2483. for (int j = 0; j < a2; j++)
  2484. ((string[,])array)[i, j] = value;
  2485. }
  2486. }
  2487. private sealed class ReferenceStr3DToken : ReferenceToken
  2488. {
  2489. public ReferenceStr3DToken(UserDefinedVariableData data)
  2490. : base(VariableCode.REFS3D, data)
  2491. {
  2492. CanRestructure = false;
  2493. IsStatic = !data.Private;
  2494. }
  2495. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2496. {
  2497. if (array == null)
  2498. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2499. return ((string[, ,])array)[arguments[0], arguments[1], arguments[2]];
  2500. }
  2501. public override void SetValue(string value, Int64[] arguments)
  2502. {
  2503. if (array == null)
  2504. throw new CodeEE("参照型変数" + varName + "は何も参照していません");
  2505. ((string[, ,])array)[arguments[0], arguments[1], arguments[2]] = value;
  2506. }
  2507. public override void SetValue(string[] values, Int64[] arguments)
  2508. {
  2509. int start = (int)arguments[2];
  2510. int end = start + values.Length;
  2511. for (int i = start; i < end; i++)
  2512. ((string[, ,])array)[arguments[0], arguments[1], i] = values[i - start];
  2513. }
  2514. public override void SetValueAll(string value, int start, int end, int charaPos)
  2515. {
  2516. int a1 = array.GetLength(0);
  2517. int a2 = array.GetLength(1);
  2518. int a3 = array.GetLength(2);
  2519. for (int i = 0; i < a1; i++)
  2520. for (int j = 0; j < a2; j++)
  2521. for (int k = 0; k < a3; k++)
  2522. ((string[, ,])array)[i, j, k] = value;
  2523. }
  2524. }
  2525. #endregion
  2526. #region chara (広域のみ)
  2527. private sealed class UserDefinedCharaInt1DVariableToken : UserDefinedCharaVariableToken
  2528. {
  2529. public UserDefinedCharaInt1DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
  2530. : base(VariableCode.CVAR, data, varData, arrayIndex)
  2531. {
  2532. }
  2533. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  2534. {
  2535. Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
  2536. return array[arguments[1]];
  2537. }
  2538. public override void SetValue(Int64 value, Int64[] arguments)
  2539. {
  2540. Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
  2541. array[arguments[1]] = value;
  2542. }
  2543. public override void SetValue(Int64[] values, Int64[] arguments)
  2544. {
  2545. Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
  2546. int start = (int)arguments[1];
  2547. int end = start + values.Length;
  2548. for (int i = start; i < end; i++)
  2549. array[i] = values[i - start];
  2550. }
  2551. public override void SetValueAll(long value, int start, int end, int charaPos)
  2552. {
  2553. Int64[] array = (Int64[])GetArrayChara(charaPos);
  2554. for (int i = start; i < end; i++)
  2555. array[i] = value;
  2556. }
  2557. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2558. {
  2559. Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
  2560. array[arguments[1]] += value;
  2561. return array[arguments[1]];
  2562. }
  2563. }
  2564. private sealed class UserDefinedCharaStr1DVariableToken : UserDefinedCharaVariableToken
  2565. {
  2566. public UserDefinedCharaStr1DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
  2567. : base(VariableCode.CVARS, data, varData, arrayIndex)
  2568. {
  2569. }
  2570. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2571. {
  2572. string[] array = (string[])GetArrayChara((int)arguments[0]);
  2573. return array[arguments[1]];
  2574. }
  2575. public override void SetValue(string value, Int64[] arguments)
  2576. {
  2577. string[] array = (string[])GetArrayChara((int)arguments[0]);
  2578. array[arguments[1]] = value;
  2579. }
  2580. public override void SetValue(string[] values, Int64[] arguments)
  2581. {
  2582. string[] array = (string[])GetArrayChara((int)arguments[0]);
  2583. int start = (int)arguments[1];
  2584. int end = start + values.Length;
  2585. for (int i = start; i < end; i++)
  2586. array[i] = values[i - start];
  2587. }
  2588. public override void SetValueAll(string value, int start, int end, int charaPos)
  2589. {
  2590. string[] array = (string[])GetArrayChara(charaPos);
  2591. for (int i = start; i < end; i++)
  2592. array[i] = value;
  2593. }
  2594. }
  2595. private sealed class UserDefinedCharaInt2DVariableToken : UserDefinedCharaVariableToken
  2596. {
  2597. public UserDefinedCharaInt2DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
  2598. : base(VariableCode.CVAR2D, data, varData, arrayIndex)
  2599. {
  2600. }
  2601. public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
  2602. {
  2603. Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
  2604. return array[arguments[1], arguments[2]];
  2605. }
  2606. public override void SetValue(Int64 value, Int64[] arguments)
  2607. {
  2608. Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
  2609. array[arguments[1], arguments[2]] = value;
  2610. }
  2611. public override void SetValue(Int64[] values, Int64[] arguments)
  2612. {
  2613. Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
  2614. int start = (int)arguments[2];
  2615. int end = start + values.Length;
  2616. int index1 = (int)arguments[1];
  2617. for (int i = start; i < end; i++)
  2618. array[index1, i] = values[i - start];
  2619. }
  2620. public override void SetValueAll(long value, int start, int end, int charaPos)
  2621. {
  2622. Int64[,] array = (Int64[,])GetArrayChara(charaPos);
  2623. int a1 = sizes[0];
  2624. int a2 = sizes[1];
  2625. for (int i = 0; i < a1; i++)
  2626. for (int j = 0; j < a2; j++)
  2627. array[i, j] = value;
  2628. }
  2629. public override Int64 PlusValue(Int64 value, Int64[] arguments)
  2630. {
  2631. Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
  2632. array[arguments[1], arguments[2]] += value;
  2633. return array[arguments[1], arguments[2]];
  2634. }
  2635. }
  2636. private sealed class UserDefinedCharaStr2DVariableToken : UserDefinedCharaVariableToken
  2637. {
  2638. public UserDefinedCharaStr2DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
  2639. : base(VariableCode.CVARS2D, data, varData, arrayIndex)
  2640. {
  2641. }
  2642. public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
  2643. {
  2644. string[,] array = (string[,])GetArrayChara((int)arguments[0]);
  2645. return array[arguments[1], arguments[2]];
  2646. }
  2647. public override void SetValue(string value, Int64[] arguments)
  2648. {
  2649. string[,] array = (string[,])GetArrayChara((int)arguments[0]);
  2650. array[arguments[1], arguments[2]] = value;
  2651. }
  2652. public override void SetValue(string[] values, Int64[] arguments)
  2653. {
  2654. string[,] array = (string[,])GetArrayChara((int)arguments[0]);
  2655. int start = (int)arguments[2];
  2656. int end = start + values.Length;
  2657. int index1 = (int)arguments[1];
  2658. for (int i = start; i < end; i++)
  2659. array[index1, i] = values[i - start];
  2660. }
  2661. public override void SetValueAll(string value, int start, int end, int charaPos)
  2662. {
  2663. string[,] array = (string[,])GetArrayChara(charaPos);
  2664. int a1 = sizes[0];
  2665. int a2 = sizes[1];
  2666. for (int i = 0; i < a1; i++)
  2667. for (int j = 0; j < a2; j++)
  2668. array[i, j] = value;
  2669. }
  2670. }
  2671. #endregion
  2672. #endregion
  2673. }
  2674. }