]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/pc.y
cc, ?[acl]: fix gethunk() and move common memory allocator code to cc/compat
[plan9front.git] / sys / src / cmd / pc.y
index f656ee292c4a4d732ca83bc7dcd10e544b4c52e5..6d828f8a2c5a2be8b0881fa0fb0254b42894c6b8 100644 (file)
@@ -55,7 +55,7 @@ numalloc(void)
        
        r = emalloc(sizeof(Num));
        r->ref = 1;
-       r->p = emalloc(0);
+       r->p = emalloc(sizeof(mpdigit));
        mpassign(mpzero, r);
        return r;
 }
@@ -195,6 +195,10 @@ numbin(int op, Num *a, Num *b)
                else
                        mpassign(b, a);
                break;
+       case '$':
+               a->b = b->b;
+               mpxtend(b, mptoi(a), a);
+               break;
        }
        numdecref(b);
        return a;
@@ -389,6 +393,7 @@ hexfix(Symbol *s)
 %left unary
 %left '*' '/' '%'
 %right LOEXP
+%right '$'
 
 %{
        int save;
@@ -501,6 +506,7 @@ expr: LNUM
        | '-' expr %prec unary { $$ = nummod($2); if($$ != nil) mpsub(mpzero, $$, $$); }
        | '~' expr %prec unary { $$ = nummod($2); if($$ != nil) mpnot($$, $$); }
        | '!' expr %prec unary { $$ = nummod($2); if($$ != nil) {itomp(mpcmp($$, mpzero) == 0, $$); $$->b = 0; } }
+       | '$' expr { $$ = nummod($2); if($$ != nil) if($2->sign > 0) mpxtend($2, mpsignif($2), $$); else mpassign($2, $$); }
        | expr '?' expr ':' expr %prec '?' {
                if($1 == nil || mpcmp($1, mpzero) != 0){
                        $$ = $3;
@@ -541,6 +547,7 @@ expr: LNUM
                if($$ == nil) error("no last result");
                else numincref($$);
        }
+       | expr '$' expr { $$ = numbin('$', $1, $3); }
 
 elist: { $$.n = 0; } | elist1
 elist1: expr { $$.x[0] = $1; $$.n = 1; }
@@ -818,6 +825,7 @@ fntrunc(int, Num **a)
                numdecref(a[1]);
                return nil;
        }
+       a[0] = nummod(a[0]);
        mptrunc(a[0], i, a[0]);
        return a[0];
 }
@@ -828,6 +836,7 @@ fnxtend(int, Num **a)
        int i;
        
        if(toint(a[1], &i, 1)) return nil;
+       a[0] = nummod(a[0]);
        mpxtend(a[0], i, a[0]);
        return a[0];
 }