1 | /*
|
---|
2 | * TOPPERS/ECNL Prototyping tool
|
---|
3 | *
|
---|
4 | * Copyright (C) 2015-2017 Cores Co., Ltd. Japan
|
---|
5 | *
|
---|
6 | * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
7 | * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
8 | * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
9 | * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
10 | * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
11 | * スコード中に含まれていること.
|
---|
12 | * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
13 | * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
14 | * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
15 | * の無保証規定を掲載すること.
|
---|
16 | * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
17 | * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
18 | * と.
|
---|
19 | * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
20 | * 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
21 | * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
22 | * 報告すること.
|
---|
23 | * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
24 | * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
25 | * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
26 | * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
27 | * 免責すること.
|
---|
28 | *
|
---|
29 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
30 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
31 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
32 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
33 | * の責任を負わない.
|
---|
34 | *
|
---|
35 | * @(#) $Id: CodeGenerator.cs 287 2017-05-05 14:22:23Z coas-nagasima $
|
---|
36 | */
|
---|
37 |
|
---|
38 | using System;
|
---|
39 | using System.Linq;
|
---|
40 | using System.Text;
|
---|
41 | using Bridge;
|
---|
42 | using Bridge.Text.RegularExpressions;
|
---|
43 |
|
---|
44 | namespace WebMrbc
|
---|
45 | {
|
---|
46 | public static class CodeGenerator
|
---|
47 | {
|
---|
48 | public static string GetClassIdentifier(JsonClassInfo cls)
|
---|
49 | {
|
---|
50 | string result = "";
|
---|
51 | bool up = true;
|
---|
52 | foreach (var c in cls.name.ToLower()) {
|
---|
53 | if (c == '_') {
|
---|
54 | up = true;
|
---|
55 | continue;
|
---|
56 | }
|
---|
57 | result += up ? c.ToString().ToUpper() : c.ToString();
|
---|
58 | up = false;
|
---|
59 | }
|
---|
60 | if (result.EndsWith("Eobj"))
|
---|
61 | result = result.Substring(0, result.Length - 4);
|
---|
62 |
|
---|
63 | if (!new Regex("^[A-Z][A-Za-z0-9_]+$").Test(result)) {
|
---|
64 | result = String.Format("Cls{0:X2}{1:X2}", cls.classGroup.classGroupCode, cls.classCode);
|
---|
65 | }
|
---|
66 |
|
---|
67 | return result;
|
---|
68 | }
|
---|
69 |
|
---|
70 | public static string GetPropertyIdentifier(JsonPropertyInfo pi)
|
---|
71 | {
|
---|
72 | JsonObjectInfo cls = pi.classInfo;
|
---|
73 | JsonFieldInfo fi = pi;
|
---|
74 | string result = fi.identifier;
|
---|
75 |
|
---|
76 | if (!new Regex("^[A-Za-z_][A-Za-z0-9_]+$").Test(result)) {
|
---|
77 | result = String.Format("property{0:X2}", pi.propertyCode);
|
---|
78 | }
|
---|
79 | else {
|
---|
80 | var reg = new Regex("[A-Z][a-z]+", "g");
|
---|
81 | string[] m;
|
---|
82 | if ((m = reg.Exec(result)) != null) {
|
---|
83 | var blocks = new string[0];
|
---|
84 | int pos = 0;
|
---|
85 | do {
|
---|
86 | int len = Script.Write<int>("m.index") + m[0].Length - pos;
|
---|
87 | blocks.Push(result.Substring(pos, len).ToLower());
|
---|
88 | pos += len;
|
---|
89 | } while ((m = reg.Exec(result)) != null);
|
---|
90 | result = blocks.Join("_");
|
---|
91 | }
|
---|
92 | }
|
---|
93 |
|
---|
94 | return result;
|
---|
95 | }
|
---|
96 |
|
---|
97 | internal static bool HasPropSetter(JsonPropertyInfo epi, out ValueRange valueRange)
|
---|
98 | {
|
---|
99 | valueRange = null;
|
---|
100 |
|
---|
101 | if (!epi.primitive || (epi.arrayCount != 0))
|
---|
102 | return false;
|
---|
103 |
|
---|
104 | valueRange = ValueRange.Parse(epi.valueDescription, epi);
|
---|
105 | if ((valueRange.Values.Length > 0) || (valueRange.Ranges.Length > 0)) {
|
---|
106 | return true;
|
---|
107 | }
|
---|
108 |
|
---|
109 | valueRange = null;
|
---|
110 | return false;
|
---|
111 | }
|
---|
112 |
|
---|
113 | internal static string GetInitialValue(string valRng, JsonFieldInfo pi)
|
---|
114 | {
|
---|
115 | ValueRange valueRange = ValueRange.Parse(valRng, pi);
|
---|
116 | string init = "0000000000000000" + valueRange.InitailValue;
|
---|
117 |
|
---|
118 | char[] temp = new char[4 * pi.size];
|
---|
119 | for (int i = 0, j = init.Length - 2 * pi.size; i < temp.Length; i++, j++) {
|
---|
120 | if ((i % 4) == 0) {
|
---|
121 | temp[i++] = '\\';
|
---|
122 | temp[i++] = 'x';
|
---|
123 | }
|
---|
124 | temp[i] = init[j];
|
---|
125 | }
|
---|
126 | return new String(temp);
|
---|
127 | }
|
---|
128 |
|
---|
129 | internal static bool IsExtractProperty(JsonPropertyInfo prp)
|
---|
130 | {
|
---|
131 | switch (prp.propertyCode) {
|
---|
132 | case 0x9B: // SetMプロパティマップ
|
---|
133 | case 0x9C: // GetMプロパティマップ
|
---|
134 | // はECHONET Liteにはないので作らない
|
---|
135 | return true;
|
---|
136 | case 0x9D: // 状変アナウンスプロパティマップ
|
---|
137 | case 0x9E: // Setプロパティマップ
|
---|
138 | case 0x9F: // Getプロパティマップ
|
---|
139 | case 0xD3: // 自ノードインスタンス数
|
---|
140 | case 0xD4: // 自ノードクラス数
|
---|
141 | case 0xD5: // インスタンスリスト通知
|
---|
142 | case 0xD6: // 自ノードインスタンスリストS
|
---|
143 | case 0xD7: // 自ノードクラスリストS
|
---|
144 | // はコンフィグレーターで生成するので作らない
|
---|
145 | return true;
|
---|
146 | }
|
---|
147 |
|
---|
148 | return false;
|
---|
149 | }
|
---|
150 | }
|
---|
151 | }
|
---|