VariableLocal.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System.Collections.Generic;
  2. using NTERA.EmuEra.Game.EraEmu.GameProc;
  3. namespace NTERA.EmuEra.Game.EraEmu.GameData.Variable
  4. {
  5. internal delegate LocalVariableToken CreateLocalVariableToken(VariableCode varCode, string subKey, int size);
  6. internal sealed class VariableLocal
  7. {
  8. public VariableLocal(VariableCode varCode, int size, CreateLocalVariableToken creater)
  9. {
  10. this.size = size;
  11. this.varCode = varCode;
  12. this.creater = creater;
  13. }
  14. readonly int size;
  15. public bool IsForbid => size == 0;
  16. VariableCode varCode;
  17. //VariableData varData;
  18. CreateLocalVariableToken creater;
  19. private readonly Dictionary<string, LocalVariableToken> localVarTokens = new Dictionary<string, LocalVariableToken>();
  20. public LocalVariableToken GetExistLocalVariableToken(string subKey)
  21. {
  22. LocalVariableToken ret = null;
  23. if (localVarTokens.TryGetValue(subKey, out ret))
  24. return ret;
  25. return ret;
  26. }
  27. public int GetDefaultSize()
  28. {
  29. return size;
  30. }
  31. public LocalVariableToken GetNewLocalVariableToken(string subKey, FunctionLabelLine func)
  32. {
  33. LocalVariableToken ret = null;
  34. int newSize = 0;
  35. if (varCode == VariableCode.LOCAL)
  36. newSize = func.LocalLength;
  37. else if (varCode == VariableCode.LOCALS)
  38. newSize = func.LocalsLength;
  39. else if (varCode == VariableCode.ARG)
  40. newSize = func.ArgLength;
  41. else if (varCode == VariableCode.ARGS)
  42. newSize = func.ArgsLength;
  43. if (newSize > 0)
  44. {
  45. if((newSize < size) && ((varCode == VariableCode.ARG) || (varCode == VariableCode.ARGS)))
  46. newSize = size;
  47. ret = creater(varCode, subKey, newSize);
  48. }
  49. else if (newSize == 0)
  50. ret = creater(varCode, subKey, size);
  51. else
  52. {
  53. ret = creater(varCode, subKey, size);
  54. LogicalLine line = GlobalStatic.Process.GetScaningLine();
  55. if (line != null)
  56. {
  57. if (!func.IsSystem)
  58. ParserMediator.Warn("関数宣言に引数変数\"" + varCode + "\"が使われていない関数中で\"" + varCode + "\"が使われています(関数の引数以外の用途に使うことは推奨されません。代わりに#DIMの使用を検討してください)", line, 1, false, false);
  59. else
  60. ParserMediator.Warn("システム関数" + func.LabelName + "中で\"" + varCode + "\"が使われています(関数の引数以外の用途に使うことは推奨されません。代わりに#DIMの使用を検討してください)", line, 1, false, false);
  61. }
  62. //throw new CodeEE("この関数に引数変数\"" + varCode + "\"は定義されていません");
  63. }
  64. localVarTokens.Add(subKey, ret);
  65. return ret;
  66. }
  67. public void ResizeLocalVariableToken(string subKey, int newSize)
  68. {
  69. LocalVariableToken ret = null;
  70. if (localVarTokens.TryGetValue(subKey, out ret))
  71. {
  72. if (size < newSize)
  73. ret.resize(newSize);
  74. else
  75. ret.resize(size);
  76. }
  77. else
  78. {
  79. if (newSize > size)
  80. ret = creater(varCode, subKey, newSize);
  81. else if (newSize == 0)
  82. ret = creater(varCode, subKey, size);
  83. else
  84. return;
  85. localVarTokens.Add(subKey, ret);
  86. }
  87. }
  88. public void Clear()
  89. {
  90. localVarTokens.Clear();
  91. }
  92. public void SetDefault()
  93. {
  94. foreach (KeyValuePair<string, LocalVariableToken> pair in localVarTokens)
  95. pair.Value.SetDefault();
  96. }
  97. }
  98. }