summary refs log tree commit diff
path: root/.bin/rpn.c
diff options
context:
space:
mode:
Diffstat (limited to '.bin/rpn.c')
-rwxr-xr-x.bin/rpn.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/.bin/rpn.c b/.bin/rpn.c
index 9a88298b..1d3bdaea 100755
--- a/.bin/rpn.c
+++ b/.bin/rpn.c
@@ -3,47 +3,45 @@ exec cc -Wall -Wextra $@ -ledit -o $(dirname $0)/rpn $0
 #endif
 
 #include <assert.h>
-#include <ctype.h>
 #include <err.h>
 #include <histedit.h>
 #include <stdbool.h>
-#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sysexits.h>
 
-static char *fmt(int radix, int64_t val) {
+static char *fmt(int radix, long val) {
     static char buf[65];
     if (radix == 2) {
-        uint64_t u = val;
+        unsigned long u = val;
         int i = sizeof(buf);
         do {
             buf[--i] = '0' + (u & 1);
         } while (u >>= 1);
         return &buf[i];
     } else if (radix == 8) {
-        snprintf(buf, sizeof(buf), "%llo", val);
+        snprintf(buf, sizeof(buf), "%lo", val);
     } else if (radix == 10) {
-        snprintf(buf, sizeof(buf), "%lld", val);
+        snprintf(buf, sizeof(buf), "%ld", val);
     } else if (radix == 16) {
-        snprintf(buf, sizeof(buf), "%llx", val);
+        snprintf(buf, sizeof(buf), "%lx", val);
     } else abort();
     return buf;
 }
 
 static struct {
-    int64_t data[1024];
+    long data[1024];
     size_t len;
     int radix;
     char op;
 } stack = { .radix = 10 };
 
-static void push(int64_t val) {
+static void push(long val) {
     stack.data[stack.len++] = val;
     assert(stack.len < sizeof(stack.data));
 }
 
-static int64_t pop(void) {
+static long pop(void) {
     if (stack.len == 0) return 0;
     return stack.data[--stack.len];
 }
@@ -66,7 +64,7 @@ static bool stack_op(char op) {
         return true;
     }
 
-    int64_t a, b;
+    long a, b;
     switch (op) {
         case '@': case '\'': case '"': stack.op = op;
         break; case 'b': stack.radix = 2;
@@ -87,8 +85,8 @@ static bool stack_op(char op) {
         break; case '&': a = pop(); push(pop() & a);
         break; case '|': a = pop(); push(pop() | a);
         break; case '^': a = pop(); push(pop() ^ a);
-        break; case '<': a = pop(); push(pop() << a);
-        break; case '>': a = pop(); push(pop() >> a);
+        break; case '<': a = pop(); push((unsigned long) pop() << a);
+        break; case '>': a = pop(); push((unsigned long) pop() >> a);
         break; case '.': a = pop(); printf("%s\n", fmt(stack.radix, a));
         break; case ',': a = pop(); printf("%c\n", (char) a);
         break; case ' ':
@@ -103,7 +101,7 @@ static void process(const char *input) {
             input++;
         } else {
             char *rest;
-            int64_t val = strtoll(input, &rest, stack.radix);
+            long val = strtol(input, &rest, stack.radix);
             if (rest != input) {
                 input = rest;
                 push(val);