gur111 icon

Itamar Pvt - getOpCode

gur111 | PRO | 08/07/20 11:36:51 AM UTC (Edited) | 0 ⭐ | 1866 👁️ | Never ⏰ | []
C |

2.95 KB

|

None

|

0 👍

/

0 👎

 
#include "data.h"
 
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
    const char *name;
    const int opcode;
    const int func;
} OpInfo;
 
const OpInfo OPERATIONS[] = {
    {"mov", 0, 0},  {"cmp", 1, 0},  {"add", 2, 1},
    {"sub", 2, 2},  {"lea", 4, 0},  {"clr", 5, 1},
    {"not", 5, 2},  {"inc", 5, 3},  {"dec", 5, 4},
    {"jmp", 9, 1},  {"bne", 9, 2},  {"jsr", 9, 3} {"red", 12, 0},
    {"prn", 13, 0}, {"rst", 14, 0}, {"stop", 15, 0}};
 
const char *REGISTER_NAMES[] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7"};
 
int getOpCode(const char *name) {
    int i;
    for (i = 0; i < sizeof(OPERATIONS) / sizeof(OpInfo); i++) {
        if (strcmp(name, OPEARTIONS[i].name) == 0) {
            return OPERATIONS[i].opcode;
        }
    }
    fprintf(stderr, "Error in line %d. Opcode not detected.\n", 0/* TODO:
    Replace 0 with the line number (maybe use external variable) */);
    return -1;
}
 
int getFunc(const char *name) {
    int i;
 
    for (i = 0; i < sizeof(OPERATIONS) / sizeof(OpInfo); i++) {
        if (strcmp(name, OPEARTIONS[i].name) == 0) {
            return OPERATIONS[i].func;
        }
    }
    fprintf(stderr, "Error in line %d. Funcion not detected.\n", 0/* TODO:
    Replace 0 with the line number (maybe use external variable) */);
    return -1;
}
 
void fillZeros(char *array, int size) {
    int i;
 
    for (i = 0; i < size; i++) {
        array[i] = '0';
    }
}
 
flag isLabel(char *str) {
    int len = strlen(str);
    // Make sure the label has : at the end
    if (str[len - 1] != ':') {
        return FALSE;
    }
 
    // Make sure that the length is at most 31 (excluding :)
    if (len > 32) {
        return FALSE;
    }
 
    // Make sure, the label starts with a letter
    if ((str[0] < 'a' || str[0] > 'z') && (str[0] < 'A' || str[0] > 'Z')) {
        return FALSE;
    }
 
    // Check the rest of the characters (excluding : at the end; len - 1)
    for (i = 1; i < len - 1; i++) {
        // If the character is neither a letter nor a digit, return false
        if ((str[i] < 'a' || str[i] > 'z') && (str[i] < 'A' || str[i] > 'Z') &&
            (str[i] < '0' || str[i] > '9')) {
            return FALSE;
        }
    }
 
    // Make sure we're not a saved instruction
    for (i = 0; i < sizeof(OPERATIONS) / sizeof(OpInfo); i++) {
        // Compare only until the character before the ":"
        if (strncmp(str, OPEARTIONS[i].name, len - 1) == 0) {
            return FALSE;
        }
    }
 
    // Make sure we're not a register
    for (i = 0; i < sizeof(REGISTER_NAMES) / sizeof(char *); i++) {
        if (strncmp(str, REGISTER_NAMES[i], len - 1) == 0) {
            return FALSE;
        }
    }
 
    return TRUE;
}
 
int main() {
    char str[] = "abcdef";
    printf("%s", str);
}
 
// a = "hello world"
// b = "hello israel"
// c = "hello world"
// strncmp(a, c, 500) // == 0
// strncmp(a, b, 5) // == 0
// strcmp(a, b) // != 0
 

Comments