Added very basic -w flags
authorLukas Krickl <lukas@krickl.dev>
Sat, 16 Dec 2023 08:06:08 +0000 (09:06 +0100)
committerLukas Krickl <lukas@krickl.dev>
Sat, 16 Dec 2023 08:06:08 +0000 (09:06 +0100)
include/ulas.h
src/main.c
src/ulas.c

index 8ea8f146ebb977c11698432f79609f8c6a2840d0..0419c3df3c8817c1b00b1013e6bd92d282ebb54d 100644 (file)
@@ -71,6 +71,7 @@
     fprintf(ulaserr, __VA_ARGS__);                                             \
     exit(-1);                                                                  \
   }
+#define ULASWARNLEVEL(level) ulascfg.warn_level & (level)
 
 // format macros
 #define ULAS_FMT(f, fmt)                                                       \
@@ -109,6 +110,8 @@ extern FILE *ulassymout;
 struct ulas_expr;
 struct ulas_tok;
 
+enum ulas_warm { ULAS_WARN_OVERFLOW = 1, ULAS_WARN_ALL = 0x7FFFFFFF };
+
 struct ulas_config {
   // argv represents file names
   char **argv;
@@ -124,6 +127,8 @@ struct ulas_config {
   // all include search paths
   char **incpaths;
   int incpathslen;
+
+  enum ulas_warm warn_level;
 };
 
 /**
index 94d7b8b9f079a9f50a4d4c6711e8a0eb2bb3ac74..24e4dafad781536a188c38def137bfb56207a760 100644 (file)
@@ -23,7 +23,7 @@
 #define ULAS_OPTS "hvVp"
 
 // args with value
-#define ULAS_OPTS_ARG "o:l:s:i:"
+#define ULAS_OPTS_ARG "o:l:s:i:w:"
 
 #define ULAS_HELP(a, desc) printf("\t-%s\t%s\n", (a), desc);
 
@@ -43,11 +43,17 @@ void ulas_help(void) {
   ULAS_HELP("l=path", "Listing file");
   ULAS_HELP("s=path", "Symbols file");
   ULAS_HELP("i=path", "Add include search path");
+  ULAS_HELP("w=warning", "Toggle warnings: a=all, o=overflow");
 }
 
 void ulas_version(void) { printf("%s version %s\n", ULAS_NAME, ULAS_VER); }
 
 void ulas_getopt(int argc, char **argv, struct ulas_config *cfg) {
+  int warnings[255];
+  memset(warnings, 0, 255 * sizeof(int));
+  warnings['a'] = ULAS_WARN_ALL;
+  warnings['o'] = ULAS_WARN_OVERFLOW;
+
   int c = 0;
   while ((c = getopt(argc, argv, ULAS_OPTS ULAS_OPTS_ARG)) != -1) {
     switch (c) {
@@ -77,6 +83,9 @@ void ulas_getopt(int argc, char **argv, struct ulas_config *cfg) {
     case 'i':
       assert(incpathslen < ULAS_INCPATHSMAX);
       incpaths[incpathslen++] = strndup(optarg, ULAS_PATHMAX);
+    case 'w':
+      cfg->warn_level ^= warnings[(int)optarg[0]];
+      break;
     case '?':
       break;
     default:
index 79159cd3b799c8be864b90a863662ac25e92c1e0..17114a46195029a4ec308dc6b4c1d700f981482c 100644 (file)
@@ -104,6 +104,8 @@ struct ulas_config ulas_cfg_from_env(void) {
   struct ulas_config cfg;
   memset(&cfg, 0, sizeof(cfg));
 
+  cfg.warn_level = ULAS_WARN_OVERFLOW;
+
   return cfg;
 }
 
@@ -2150,10 +2152,19 @@ int ulas_asminstr(char *dst, unsigned long max, const char **line,
       } else if (tok[i] == ULAS_E8 || tok[i] == ULAS_E16) {
         assert(expridx < ULAS_INSTRDATMAX);
         int rc = 0;
-        exprres[expridx++] = ulas_intexpr(line, n, &rc);
+        int res = ulas_intexpr(line, n, &rc);
+        exprres[expridx++] = res;
         if (rc == -1) {
           return -1;
         }
+
+        if (ULASWARNLEVEL(ULAS_WARN_OVERFLOW) &&
+            (unsigned int)res > 0xFF && tok[i] == ULAS_E8) {
+          ULASWARN("Warning: 0x%X overflows the maximum allowed value of 0xFF\n", res);
+        } else if (ULASWARNLEVEL(ULAS_WARN_OVERFLOW) &&
+                   (unsigned int)res > 0xFFFF && tok[i] == ULAS_E16) {
+          ULASWARN("Warning: 0x%X overflows the maximum allowed value of 0xFFFF\n", res);
+        }
       } else {
         if (ulas_tok(&ulas.tok, line, n) == -1) {
           goto skip;
@@ -2363,8 +2374,8 @@ int ulas_asmdirdefenum(const char **line, unsigned long n) {
   }
 
   union ulas_val val = {0};
-  val.intv = ulas.enumv; 
-  
+  val.intv = ulas.enumv;
+
   int rc = 0;
   ULAS_EVALEXPRS(ulas.enumv += ulas_intexpr(line, n, &rc));
   if (rc == -1) {