Last active
August 29, 2015 14:07
-
-
Save Todd-Davies/0ec9e459f3f44ae673cc to your computer and use it in GitHub Desktop.
C character buffer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <ctype.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include "buffer.h" | |
/* | |
* Writes a character to the buffer | |
*/ | |
void writeToBuffer(Buffer *b, char c, int position) | |
{ | |
// Resize the array if needed | |
if(position == (b->length - 1)) | |
{ | |
b->length *= 2; | |
b->buffer = realloc(b->buffer, b->length*sizeof(char)); | |
if(b->buffer == 0){ | |
fprintf(stderr, "Failed to allocate memory to buffer\n"); | |
exit(0); | |
} | |
} | |
b->buffer[position] = c; | |
return; | |
} | |
/* | |
* Finds the number of characters in the buffer | |
*/ | |
int getLength(Buffer *b) | |
{ | |
int i = 0; | |
for(i = 0; i < b->length; i++) if(b->buffer[i] == '\0') break; | |
return i; | |
} | |
/* | |
* Converts the case of a single character | |
*/ | |
void convertCharCaseWithCount(char *c, int *toLower, int *toUpper) | |
{ | |
if(isupper(*c)) | |
{ | |
*c = tolower(*c); | |
++*toLower; | |
} | |
else if (islower(*c)) | |
{ | |
*c = toupper(*c); | |
++*toUpper; | |
} | |
} | |
/* | |
* Converts the case of a single character | |
*/ | |
void convertCharCase(char *c) | |
{ | |
int i = 0; | |
convertCharCaseWithCount(c, &i, &i); | |
} | |
/* | |
* Converts the case of a buffer | |
*/ | |
void convertCaseWithCount(Buffer *b, int *toLower, int *toUpper) | |
{ | |
int i; | |
for(i = 0; i < b->length; i++) | |
{ | |
convertCharCaseWithCount(&(b->buffer[i]), toLower, toUpper); | |
} | |
} | |
/* | |
* Converts the case of a buffer | |
*/ | |
void convertCase(Buffer *b) | |
{ | |
int i = 0; | |
convertCaseWithCount(b,&i,&i); | |
} | |
/* | |
* Sets up a buffer | |
*/ | |
Buffer* constructBuffer(Buffer *buffer) | |
{ | |
// Set the default buffer length | |
buffer->length = 20; | |
// Allocate the buffer | |
buffer->buffer = (char*)malloc(buffer->length); | |
if(buffer->buffer == 0) | |
{ | |
fprintf(stderr, "Failed to allocate memory to buffer\n"); | |
exit(0); | |
} | |
return buffer; | |
} | |
/* | |
* Reads a line into a Buffer | |
*/ | |
void readLine(Buffer *buffer) | |
{ | |
// Allocate temporary variables for the while loop | |
char c; | |
int input_length = 0; | |
// While we get characters from stdin | |
while((c = getchar()) != '\n') writeToBuffer(buffer, c, input_length++); | |
// Add a /0 at the end | |
writeToBuffer(buffer, '\0', input_length++); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Defines a simple String-like type | |
*/ | |
typedef struct | |
{ | |
int length; | |
char* buffer; | |
} Buffer; | |
/* | |
* Writes a character to the buffer | |
*/ | |
void writeToBuffer(Buffer *b, char c, int position); | |
/* | |
* Finds the number of characters in the buffer | |
*/ | |
int getLength(Buffer *b); | |
/* | |
* Converts the case of a single character | |
*/ | |
void convertCharCase(char *c); | |
/* | |
* Converts the case of a single character | |
*/ | |
void convertCharCaseWithCount(char *c, int *toLower, int *toUpper); | |
/* | |
* Converts the case of a buffer | |
*/ | |
void convertCaseWithCount(Buffer* b, int* toLower, int* toUpper); | |
/* | |
* Converts the case of a buffer | |
*/ | |
void convertCase(Buffer *b); | |
/* | |
* Sets up a buffer | |
*/ | |
Buffer* constructBuffer(Buffer *buffer); | |
/* | |
* Reads a line from stdin to the buffer | |
*/ | |
void readLine(Buffer *buffer); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment