nasmlib: Introduce idata_bytes helper
authorCyrill Gorcunov <gorcunov@gmail.com>
Sat, 31 Oct 2009 17:02:14 +0000 (20:02 +0300)
committerCyrill Gorcunov <gorcunov@gmail.com>
Sat, 31 Oct 2009 17:02:14 +0000 (20:02 +0300)
This allow us to eliminate code duplication

Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
assemble.c
nasmlib.c
nasmlib.h
parser.c

index ca2b909..5fceea3 100644 (file)
@@ -344,40 +344,16 @@ int64_t assemble(int32_t segment, int64_t offset, int bits, uint32_t cp,
     int64_t insn_end;
     int32_t itimes;
     int64_t start = offset;
-    int64_t wsize = 0;             /* size for DB etc. */
+    int64_t wsize             /* size for DB etc. */
 
     errfunc = error;            /* to pass to other functions */
     cpu = cp;
     outfmt = output;            /* likewise */
     list = listgen;             /* and again */
 
-    switch (instruction->opcode) {
-    case -1:
+    wsize = idata_bytes(instruction->opcode);
+    if (wsize == -1)
         return 0;
-    case I_DB:
-        wsize = 1;
-        break;
-    case I_DW:
-        wsize = 2;
-        break;
-    case I_DD:
-        wsize = 4;
-        break;
-    case I_DQ:
-        wsize = 8;
-        break;
-    case I_DT:
-        wsize = 10;
-        break;
-    case I_DO:
-       wsize = 16;
-       break;
-    case I_DY:
-       wsize = 32;
-       break;
-    default:
-       break;
-    }
 
     if (wsize) {
         extop *e;
@@ -684,34 +660,10 @@ int64_t insn_size(int32_t segment, int64_t offset, int bits, uint32_t cp,
        instruction->opcode == I_DT || instruction->opcode == I_DO ||
        instruction->opcode == I_DY) {
         extop *e;
-        int32_t isize, osize, wsize = 0;   /* placate gcc */
+        int32_t isize, osize, wsize;
 
         isize = 0;
-        switch (instruction->opcode) {
-        case I_DB:
-            wsize = 1;
-            break;
-        case I_DW:
-            wsize = 2;
-            break;
-        case I_DD:
-            wsize = 4;
-            break;
-        case I_DQ:
-            wsize = 8;
-            break;
-        case I_DT:
-            wsize = 10;
-            break;
-       case I_DO:
-           wsize = 16;
-           break;
-       case I_DY:
-           wsize = 32;
-           break;
-       default:
-           break;
-        }
+        wsize = idata_bytes(instruction->opcode);
 
         list_for_each(e, instruction->eops) {
             int32_t align;
index 0dea39e..b4ca34e 100644 (file)
--- a/nasmlib.c
+++ b/nasmlib.c
@@ -689,3 +689,41 @@ char *nasm_zap_spaces_rev(char *p)
             *p-- = 0x0;
     return p;
 }
+
+/*
+ * initialized data bytes length from opcode
+ */
+int idata_bytes(int opcode)
+{
+    int ret;
+    switch (opcode) {
+    case I_DB:
+        ret = 1;
+        break;
+    case I_DW:
+        ret = 2;
+        break;
+    case I_DD:
+        ret = 4;
+        break;
+    case I_DQ:
+        ret = 8;
+        break;
+    case I_DT:
+        ret = 10;
+        break;
+    case I_DO:
+        ret = 16;
+        break;
+    case I_DY:
+        ret = 32;
+        break;
+    case I_none:
+        ret = -1;
+        break;
+    default:
+        ret = 0;
+        break;
+    }
+    return ret;
+}
index 2b30ef4..9d39117 100644 (file)
--- a/nasmlib.h
+++ b/nasmlib.h
@@ -415,4 +415,6 @@ static inline bool overflow_unsigned(int64_t value, int bytes)
     return value < vmin || value > vmax;
 }
 
+int idata_bytes(int opcode);
+
 #endif
index 34fcf47..adf181c 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -429,44 +429,25 @@ restart_parse:
                    goto is_float;
                }
             } else if (i == TOKEN_FLOAT) {
-           is_float:
+is_float:
                eop->type = EOT_DB_STRING;
                result->eops_float = true;
-               switch (result->opcode) {
-               case I_DB:
-                   eop->stringlen = 1;
-                   break;
-               case I_DW:
-                   eop->stringlen = 2;
-                   break;
-               case I_DD:
-                   eop->stringlen = 4;
-                   break;
-               case I_DQ:
-                   eop->stringlen = 8;
-                   break;
-               case I_DT:
-                   eop->stringlen = 10;
-                   break;
-               case I_DO:
-                   eop->stringlen = 16;
-                   break;
-               case I_DY:
-                   nasm_error(ERR_NONFATAL, "floating-point constant"
-                         " encountered in DY instruction");
-                   eop->stringlen = 0;
-                   break;
-               default:
-                   nasm_error(ERR_NONFATAL, "floating-point constant"
-                         " encountered in unknown instruction");
-                   /*
-                    * fix suggested by Pedro Gimeno... original line
-                    * was:
-                    * eop->type = EOT_NOTHING;
-                    */
-                   eop->stringlen = 0;
-                   break;
-               }
+
+                eop->stringlen = idata_bytes(result->opcode);
+                if (eop->stringlen > 16) {
+                    nasm_error(ERR_NONFATAL, "floating-point constant"
+                               " encountered in DY instruction");
+                    eop->stringlen = 0;
+                } else if (eop->stringlen < 1) {
+                    nasm_error(ERR_NONFATAL, "floating-point constant"
+                               " encountered in unknown instruction");
+                    /*
+                     * fix suggested by Pedro Gimeno... original line was:
+                     * eop->type = EOT_NOTHING;
+                     */
+                    eop->stringlen = 0;
+                }
+
                eop = nasm_realloc(eop, sizeof(extop) + eop->stringlen);
                tail = &eop->next;
                *fixptr = eop;
@@ -481,7 +462,7 @@ restart_parse:
                /* anything else, assume it is an expression */
                 expr *value;
 
-           is_expression:
+is_expression:
                 value = evaluate(stdscan, NULL, &tokval, NULL,
                                  critical, nasm_error, NULL);
                 i = tokval.t_type;