-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Lecture 112 - Creating some important stdlib functions
- Loading branch information
1 parent
63656f4
commit d53f2cf
Showing
6 changed files
with
258 additions
and
2 deletions.
There are no files selected for viewing
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
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
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
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; | ||
} |
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
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 |
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
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; | ||
} |
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
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 |