Increased token size! Added more doc comments.

This commit is contained in:
= 2020-05-08 06:18:20 +01:00
parent 73bfffcf55
commit 944d9287dc
3 changed files with 63 additions and 25 deletions

View File

@ -182,7 +182,7 @@ void code_window_load(Window *window)
GRect result_bounds = GRect(6, 128, 132, 132);
s_result_text_layer = text_layer_create(result_bounds);
text_layer_set_text(s_result_text_layer, "R: ");
text_layer_set_font(s_result_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
text_layer_set_font(s_result_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD));
text_layer_set_text_alignment(s_result_text_layer, GTextAlignmentRight);
layer_add_child(window_get_root_layer(s_code_window), text_layer_get_layer(s_result_text_layer));

View File

@ -56,7 +56,11 @@ Object *itemAt(const Object *listObj, int n)
return march;
}
// Returns last object in list (->forward == NULL)
/**
* Returns a pointer to the last Object in the given list.
* @param listObj The list to find the tail of
* @return A pointer to the last Object if it is found, or NULL on an error
*/
Object *tail(const Object *listObj)
{
if(!listObj || listObj->type != TYPE_LIST)
@ -70,11 +74,13 @@ Object *tail(const Object *listObj)
}
/**
* Checks if a given object is empty
* Checks if a given object is empty.
*
* BOOL, NUMBER, and ERROR types return true only when 0
* LIST, LAMBDA, and FUNC types return true only when NULL
* SYMBOL returns true only when it begins with a nullchar
* Returns false if obj is NULL
* @param obj A pointer to the object to check
* @return True only if the non-null Object is empty/non-zero
*/
inline int isEmpty(const Object *obj)
{
@ -100,6 +106,12 @@ inline int isEmpty(const Object *obj)
}
}
/**
* Allocate a copy of a given object into the given pointer.
* Does nothing if `spot` is NULL
* @param spot A pointer to the Object pointer that needs allocating
* @param src The Object to copy from
*/
void allocObject(Object **spot, const Object src)
{
if(!spot)
@ -109,12 +121,21 @@ void allocObject(Object **spot, const Object src)
(*spot)->forward = NULL;
}
// Insert `src` into list `dest` before index `ind`
// Adds to the end if the index is too high.
void insertIntoList(Object *dest, int ind, const Object src)
/**
* Inserts a given Object into a list at the given index.
* Immediately returns if `dest` is NULL or not a list type
* Adds to the end of the list if the index is higher than the list length
* @param dest The list to insert into
* @param ind The index to insert at
* @param src The Object to add to the list
* @warning UNTESTED
*/
void insertIntoList(Object *dest, unsigned ind, const Object src)
{
// Only work with non-null list types
if(!dest || dest->type != TYPE_LIST || ind < 0)
if(!dest || dest->type != TYPE_LIST)
return;
if(isEmpty(dest)) {
@ -125,7 +146,7 @@ void insertIntoList(Object *dest, int ind, const Object src)
// TODO Check for off-by-one errors
// ensure pointers connect old and new
Object *march = dest->list;
for(int i = 1; i < ind; i++) {
for(unsigned i = 1; i < ind; i++) {
if(march->forward == NULL) {
allocObject(&march->forward, src);
return;
@ -139,15 +160,30 @@ void insertIntoList(Object *dest, int ind, const Object src)
march->forward->forward = oldForward;
}
/**
* Replace an object in a list at a given index with a given object
* Attempts to clean the replaced Object before adding the new one
* Immediately returns if `list` is NULL or not a list type
* @param list The list Object to replace an element of
* @param i The index of the element to replace
* @param src The Object to copy into the list
*/
void replaceListing(Object *list, int i, const Object src)
{
if(!list)
if(!list || list->type != TYPE_LIST)
return;
list[i] = src;
list[i].forward = NULL;
Object *replace = itemAt(list, i);
cleanObject(replace);
*replace = src;
replace->forward = NULL;
}
// Adds an object to the end of a list object
/**
* Adds an Object to the end of a list
* Does nothing if `dest` is NULL or not a list type
* @param dest The list to append to
* @param src The Object to copy into the list
*/
void nf_addToList(Object *dest, const Object src)
{
if(!dest || dest->type != TYPE_LIST)
@ -158,8 +194,7 @@ void nf_addToList(Object *dest, const Object src)
return;
}
Object *end = tail(dest);
allocObject(&end->forward, src);
allocObject(&tail(dest)->forward, src);
}
void printErr(const Object *obj)
@ -302,24 +337,27 @@ void printAndClean(Object *target)
// Frees all objects in a list
void deleteList(const Object *dest)
{
if(!dest)
return;
if(dest->type != TYPE_LIST) {
printf("Tried to delete something other than a list\n");
return;
}
Object *tail = dest->list;
while(tail != NULL) {
Object *prevTail = tail;
tail = tail->forward;
cleanObject(prevTail);
free(prevTail);
Object *march = dest->list;
while(march != NULL) {
Object *prevMarch = march;
march = march->forward;
cleanObject(prevMarch);
free(prevMarch);
}
}
/**
* Copies all items from `src` to `dest`
* Does nothing if either is NULL, or neither are lists
* First deletes all items from `dest`
* Does nothing if either is NULL, or not a list type
* Deletes all items from `dest` before copying
*/
void copyList(Object *dest, const Object *src)
{

View File

@ -1,7 +1,7 @@
#ifndef OBJECT_H
#define OBJECT_H
#define MAX_TOK_LEN 4 // 11
#define MAX_TOK_LEN 10 // 11
#define MAX_TOK_CNT 128 // 128
#define MAX_ENV_ELM 15 // 50
@ -79,7 +79,7 @@ int getType(const Object *obj);
int isEmpty(const Object *obj);
Object *tail(const Object *listObj);
void insertIntoList(Object *dest, int ind, const Object src);
void insertIntoList(Object *dest, unsigned ind, const Object src);
void replaceListing(Object *list, int i, const Object src);
void nf_addToList(Object *dest, Object src);
void deleteList(const Object *dest);