Ranking (as of 2013-03-28): 34
Language: C++
/*
UVa 448 - OOPS!
To build using Visual Studio 2008:
cl -EHsc -O2 UVa_448_OOPS.cpp
*/
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const char* opcodes[] = {
"ADD", "SUB", "MUL", "DIV", "MOV", "BREQ", "BRLE", "BRLS",
"BRGE", "BRGR", "BRNE", "BR", "AND", "OR", "XOR", "NOT"
};
const int nr_operand_digits = 4;
const int nr_digits_max = 30 + nr_operand_digits - 1;
int idigits, nr_digits;
char digits[nr_digits_max + 1];
int get_opcode()
{
if (idigits == nr_digits) {
if (!gets(digits))
return -1;
idigits = 0;
nr_digits = strlen(digits);
}
char c = digits[idigits++];
if (isdigit(c))
return c - '0';
else
return c - 'A' + 10;
}
int get_operand()
{
if (idigits + nr_operand_digits > nr_digits) {
memcpy(digits, digits + idigits, nr_digits - idigits);
gets(digits + nr_digits - idigits);
idigits = 0;
nr_digits = strlen(digits);
}
int opr = 0;
for (int i = 0; i < nr_operand_digits; i++, idigits++) {
if (i)
opr <<= 4;
char c = digits[idigits];
if (isdigit(c))
opr += c - '0';
else
opr += c - 'A' + 10;
}
return opr;
}
void print_operand(int opr)
{
int mode = (opr & 0xe000) >> 14, value = opr & 0x3fff;
switch (mode) {
case 0:
printf("R%d", value); break;
case 1:
printf("$%d", value); break;
case 2:
printf("PC+%d", value); break;
case 3:
printf("%d", value); break;
}
}
int main()
{
int opc;
while ((opc = get_opcode()) != -1) {
printf("%s ", opcodes[opc]);
print_operand(get_operand());
if (opc <= 4 || opc >= 12 && opc <= 14) {
putchar(',');
print_operand(get_operand());
if (opc >= 12 && opc <= 14) {
putchar(',');
print_operand(get_operand());
}
}
putchar('\n');
}
return 0;
}
No comments:
Post a Comment