rpcalc/main.c
2025-02-21 00:38:30 -05:00

55 lines
1.4 KiB
C

/*********************************************
* Description - RPCalc compiler
* Author - Vilyaem
* Date - Jun 05 2024
* *******************************************/
#include <stdio.h>
#include <string.h>
char* regnames[] = { "%ax","%bx","%cx","%dx" };
int main(void){
int stackptr = 0;
char strbuf[8];
char regnamebuf[16];
char regnamebuf2[16];
puts("/*Compiled with Vilyaem's simple rpcalc compiler*/");
while(fgets(strbuf,8,stdin) != NULL){
if(strbuf[0] == '\n'){
break;
}
strbuf[strlen(strbuf)-1] = '\0';
switch(strbuf[0]){
case '+':
strcpy(regnamebuf,regnames[stackptr-1]);
strcpy(regnamebuf2,regnames[stackptr-2]);
printf("add %%%s,%%%s\n",regnamebuf,regnamebuf2);
--stackptr;
break;
case '-':
strcpy(regnamebuf,regnames[stackptr-1]);
strcpy(regnamebuf2,regnames[stackptr-2]);
printf("sub %%%s,%%%s\n",regnamebuf,regnamebuf2);
--stackptr;
break;
case '*':
strcpy(regnamebuf,regnames[stackptr-1]);
strcpy(regnamebuf2,regnames[stackptr-2]);
printf("imul %%%s,%%%s\n",regnamebuf,regnamebuf2);
--stackptr;
break;
default: /*assume it is a numeric to be pushed*/
printf("mv $%s,%%%s\n",strbuf,regnames[stackptr]);
++stackptr;
break;
}
/*printf("# stackptr: %d", stackptr); for debugging*/
}
return 0;
}