Browse Source

feat: 添加删除变量函数

SongZihuan 3 years ago
parent
commit
c8b9e45f74
2 changed files with 44 additions and 3 deletions
  1. 7 3
      include/var.h
  2. 37 0
      src/core/var.c

+ 7 - 3
include/var.h

@@ -19,7 +19,7 @@ void addVarNode(af_Var var, af_Object *obj, char *id);
 af_VarSpace *makeVarSpace(af_Object *belong, af_Environment *env);
 void freeVarSpace(af_VarSpace *vs, af_Environment *env);
 
-/* 变量定义函数 */
+/* 变量定义函数 */
 bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs);
 bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
                        af_Object *visitor, af_Environment *env);
@@ -27,11 +27,15 @@ bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *
 bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
                            af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env);
 
-/* 变量寻值类函数 */
+/* 变量删除函数 */
+bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
+bool delVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
+
+/* 变量访问函数 */
 af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs);
 af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl);
 
-/* 变量设置类函数 */
+/* 变量设置函数 */
 bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpace *vs);
 bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpaceListNode *vsl);
 

+ 37 - 0
src/core/var.c

@@ -228,6 +228,43 @@ bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_ext
     return addVarToVarSpaceList(makeVar(name, p_self, p_posterity, p_external, obj, env), visitor, vsl);
 }
 
+/*
+ * 函数名: delVarFromVarSpace
+ * 目标: 从VarSpace中删除指定的变量
+ * 若空间被保护, 权限错误或已存在同名Var则返回false不作修改
+ * 否则返回true
+ */
+bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs) {
+    time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
+    af_VarCup **pCup = &vs->var[index];
+
+    if (vs->is_protect)
+        return false;
+
+    if (vs->belong != NULL && (visitor == NULL || visitor->data != vs->belong->data))
+        return false;
+
+    for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
+        if (EQ_STR((*pCup)->var->name, name)) {
+            *pCup = freeVarCup(*pCup);
+            return true;
+        }
+    }
+
+    return false;
+}
+
+/*
+ * 函数名: delVarFromVarList
+ * 目标: 从VarSpaceList中第一层的VarSpace中删除指定的变量
+ * 若空间被保护, 权限错误或已存在同名Var则返回false不作修改
+ * 否则返回true
+ * 调用delVarFromVarSpace
+ */
+bool delVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl) {
+    return delVarFromVarSpace(name, visitor, vsl->vs);
+}
+
 /*
  * 函数名: findVarFromVarSpaceByIndex
  * 目标: 根据指定的index, 在VarSpace中搜索var