about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDaniel <steew0x8@protonmail.com>2021-11-06 18:19:38 +0100
committerDaniel <steew0x8@protonmail.com>2021-11-06 18:19:38 +0100
commit2dba790a5b0d1e61acee6da4b85a486b036446ba (patch)
tree419c3c27793c26b31d205259ac5dce223b90e208
parentfe6314692dbdbf69db8b3e8a3979c1f1d21d621c (diff)
downloadrpncalc-2dba790a5b0d1e61acee6da4b85a486b036446ba.tar.gz
added some functions
-rw-r--r--cmds.c19
-rw-r--r--main.c8
2 files changed, 25 insertions, 2 deletions
diff --git a/cmds.c b/cmds.c
index 2a88041..7960834 100644
--- a/cmds.c
+++ b/cmds.c
@@ -16,9 +16,28 @@ stack ffloor(stack stack) {
   return stack;
 }
 
+stack flogB(stack stack) {
+  stack.val[stack.count-2] = log2(stack.val[stack.count-2])/log2(stack.val[stack.count-1]);
+  stack.val[--stack.count] = 0;
+  return stack;
+}
+
+stack fnegate(stack stack) {
+  stack.val[stack.count-1] *= -1;
+  return stack;
+}
+
+stack fpop(stack stack) {
+  stack.val[--stack.count] = 0;
+  return stack;
+}
+
 command CMD_LIST[] = {
+  {"p", &fpop, "pop last element"},
   {"ceil", &fceil, "truncate to the next integer"},
   {"floor", &ffloor, "truncate to the previous integer"},
+  {"log", &flogB, "calculate logarithm in base LAST_NUM of LAST_NUM-1"},
+  {"neg", &fnegate, "change last element's sign"},
   {0, 0, 0}
 };
 
diff --git a/main.c b/main.c
index e81d50b..cb5dada 100644
--- a/main.c
+++ b/main.c
@@ -40,7 +40,6 @@ int main() {
     if (interpreted == (double)0 && endptr == buf) { /* strtod returned the char it could not read */
       TYPE t = discriminate(buf);
       if (t == OPERATOR ) {
-	printf("func\n");
 	if (s.stk.count <= 1) {
 	  fprintf(s.defout, "not enough arguments\n");
 	  continue;
@@ -64,13 +63,18 @@ int main() {
 	  s.last_op = '/';
 	} else;
       } else if (t == FUNCTION) {
+	/* check for special commands, else pass to exec() */
 	if (strcmp(buf, "quit") == 0) {
 	  fprintf(s.defout, "quitting, bye!\n");
 	  exit(0);
+	} else if (strcmp(buf, "list") == 0) {
+	  for (int i = 0; s.sorted[i].name != 0; i++) {
+	    fprintf(s.defout, "[%s]\t->\t%s\n", s.sorted[i].name, s.sorted[i].description);
+	    continue;
+	  }
 	} else exec(buf, &s);
       }
     } else { /* we found a number */
-      printf("number\n");
       s.stk.val[s.stk.count++] = interpreted;
     }
     
05 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298