#ifndef PARSERESULT_H #define PARSERESULT_H #include <inttypes.h> #include <stdio.h> char* clearType(char* inp); /** Represents the possible field values for a MIPS32 machine instruction. * * A ParseResult object is said to be proper iff: * * - Each of the char* members is either NULL or points to a zero- * terminated C-string. * - If ASMInstruction is not NULL, the contents of the array represent * a MIPS32 assembly instruction. * - If ASMInstruction is not NULL, the other fields are set to properly * represent the corresponding fields of the MIPS32 assembly instruction * stored in ASMInstruction. * - Each field that is not relevant to the MIPS32 assembly instruction * is set as described in the comments below. */ struct _ParseResult { // Each char* member will be NULL or point to dynamically-allocated char array // holding a zero-terminated C string. // The assembly code portion char* ASMInstruction; // the assembly instruction, as a C-string char* Mnemonic; // the symbolic name of the instruction char* rdName; // the symbolic names of the registers, as C-strings; char* rsName; // NULL if the register field is not specified char* rtName; // in the assembly instruction // The following are integer values int16_t Imm; // the immediate field, as a signed integer; // 0 if not relevant for the assembly instruction uint8_t rd; // the three register fields, as small unsigned integers; uint8_t rs; // 255 if not relevant for the assembly instruction uint8_t rt; char* shamt; // shift amount char* Target; // target for jump instructions // The computed machine code portion // These are malloc'd zero-terminated C-strings char* Opcode; // the opcode field bits char* Funct; // the funct field bits // NULL if not relevant for the assembly instruction char* RD; // the bit representations of the register numbers; char* RS; // NULL if not relevant for the assembly instruction char* RT; char* IMM; // 2's complement bit representation of the immediate; // NULL if not relevant for the assembly instruction }; typedef struct _ParseResult ParseResult; /** Frees the dynamic content of a ParseResult object. * * Pre: pPR points to a proper ParseResult object. * Post: All of the dynamically-allocated arrays in *pPR have been * deallocated. * *pPR is proper. * * Comments: * - The function has no information about whether *pPR has been * allocated dynamically, so it cannot risk attempting to * deallocate *pPR. * - The function is intended to provide the user with a simple * way to free memory; the user may or may not reuse *pPR. So, * the function does set the pointers in *pPR to NULL. */ void clearResult(ParseResult* const pPR); /** Prints the contents of a ParseResult object. * * Pre: Log is open on an output file. * pPR points to a proper ParseResult object. */ void printResult(FILE* Log, const ParseResult* const pPR); #endif