Skip to content

Commit

Permalink
Lecture 112 - Creating some important stdlib functions
Browse files Browse the repository at this point in the history
  • Loading branch information
nibblebits committed Dec 17, 2020
1 parent 63656f4 commit d53f2cf
Show file tree
Hide file tree
Showing 6 changed files with 258 additions and 2 deletions.
11 changes: 10 additions & 1 deletion programs/blank/blank.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
#include "peachos.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char** argv)
{
printf("My age is %i\n", 98);
char words[] = "hello how are you";

const char* token = strtok(words, " ");
while(token)
{
printf("%s\n", token);
token = strtok(NULL, " ");
}

while(1)
{
}
Expand Down
10 changes: 9 additions & 1 deletion programs/stdlib/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FILES=./build/start.o ./build/peachos.asm.o ./build/peachos.o ./build/stdlib.o ./build/stdio.o
FILES=./build/start.o ./build/peachos.asm.o ./build/peachos.o ./build/stdlib.o ./build/stdio.o ./build/string.o ./build/memory.o
INCLUDES=-I./src
FLAGS= -g -ffreestanding -falign-jumps -falign-functions -falign-labels -falign-loops -fstrength-reduce -fomit-frame-pointer -finline-functions -Wno-unused-function -fno-builtin -Werror -Wno-unused-label -Wno-cpp -Wno-unused-parameter -nostdlib -nostartfiles -nodefaultlibs -Wall -O0 -Iinc

Expand All @@ -21,6 +21,14 @@ all: ${FILES}
i686-elf-gcc ${INCLUDES} $(FLAGS) -std=gnu99 -c ./src/stdio.c -o ./build/stdio.o


./build/string.o: ./src/string.c
i686-elf-gcc ${INCLUDES} $(FLAGS) -std=gnu99 -c ./src/string.c -o ./build/string.o

./build/memory.o: ./src/memory.c
i686-elf-gcc ${INCLUDES} $(FLAGS) -std=gnu99 -c ./src/memory.c -o ./build/memory.o



clean:
rm -rf ${FILES}
rm ./stdlib.elf
37 changes: 37 additions & 0 deletions programs/stdlib/src/memory.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include "memory.h"

void* memset(void* ptr, int c, size_t size)
{
char* c_ptr = (char*) ptr;
for (int i = 0; i < size; i++)
{
c_ptr[i] = (char) c;
}
return ptr;
}

int memcmp(void* s1, void* s2, int count)
{
char* c1 = s1;
char* c2 = s2;
while(count-- > 0)
{
if (*c1++ != *c2++)
{
return c1[-1] < c2[-1] ? -1 : 1;
}
}

return 0;
}

void* memcpy(void* dest, void* src, int len)
{
char *d = dest;
char *s = src;
while(len--)
{
*d++ = *s++;
}
return dest;
}
8 changes: 8 additions & 0 deletions programs/stdlib/src/memory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef PEACHOS_MEMORY_H
#define PEACHOS_MEMORY_H

#include <stddef.h>
void* memset(void* ptr, int c, size_t size);
int memcmp(void* s1, void* s2, int count);
void* memcpy(void* dest, void* src, int len);
#endif
176 changes: 176 additions & 0 deletions programs/stdlib/src/string.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
#include "string.h"

char tolower(char s1)
{
if (s1 >= 65 && s1 <= 90)
{
s1 += 32;
}

return s1;
}

int strlen(const char* ptr)
{
int i = 0;
while(*ptr != 0)
{
i++;
ptr += 1;
}

return i;
}

int strnlen(const char* ptr, int max)
{
int i = 0;
for (i = 0; i < max; i++)
{
if (ptr[i] == 0)
break;
}

return i;
}

int strnlen_terminator(const char* str, int max, char terminator)
{
int i = 0;
for(i = 0; i < max; i++)
{
if (str[i] == '\0' || str[i] == terminator)
break;
}

return i;
}

int istrncmp(const char* s1, const char* s2, int n)
{
unsigned char u1, u2;
while(n-- > 0)
{
u1 = (unsigned char)*s1++;
u2 = (unsigned char)*s2++;
if (u1 != u2 && tolower(u1) != tolower(u2))
return u1 - u2;
if (u1 == '\0')
return 0;
}

return 0;
}
int strncmp(const char* str1, const char* str2, int n)
{
unsigned char u1, u2;

while(n-- > 0)
{
u1 = (unsigned char)*str1++;
u2 = (unsigned char)*str2++;
if (u1 != u2)
return u1 - u2;
if (u1 == '\0')
return 0;
}

return 0;
}

char* strcpy(char* dest, const char* src)
{
char* res = dest;
while(*src != 0)
{
*dest = *src;
src += 1;
dest += 1;
}

*dest = 0x00;

return res;
}

char* strncpy(char* dest, const char* src, int count)
{
int i = 0;
for (i = 0; i < count-1; i++)
{
if (src[i] == 0x00)
break;

dest[i] = src[i];
}

dest[i] = 0x00;
return dest;
}

bool isdigit(char c)
{
return c >= 48 && c <= 57;
}
int tonumericdigit(char c)
{
return c - 48;
}

char* sp = 0;
char* strtok(char* str, const char* delimiters)
{
int i = 0;
int len = strlen(delimiters);
if (!str && !sp)
return 0;

if (str && !sp)
{
sp = str;
}

char* p_start = sp;
while(1)
{
for (i = 0; i < len; i++)
{
if(*p_start == delimiters[i])
{
p_start++;
break;
}
}

if (i == len)
{
sp = p_start;
break;
}
}

if (*sp == '\0')
{
sp = 0;
return sp;
}

// Find end of substring
while(*sp != '\0')
{
for (i = 0; i < len; i++)
{
if (*sp == delimiters[i])
{
*sp = '\0';
break;
}
}

sp++;
if (i < len)
break;
}

return p_start;
}
18 changes: 18 additions & 0 deletions programs/stdlib/src/string.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef PEACHOS_STRING_H
#define PEACHOS_STRING_H

#include <stdbool.h>

char tolower(char s1);
int strlen(const char* ptr);
int strnlen(const char* ptr, int max);
int strnlen_terminator(const char* str, int max, char terminator);
int istrncmp(const char* s1, const char* s2, int n);
int strncmp(const char* str1, const char* str2, int n);
char* strcpy(char* dest, const char* src);
char* strncpy(char* dest, const char* src, int count);
bool isdigit(char c);
int tonumericdigit(char c);
char* strtok(char* str, const char* delimiters);

#endif

0 comments on commit d53f2cf

Please sign in to comment.