Implement read file and extract tokens.
This commit is contained in:
parent
14254b7db2
commit
1b517751f9
|
@ -2,5 +2,17 @@
|
||||||
#define TOKENIZER_H
|
#define TOKENIZER_H
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name extractTokens
|
||||||
|
* @return int
|
||||||
|
* @brief Extract only allowed characters from buffer;
|
||||||
|
*
|
||||||
|
* @param char* buffer: extractTokens_buffer
|
||||||
|
* @param char* tokens: extractTokens_tokens
|
||||||
|
*/
|
||||||
|
int extractTokens (char* buffer, char* tokens);
|
||||||
|
|
||||||
#endif//TOKENIZER_H
|
#endif//TOKENIZER_H
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "../include/analyzer.h"
|
#include "../include/analyzer.h"
|
||||||
#include "../include/assembling.h"
|
#include "../include/assembling.h"
|
||||||
|
@ -20,5 +21,69 @@ int main (int argc, char** argv) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse arguments */
|
||||||
|
char* filename = argv[1];
|
||||||
|
|
||||||
|
|
||||||
|
/* read file into buffer */
|
||||||
|
FILE* fd = 0; /* File descriptor */
|
||||||
|
fd = fopen(filename, "r");
|
||||||
|
|
||||||
|
/* make sure the file was loaded successfully */
|
||||||
|
if (!fd) {
|
||||||
|
perror("ERROR: Could not open file!");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create buffer and read file */
|
||||||
|
size_t chunk_size = 512;
|
||||||
|
char* buffer;
|
||||||
|
|
||||||
|
/* Allocate memory for buffer */
|
||||||
|
buffer = malloc(sizeof(char) * chunk_size);
|
||||||
|
if (!buffer) {
|
||||||
|
/* Error */
|
||||||
|
perror("malloc error on memory allocation of: buffer");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t total_size;
|
||||||
|
size_t bytes_read;
|
||||||
|
size_t buffer_size = chunk_size;
|
||||||
|
|
||||||
|
for (;( bytes_read = fread(buffer + total_size, 1, chunk_size, fd) ) > 0;) {
|
||||||
|
total_size += bytes_read;
|
||||||
|
|
||||||
|
if ( total_size + chunk_size > buffer_size ) {
|
||||||
|
buffer_size += chunk_size;
|
||||||
|
buffer = (char*)realloc(buffer, buffer_size);
|
||||||
|
if (!buffer) {
|
||||||
|
perror("ERROR: Could not reallocate file buffer!");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* extract tokens from buffer */
|
||||||
|
char* tokens;
|
||||||
|
/* Allocate memory for tokens */
|
||||||
|
tokens = (char*)malloc(sizeof(char) * 1);
|
||||||
|
if (!tokens) {
|
||||||
|
/* Error */
|
||||||
|
perror("malloc error on memory allocation of: tokens");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
extractTokens(buffer, tokens);
|
||||||
|
|
||||||
|
/* end of lifetime for buffer */
|
||||||
|
free( buffer );
|
||||||
|
|
||||||
|
/* Just print the tokens as example. */
|
||||||
|
for (char* index = tokens; *index; index++) {
|
||||||
|
(void)printf("%c", *index);
|
||||||
|
}
|
||||||
|
(void)printf("\n");
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1,44 @@
|
||||||
#include "../include/tokenizer.h"
|
#include "../include/tokenizer.h"
|
||||||
|
|
||||||
|
static char operators[] = {'>', '<', '+', '-', ',', '.', '[', ']'};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name extractTokens
|
||||||
|
* @return int
|
||||||
|
* @brief Extract only allowed tokens from buffer.
|
||||||
|
*
|
||||||
|
* @param char* buffer
|
||||||
|
* @param char* tokens
|
||||||
|
*/
|
||||||
|
int extractTokens (char* buffer, char* tokens) {
|
||||||
|
int rv = 0;
|
||||||
|
|
||||||
|
size_t token_size = 1;
|
||||||
|
size_t tokens_found = 0;
|
||||||
|
|
||||||
|
for (char* cursor = buffer; *cursor; cursor++) {
|
||||||
|
|
||||||
|
/* check tokens size and reallocate if necessary */
|
||||||
|
if (tokens_found >= token_size) {
|
||||||
|
token_size *= 2;
|
||||||
|
tokens = (char*)realloc(tokens, token_size);
|
||||||
|
if (!tokens) {
|
||||||
|
perror("ERROR: Could not expand token array!");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if current symbol is a token */
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
if (*cursor == operators[i]) {
|
||||||
|
tokens[tokens_found] = *cursor;
|
||||||
|
tokens_found++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = tokens_found;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue