spec changes
This commit is contained in:
parent
7fd29eb693
commit
b90c9f309c
51
buffer.c
51
buffer.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
7
buffer.h
7
buffer.h
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue