Procházet zdrojové kódy

fix: 改进了mem.c中的函数

将部分的函数调整为宏
使用了jmp跳转处理内存问题
SongZihuan před 4 roky
rodič
revize
5de4c496dc
8 změnil soubory, kde provedl 56 přidání a 56 odebrání
  1. 2 2
      argument/argument.c
  2. 1 1
      include/arguement.h
  3. 1 0
      include/macro.h
  4. 8 6
      include/mem.h
  5. 2 0
      include/virtualmath.h
  6. 8 1
      main.c
  7. 31 40
      memory/mem.c
  8. 3 6
      parser/token.c

+ 2 - 2
argument/argument.c

@@ -28,7 +28,7 @@ const char *short_option = "si:";
  * @param argv
  * @return
  */
-int getArgs(int argc, char *argv[])
+int getArgs(const int argc, char **argv)
 {
     args.file = NULL;
     args.log_file = NULL;
@@ -36,7 +36,7 @@ int getArgs(int argc, char *argv[])
     args.stdout_inter = false;
     opterr = false;
     int opt;
-    while((opt=getopt_long(argc,argv,short_option ,long_option,NULL))!=-1)
+    while((opt=getopt_long(argc, argv, short_option ,long_option,NULL))!=-1)
     {
         switch(opt)
         {

+ 1 - 1
include/arguement.h

@@ -10,7 +10,7 @@ struct Args{
 
 typedef struct Args Args;
 
-int getArgs(int argc, char *argv[]);
+int getArgs(const int argc, char **argv);
 void freeArgs(void);
 
 #endif //VIRTUALMATH_ARGUEMENT_H

+ 1 - 0
include/macro.h

@@ -9,6 +9,7 @@
 #include <getopt.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <setjmp.h>
 
 // 布尔逻辑的定义
 #define bool int

+ 8 - 6
include/mem.h

@@ -3,18 +3,20 @@
 #include <string.h>
 #include <__macro.h>
 
-void *memFreeCore(void *p);
+extern jmp_buf memVirtualMath_Env;
+extern bool memVirtualMathUseJmp;
+
 void *memCalloc(size_t num, size_t size);
 void *memRealloc(void *old, size_t size);
-char *memStrcpy(char *str);
+char *memStrcpy(const char *const str);
 char *memStrCharcpy(char *str, size_t nsize, int free_old, int write, ...);
-char *memString(size_t size);
-size_t memStrlen(char *p);
 char *memStrcat(char *first, char *second, bool free_old);
 char *memStrcpySelf(char *str, NUMBER_TYPE times);
-char *memStrrev(char *str);
+char *memStrrev(const char *const str);
 
-#define memFree(p) p=memFreeCore(p)
+#define memFree(p) ((p)=((p) != NULL ? (free(p), NULL) : NULL))
 #define eqString(str1, str2) (!strcmp(str1, str2))
+#define memString(size) (char *)memCalloc(size + 1, sizeof(char))
+#define memStrlen(p) (((p) == NULL) ? 0 :strlen(p))
 
 #endif //VIRTUALMATH_MEM_H

+ 2 - 0
include/virtualmath.h

@@ -3,6 +3,8 @@
 #include "macro.h"
 #include "arguement.h"
 
+extern jmp_buf memVirtualMath_Env;
+extern bool memVirtualMathUseJmp;
 typedef struct Inter Inter;
 typedef struct Result Result;
 Inter *runBaseInter(char *code_file, char *debug_dir, int *status);

+ 8 - 1
main.c

@@ -3,6 +3,9 @@
 int main(int argc, char *argv[]) {
     Inter *global_inter = NULL;
     int status = 1;
+    memVirtualMathUseJmp = true;
+    if (setjmp(memVirtualMath_Env) == -1)  // 遇到内存错误
+        return 2;
 
     if (getArgs(argc, argv))
         goto args_error;
@@ -16,7 +19,11 @@ int main(int argc, char *argv[]) {
 
 
 /**
- * TODO-szh 面向对象
+ * TODO-szh 类->对象
+ * TODO-szh 类继承
+ * TODO-szh 类封装
+ * TODO-szh 类super语句
+ * TODO-szh const声明
  * TODO-szh import语句
  * TODO-szh 生成语法树
  * TODO-szh 取反符号 -

+ 31 - 40
memory/mem.c

@@ -1,65 +1,59 @@
 #include "__virtualmath.h"
 
-void *memFreeCore(void *p){
-    if (p != NULL)
-        free(p);
-    return NULL;
-}
+jmp_buf memVirtualMath_Env;
+bool memVirtualMathUseJmp;
 
 void *memCalloc(size_t num, size_t size){
+    void *tmp = NULL;
     if (num == 0 || size == 0)
         return NULL;
-    void *tmp = calloc(num, size);
+    tmp = calloc(num, size);
+    if (tmp == NULL) {
+        if (memVirtualMathUseJmp)
+            longjmp(memVirtualMath_Env, -1);
+        else
+            exit(2);
+    }
     return tmp;
 }
 
 void *memRealloc(void *old, size_t size){
-    if (size == 0)
+    void *tmp = NULL;
+    if (size <= 0)
         return NULL;
-    void *tmp;
-    if (old == NULL)
+    else if (old == NULL)
         tmp = memCalloc(1,size);
     else
         tmp = realloc(old, size);
-    return tmp;
-}
-
-size_t memStrlen(char *p){  // 可以读取NULL的strlen
-    if (p == NULL)
-        return 0;
-    else
-        return strlen(p);
-}
-
-char *memString(size_t size) {  // 比memCalloc多了一个设置\0的步骤
-    if (size == 0){
-        return NULL;
+    if (tmp == NULL) {
+        if (memVirtualMathUseJmp)
+            longjmp(memVirtualMath_Env, -1);
+        else
+            exit(2);
     }
-    char *tmp = (char *)memCalloc(size + 1, sizeof(char));
-    tmp[size] = '\0';
     return tmp;
 }
 
-char *memStrcpy(char *str){
-    return memStrCharcpy(str, 0, false ,false);
+char *memStrcpy(const char *const str){
+    char *tmp = memString(memStrlen(str));
+    if (str != NULL)
+        strcpy(tmp, str);
+    return tmp;
 }
 
 char *memStrCharcpy(char *str, size_t nsize, bool free_old, bool write, ...) {  // 复制str到新的空间,nszie是要扩展的大小。该函数支持让str=NULL,则变为单纯的memString
-    char *tmp = memString(memStrlen(str) + nsize + 1);
-    if (str != NULL){
+    char *tmp = memString(memStrlen(str) + nsize);
+    if (str != NULL)
         strcpy(tmp, str);
-    }
     if (write){
         va_list argp;
         va_start(argp, write);
-        for (int i = 0; i < nsize; i++){
+        for (int i = 0; i < nsize; i++)
             tmp[memStrlen(str) + i] = (char)va_arg(argp, int);
-        }
         va_end(argp);
     }
-    if (free_old){
+    if (free_old)
         memFree(str);
-    }
     return tmp;
 }
 
@@ -73,9 +67,8 @@ char *memStrcat(char *first, char *second, bool free_old) {
     }
 
     char *new = memStrCharcpy(first, memStrlen(second), false, false);
-    if (second != NULL){
+    if (second != NULL)
         strcat(new, second);
-    }
     if (free_old)
         memFree(first);
     return new;
@@ -94,17 +87,15 @@ char *memStrcpySelf(char *str, NUMBER_TYPE times){
         memFree(new_str);
         new_str = tmp;
     }
-    if (need_free){
+    if (need_free)
         memFree(str);
-    }
     return new_str;
 }
 
-char *memStrrev(char *str){
+char *memStrrev(const char *const str){
     size_t len_str = memStrlen(str);
     char *new_str = memString(len_str);
-    for (int i = 0;i < len_str;i++){
+    for (int i = 0;i < len_str;i++)
         new_str[i] = str[len_str - i - 1];
-    }
     return new_str;
 }

+ 3 - 6
parser/token.c

@@ -151,15 +151,12 @@ Token *popNewToken(TokenMessage *tm, FILE *debug) {
 void printToken(Token *tk, FILE *debug, int type) {
     if (tk->token_type >= 0) {
         char *tmp = tk->data.str, *second_tmp = tk->data.second_str;
-        if (!strcmp(tmp, "\n")) {
+        if (tmp != NULL && !strcmp(tmp, "\n"))
             tmp = "\\n";
-        }
-        if (!strcmp(second_tmp, "\n")) {
+        if (second_tmp != NULL && !strcmp(second_tmp, "\n"))
             second_tmp = "\\n";
-        }
-        if (tmp[0] == EOF) {
+        if (tmp != NULL && tmp[0] == EOF)
             tmp = "(EOF)";
-        }
         writeLog_(debug, type, "<token str = ('%s','%s'), type = %d>", tmp, second_tmp, tk->token_type);
     }
     else{