spec changes

This commit is contained in:
Victor Fernandes 2017-01-31 15:15:51 -05:00
parent 7fd29eb693
commit b90c9f309c
2 changed files with 32 additions and 26 deletions

View File

@ -4,7 +4,7 @@
* Author: Victor Fernandes, 040772243 * Author: Victor Fernandes, 040772243
* Course: CST8152 - Compilers, Lab Section: 011 * Course: CST8152 - Compilers, Lab Section: 011
* Date: February 1, 2017 * Date: February 1, 2017
* Professor: Svillen Ravev * Professor: Svillen Ranev
* A character buffer utility with three modes of self-incrementation * A character buffer utility with three modes of self-incrementation
through dynamic memory allocation, and ability to set a mark flag. through dynamic memory allocation, and ability to set a mark flag.
* Function list: * Function list:
@ -22,8 +22,8 @@
* Called functions: calloc(), malloc(), free() * Called functions: calloc(), malloc(), free()
* Parameters: * Parameters:
- short init_capacity (0 - SHRT_MAX) - short init_capacity (0 - SHRT_MAX)
- char inc_factor (1 - 255) - char inc_factor (1 to 100 for multiplicative mode, 1 to 255 in additive mode, 0 for fixed mode)
- char o_mode (-1, 0, 1) - char o_mode (m, a, f)
* Return values: pBuffer or NULL * Return values: pBuffer or NULL
* Algorithm: Allocates memory for the buffer descriptor. If successful, do bound * Algorithm: Allocates memory for the buffer descriptor. If successful, do bound
checks on function parameters and assign them to the buffer's variables. If checks on function parameters and assign them to the buffer's variables. If
@ -35,7 +35,7 @@ Buffer* b_create(short init_capacity, char inc_factor, char o_mode) {
/* BEGIN CONFIGURING BUFFER */ /* BEGIN CONFIGURING BUFFER */
/* Check if init_capacity is within acceptable range */ /* Check if init_capacity is within acceptable range */
if (init_capacity > SHRT_MAX || init_capacity < MIN_CAPACITY) { if (init_capacity <= ZERO_CAPACITY) {
return NULL; return NULL;
} }
/* Leaving cb_head allocation for last in the event of bad input */ /* Leaving cb_head allocation for last in the event of bad input */
@ -51,9 +51,7 @@ Buffer* b_create(short init_capacity, char inc_factor, char o_mode) {
if (o_mode == 'f' || inc_factor == FIX_INC_FACTOR) { if (o_mode == 'f' || inc_factor == FIX_INC_FACTOR) {
pBD->mode = FIX_OP_MODE; pBD->mode = FIX_OP_MODE;
pBD->inc_factor = FIX_INC_FACTOR; pBD->inc_factor = FIX_INC_FACTOR;
} else if (o_mode == 'a' } else if (o_mode == 'a'){
&& (inc_factor >= MIN_INC_FACTOR)
&& (inc_factor <= MAX_ADD_INC_FACTOR)) {
pBD->mode = ADD_OP_MODE; pBD->mode = ADD_OP_MODE;
pBD->inc_factor = inc_factor; pBD->inc_factor = inc_factor;
} else if (o_mode == 'm' } else if (o_mode == 'm'
@ -89,7 +87,7 @@ Buffer* b_create(short init_capacity, char inc_factor, char o_mode) {
*/ */
int b_isfull(Buffer* const pBD) { int b_isfull(Buffer* const pBD) {
if (!pBD) { return R_FAIL1; } if (!pBD) { return R_FAIL1; }
if (pBD->addc_offset == pBD->capacity) { if (b_size(pBD) == b_capacity(pBD)) {
return TRUE; return TRUE;
} else { } else {
return FALSE; return FALSE;
@ -161,7 +159,7 @@ int b_mode(Buffer* const pBD) {
* Return value: size_t * Return value: size_t
*/ */
size_t b_incfactor(Buffer* const pBD) { size_t b_incfactor(Buffer* const pBD) {
if (!pBD) { return 256; } if (!pBD) { return ERR_INC_FACTOR; }
return (size_t) pBD->inc_factor; return (size_t) pBD->inc_factor;
} }
@ -225,10 +223,10 @@ char* b_cbhead(Buffer* const pBD) {
- pBuffer const pBD - pBuffer const pBD
* Return value: short * Return value: short
*/ */
short b_setmark(Buffer* const pBD, short mark) { char* b_setmark(Buffer* const pBD, short mark) {
if (!pBD || mark < 0 || mark > pBD->addc_offset) { return R_FAIL1; } if (!pBD || mark < 0 || mark > pBD->addc_offset) { return NULL; }
pBD->mark_offset = mark; pBD->mark_offset = mark;
return pBD->mark_offset; return (pBD->cb_head) + pBD->mark_offset;
} }
/* Reports the end-of-buffer flag state of the character buffer /* Reports the end-of-buffer flag state of the character buffer
@ -255,7 +253,7 @@ possible and needed
* Return value: pBuffer or NULL * Return value: pBuffer or NULL
* Algorithm: * Algorithm:
*/ */
Buffer* b_addc(Buffer* const pBD, char symbol) { pBuffer b_addc(pBuffer const pBD, char symbol) {
/* Variables used for calculating required space for reallocating cb_head /* Variables used for calculating required space for reallocating cb_head
for additive or multiplicative modes */ for additive or multiplicative modes */
short avail_space, new_inc, new_cap = 0; short avail_space, new_inc, new_cap = 0;
@ -265,8 +263,7 @@ Buffer* b_addc(Buffer* const pBD, char symbol) {
char *old_addr; char *old_addr;
char *tmp_addr; char *tmp_addr;
/* Check if pointers are valid before trying anything */ if (!pBD) {
if (!pBD || !pBD->cb_head) {
return NULL; return NULL;
} }
@ -292,7 +289,7 @@ Buffer* b_addc(Buffer* const pBD, char symbol) {
} }
avail_space = SHRT_MAX - pBD->capacity; avail_space = SHRT_MAX - pBD->capacity;
new_inc = (avail_space * (unsigned char) pBD->inc_factor / 100); new_inc = avail_space * ((unsigned char) pBD->inc_factor / 100);
/* Check if there is enough space for the new increment and /* Check if there is enough space for the new increment and
"trim" it if needed */ "trim" it if needed */
@ -358,9 +355,14 @@ int b_print(Buffer* const pBD) {
char char_buf; /* "Buffer" character to load before output */ char char_buf; /* "Buffer" character to load before output */
short tmp_offset = OFFSET_RESET; short tmp_offset = OFFSET_RESET;
if (!pBD || !pBD->cb_head) { return R_FAIL1; } if (!pBD || !pBD->cb_head) {
return R_FAIL1;
}
if (b_isempty(pBD) == TRUE) {
printf("The buffer is empty.\n");
}
if (b_isempty(pBD) == TRUE) { printf("The Buffer is empty.\n"); }
else { else {
tmp_offset = pBD->getc_offset; tmp_offset = pBD->getc_offset;
pBD->getc_offset = OFFSET_RESET; pBD->getc_offset = OFFSET_RESET;
@ -368,7 +370,7 @@ int b_print(Buffer* const pBD) {
char_buf = b_getc(pBD); char_buf = b_getc(pBD);
printf("%c", (char) char_buf); printf("%c", (char) char_buf);
char_count++; char_count++;
} while (b_eob(pBD) == FALSE); } while (!b_eob(pBD));
printf("\n"); printf("\n");
} }
/* Restore the getc_offset after printing */ /* Restore the getc_offset after printing */
@ -390,21 +392,21 @@ int b_load(FILE* const fi, Buffer* const pBD) {
int char_count = 0; /* Character counter */ int char_count = 0; /* Character counter */
if (!fi || !pBD) { if (!fi || !pBD) {
return LOAD_FAIL; return R_FAIL1;
} }
do { while (!feof(fi)) {
char_buf = (char) fgetc(fi); char_buf = (char) fgetc(fi);
if (char_buf == (char) EOF) {
if (char_buf == EOF) {
break; break;
} }
if (!b_addc(pBD, char_buf)) { if (!b_addc(pBD, char_buf)) {
return LOAD_FAIL; return LOAD_FAIL;
} }
char_count++; char_count++;
} while (!feof(fi)); }
return char_count; return char_count;
} }
@ -424,6 +426,7 @@ int b_reset(Buffer* const pBD) {
pBD->getc_offset = OFFSET_RESET; pBD->getc_offset = OFFSET_RESET;
pBD->mark_offset = OFFSET_RESET; pBD->mark_offset = OFFSET_RESET;
pBD->eob = UNSET_EOB_FLAG; pBD->eob = UNSET_EOB_FLAG;
pBD->r_flag = UNSET_R_FLAG;
return TRUE; return TRUE;
} }

View File

@ -14,7 +14,7 @@
/* standard header files */ /* standard header files */
#include <stdio.h> /* standard input/output */ #include <stdio.h> /* standard input/output */
#include <mm_malloc.h> /* for dynamic memory allocation. NOTE: USE MALLOC.H FOR LINUX/WINDOWS.THIS IS FOR MACOS ONLY*/ #include <malloc.h> /* for dynamic memory allocation. NOTE: USE MALLOC.H FOR LINUX/WINDOWS.THIS IS FOR MACOS ONLY*/
#include <limits.h> /* implementation-defined data type ranges and limits */ #include <limits.h> /* implementation-defined data type ranges and limits */
/* constant definitions */ /* constant definitions */
@ -40,6 +40,7 @@
#define OFFSET_RESET 0 /* reset character offset */ #define OFFSET_RESET 0 /* reset character offset */
#define ZERO_CAPACITY 0
#define MIN_CAPACITY 1 /* minimum character buffer capacity */ #define MIN_CAPACITY 1 /* minimum character buffer capacity */
#define FIX_INC_FACTOR 0 /* fixed increment factor constant */ #define FIX_INC_FACTOR 0 /* fixed increment factor constant */
#define MIN_INC_FACTOR 1 /* minimum additive increment factor constant */ #define MIN_INC_FACTOR 1 /* minimum additive increment factor constant */
@ -47,6 +48,8 @@
#define MAX_ADD_INC_FACTOR 255 /* maximum additive increment factor constant */ #define MAX_ADD_INC_FACTOR 255 /* maximum additive increment factor constant */
#define MAX_MUL_INC_FACTOR 100 /* maximum multiplicative increment factor constant */ #define MAX_MUL_INC_FACTOR 100 /* maximum multiplicative increment factor constant */
#define ERR_INC_FACTOR 256 /* return value in case of error on reading increment factor */
/* user data type declarations */ /* user data type declarations */
typedef struct BufferDescriptor { typedef struct BufferDescriptor {
char *cb_head; /* pointer to the beginning of character array (character buffer) */ char *cb_head; /* pointer to the beginning of character array (character buffer) */
@ -69,7 +72,7 @@ void b_free(Buffer* const);
int b_isfull(Buffer* const); int b_isfull(Buffer* const);
short b_size(Buffer* const); short b_size(Buffer* const);
short b_capacity(Buffer* const); short b_capacity(Buffer* const);
short b_setmark(Buffer* const, short); char* b_setmark(Buffer* const, short);
short b_mark(Buffer* const); short b_mark(Buffer* const);
int b_mode(Buffer* const); int b_mode(Buffer* const);
size_t b_incfactor(Buffer* const); size_t b_incfactor(Buffer* const);