• R/O
  • SSH
  • HTTPS

npl: コミット


コミットメタ情報

リビジョン65 (tree)
日時2017-09-11 00:07:11
作者tamiya25

ログメッセージ

val調整

変更サマリ

差分

--- trunk/npl/npl.h (revision 64)
+++ trunk/npl/npl.h (revision 65)
@@ -30,6 +30,8 @@
3030
3131 // typedef
3232 typedef enum npl_vtype_t npl_vtype_t;
33+typedef enum npl_token_t npl_token_t;
34+typedef enum npl_operator_t npl_operator_t;
3335 typedef struct npl_val_t npl_val_t;
3436
3537 typedef struct npl_object_t npl_object_t;
@@ -59,6 +61,7 @@
5961 char* npl_convert_to_mbs(const wchar_t *s);
6062 wchar_t* npl_convert_to_wcs(const char *s);
6163 int npl_add(size_t a, size_t b, size_t *r);
64+int npl_sub(size_t a, size_t b, size_t *r);
6265 int npl_mul(size_t a, size_t b, size_t *r);
6366
6467 // 静的な型
@@ -115,12 +118,89 @@
115118 NPL_VT_MBSTR,
116119 NPL_VT_CFUNC,
117120 NPL_VT_POINTER,
121+ NPL_VT_TOKEN,
122+ NPL_VT_OPERATOR,
123+};
118124
119- // スタックで内部的に使用される値。
120- // 一般的な操作では使わないこと。
121- NPL_VT_STACK_COUNT,
125+enum npl_token_t {
126+ NPL_TOKEN_NULL = 0,
127+
128+ NPL_TOKEN_NUMBER,
129+ NPL_TOKEN_ID,
130+ NPL_TOKEN_CH, // char
131+ NPL_TOKEN_STR, // string
132+
133+ NPL_TOKEN_PLUS, // +
134+ NPL_TOKEN_MINUS, // -
135+ NPL_TOKEN_MUL, // *
136+ NPL_TOKEN_DIV, // /
137+ NPL_TOKEN_MOD, // %
138+
139+ NPL_TOKEN_PLUS_PLUS, // ++
140+ NPL_TOKEN_MINUS_MINUS, // --
141+ NPL_TOKEN_MUL_MUL, // **
142+
143+ NPL_TOKEN_EQ, // =
144+ NPL_TOKEN_LT, // <
145+ NPL_TOKEN_GT, // >
146+ NPL_TOKEN_EQ_EQ, // ==
147+ NPL_TOKEN_NOT_EQ, // !=
148+ NPL_TOKEN_LT_EQ, // <=
149+ NPL_TOKEN_GT_EQ, // >=
150+ NPL_TOKEN_EQ_EQ_EQ, // ===
151+ NPL_TOKEN_NOT_EQ_EQ, // !==
152+
153+ NPL_TOKEN_EXCLAMATION, // !
154+ NPL_TOKEN_TILDA, // ~
155+ NPL_TOKEN_CARET, // ^
156+ NPL_TOKEN_QUESTION, // ?
157+ NPL_TOKEN_AMP, // &
158+ NPL_TOKEN_AMP_AMP, // &&
159+ NPL_TOKEN_BAR, // |
160+ NPL_TOKEN_BAR_BAR, // ||
161+ NPL_TOKEN_DOLLER, // $
162+ NPL_TOKEN_AT, // @
163+
164+ NPL_TOKEN_PLUS_EQ, // +=
165+ NPL_TOKEN_MINUS_EQ, // -=
166+ NPL_TOKEN_MUL_EQ, // *=
167+ NPL_TOKEN_DIV_EQ, // /=
168+ NPL_TOKEN_MOD_EQ, // %=
169+
170+ NPL_TOKEN_LSHIFT, // <<
171+ NPL_TOKEN_RSHIFT, // >>
172+ NPL_TOKEN_ARROW, // ->
173+
174+ NPL_TOKEN_COLON, // :
175+ NPL_TOKEN_COLON_COLON, // ::
176+ NPL_TOKEN_COLON_EQ, // :=
177+ NPL_TOKEN_COLON_COLON_EQ, // ::=
178+ NPL_TOKEN_SEMICOLON, // ;
179+ NPL_TOKEN_COMMA, // ,
180+ NPL_TOKEN_DOT, // .
181+
182+ NPL_TOKEN_LPAR, // (
183+ NPL_TOKEN_RPAR, // )
184+ NPL_TOKEN_LBRACE, // {
185+ NPL_TOKEN_RBRACE, // }
186+ NPL_TOKEN_LBRACKET, // [
187+ NPL_TOKEN_RBRACKET, // ]
122188 };
123189
190+enum npl_operator_t {
191+ NPL_OP_NULL = 0,
192+
193+ NPL_OP_ADD,
194+ NPL_OP_SUB,
195+ NPL_OP_MUL,
196+ NPL_OP_DIV,
197+ NPL_OP_MOD,
198+ NPL_OP_POW,
199+ NPL_OP_EQ,
200+ NPL_OP_PLUS,
201+ NPL_OP_MINUS,
202+};
203+
124204 struct npl_val_t {
125205 npl_vtype_t type;
126206 union {
@@ -136,7 +216,11 @@
136216 char *mbs;
137217 npl_cfunc_t cfn;
138218 void *p;
139- size_t stack_count;
219+ struct {
220+ npl_token_t type;
221+ npl_sbuf_t *sbuf;
222+ } token;
223+ npl_operator_t op;
140224 };
141225 };
142226
@@ -144,6 +228,10 @@
144228 void npl_val_end(npl_val_t *val);
145229 void npl_val_copy(npl_val_t *dest, npl_val_t *src);
146230
231+int npl_val_check(npl_val_t *val, npl_vtype_t type);
232+int npl_val_check_null(npl_val_t *val);
233+int npl_val_check_object(npl_val_t *val, npl_type_t *type);
234+
147235 void npl_val_set_null(npl_val_t *val);
148236 void npl_val_set_object(npl_val_t *val, npl_object_t *object);
149237 void npl_val_set_int(npl_val_t *val, int i);
@@ -157,7 +245,8 @@
157245 void npl_val_set_mbs(npl_val_t *val, char *mbs);
158246 void npl_val_set_cfunc(npl_val_t *val, npl_cfunc_t cfn);
159247 void npl_val_set_pointer(npl_val_t *val, void *p);
160-void _npl_val_set_stack_count(npl_val_t *val, size_t count);
248+void npl_val_set_token(npl_val_t *val, npl_token_t type, npl_sbuf_t *sbuf);
249+void npl_val_set_operator(npl_val_t *val, npl_operator_t op);
161250
162251 // object class
163252 struct npl_object_t {
--- trunk/npl/val.c (revision 64)
+++ trunk/npl/val.c (revision 65)
@@ -5,6 +5,9 @@
55 if (val->type == NPL_VT_OBJECT)
66 if (val->object != NULL)
77 npl_object_ref(val->object);
8+ else if (val->type == NPL_VT_TOKEN)
9+ if (val->token.sbuf != NULL)
10+ npl_object_ref(NPL_OBJECT(val->token.sbuf));
811 }
912
1013 static void _unref(npl_val_t *val)
@@ -12,6 +15,9 @@
1215 if (val->type == NPL_VT_OBJECT)
1316 if (val->object != NULL)
1417 npl_object_unref(val->object);
18+ else if (val->type == NPL_VT_TOKEN)
19+ if (val->token.sbuf != NULL)
20+ npl_object_unref(NPL_OBJECT(val->token.sbuf));
1521 }
1622
1723 void npl_val_begin(npl_val_t *val)
@@ -32,6 +38,40 @@
3238 _ref(dest);
3339 }
3440
41+// 値が、指定の型かどうかチェック
42+int npl_val_check(npl_val_t *val, npl_vtype_t type)
43+{
44+ if (val->type != type)
45+ return 1; // 型が異なる
46+
47+ return 0;
48+}
49+
50+// 値が NULL かどうかチェック
51+int npl_val_check_null(npl_val_t *val)
52+{
53+ if (val->type == NPL_VT_NULL)
54+ return 0;
55+ if (val->type == NPL_VT_OBJECT)
56+ if (val->object == NULL)
57+ return 0;
58+
59+ return 1; // 値は NULL ではない
60+}
61+
62+// オブジェクトが指定の型かどうかチェック
63+int npl_val_check_object(npl_val_t *val, npl_type_t *type)
64+{
65+ if (val->type != NPL_VT_OBJECT)
66+ return 1; // オブジェクトではない
67+ if (val->object == NULL)
68+ return 2; // オブジェクトは NULL
69+ if (npl_type_check(type, val->object->type))
70+ return 3; // オブジェクトの型が不一致
71+
72+ return 0;
73+}
74+
3575 void npl_val_set_null(npl_val_t *val)
3676 {
3777 _unref(val);
@@ -123,12 +163,19 @@
123163 val->p = p;
124164 }
125165
126-// スタックが内部的に使用する操作。
127-// 通常、使用しないこと。
128-void _npl_val_set_stack_count(npl_val_t *val, size_t count)
166+void npl_val_set_token(npl_val_t *val, npl_token_t type, npl_sbuf_t *sbuf)
129167 {
130168 _unref(val);
131- val->type = NPL_VT_STACK_COUNT;
132- val->stack_count = count;
169+ val->type = NPL_VT_TOKEN;
170+ val->token.type = type;
171+ val->token.sbuf = sbuf;
172+ _ref(val);
133173 }
134174
175+void npl_val_set_operator(npl_val_t *val, npl_operator_t op)
176+{
177+ _unref(val);
178+ val->type = NPL_VT_OPERATOR;
179+ val->op = op;
180+}
181+
旧リポジトリブラウザで表示