* device/lib/gets.c: fixed bug 1568829,thanks Philipp Krause
[fw/sdcc] / as / mcs51 / asmain.c
index fabbd5bb9f13c63efaf0e499424c7710b51fd7ed..86d0da26690eced7f019a28a75d2355a081c1008 100644 (file)
  *             VOID    diag()          assubr.c
  *             VOID    err()           assubr.c
  *             int     fprintf()       c-library
- *             int     getline()       aslex.c
+ *             int     as_getline()    aslex.c
  *             VOID    list()          aslist.c
  *             VOID    lstsym()        aslist.c
  *             VOID    minit()         ___mch.c
@@ -289,7 +289,7 @@ char *argv[];
                dot.s_area = &dca;
                symp = ˙
                minit();
-               while (getline()) {
+               while (as_getline()) {
                        cp = cb;
                        cpt = cbt;
                        ep = eb;
@@ -375,7 +375,7 @@ int i;
        if (i) {
          // remove output file
          printf ("removing %s\n", relFile);
-         unlink(relFile);
+         remove(relFile);
        }
        exit(i);
 }
@@ -556,7 +556,7 @@ loop:
                goto loop;
        }
        /*
-        * If the first character is a letter then assume a lable,
+        * If the first character is a letter then assume a label,
         * symbol, assembler directive, or assembler mnemonic is
         * being processed.
         */
@@ -800,7 +800,7 @@ loop:
                break;
 
        case S_MODUL:
-               getst(id, -1);
+               getst(id, getnb()); // a module can start with a digit
                if (pass == 0) {
                        if (module[0]) {
                                err('m');
@@ -811,6 +811,20 @@ loop:
                lmode = SLIST;
                break;
 
+       case S_OPTSDCC:
+               p = optsdcc;
+               if ((c = getnb()) != 0) {
+                       do {
+                               if (p < &optsdcc[NINPUT-1])
+                                       *p++ = c;
+                       } while ((c = get()) != 0);
+               }
+               *p = 0;
+               unget(c);
+               lmode = SLIST;
+        /*if (pass == 0) printf("optsdcc=%s\n", optsdcc);*/
+        break;
+
        case S_GLOBL:
                do {
                        getid(id, -1);
@@ -822,7 +836,7 @@ loop:
                break;
 
        case S_DAREA:
-               getid(id, -1);
+               getid(id, -1);
                uaf = 0;
                uf  = A_CON|A_REL;
                if ((c = getnb()) == '(') {
@@ -861,7 +875,8 @@ loop:
        case S_ORG:
                if (dot.s_area->a_flag & A_ABS) {
                        outall();
-                       laddr = dot.s_addr = absexpr();
+                       dot.s_area->a_size += dot.s_addr - dot.s_org;
+                       laddr = dot.s_addr = dot.s_org = absexpr();
                } else {
                        err('o');
                }
@@ -1119,13 +1134,22 @@ register struct area *nap;
          if (oap->a_size < dot.s_addr) {
            oap->a_size = dot.s_addr;
          }
+       } else if (oap->a_flag & A_ABS) {
+         oap->a_addr = dot.s_org;
+         oap->a_size += dot.s_addr - dot.s_org;
+         dot.s_addr = dot.s_org = 0;
        } else {
+         oap->a_addr = 0;
          oap->a_size = dot.s_addr;
        }
        if (nap->a_flag & A_OVR) {
          // a new overlay starts at 0, no fuzz
          dot.s_addr = 0;
          fuzz = 0;
+       } else if (nap->a_flag & A_ABS) {
+         // a new absolute starts at org, no fuzz
+         dot.s_addr = dot.s_org;
+         fuzz = 0;
        } else {
          dot.s_addr = nap->a_size;
          fuzz = nap->a_fuzz;