Skip to content

Commit

Permalink
adds array.includes
Browse files Browse the repository at this point in the history
  • Loading branch information
sebbekarlsson committed Jan 6, 2023
1 parent d4dcf30 commit f254f70
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 3 deletions.
18 changes: 18 additions & 0 deletions docs/signatures.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,12 @@ response fetch(GLMS_AST_TYPE_STRING URL)
### string (struct)
<details><summary>props</summary>

### string.includes
```
GLMS_AST_TYPE_BOOL string.includes(GLMS_AST_TYPE_STRING needle)
```

### string.replace
```
GLMS_AST_TYPE_STRING string.replace(GLMS_AST_TYPE_STRING pattern, GLMS_AST_TYPE_STRING replacement)
Expand All @@ -252,10 +258,22 @@ GLMS_AST_TYPE_STRING string.replace(GLMS_AST_TYPE_STRING pattern, GLMS_AST_TYPE_
> No signatures defined.

### array.includes
> No signatures defined.

### array.count
> No signatures defined.

### array.filter
> No signatures defined.

### array.length
> No signatures defined.


</details>

Expand Down
4 changes: 2 additions & 2 deletions include/glms/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

#define GLMS_VERSION_MAJOR 0
#define GLMS_VERSION_MINOR 0
#define GLMS_VERSION_PATCH 2
#define GLMS_VERSION_PATCH 3

#define GLMS_VERSION_STRING "0.0.2"
#define GLMS_VERSION_STRING "0.0.3"

#endif
5 changes: 5 additions & 0 deletions sample/array_includes.gs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
array arr = [5, 3, 7, 0, 10];

print(arr.includes(5));
print(arr.includes(0));
print(arr.includes(99));
5 changes: 5 additions & 0 deletions sample/string_includes.gs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
string name = "John Doe";

print(name.includes("John"));
print(name.includes("Doe"));
print(name.includes("test"));
28 changes: 28 additions & 0 deletions src/modules/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,33 @@ int glms_array_fptr_length(GLMSEval *eval, GLMSAST *ast, GLMSASTBuffer *args,
return 1;
}

int glms_array_fptr_includes(GLMSEval *eval, GLMSAST *ast, GLMSASTBuffer *args,
GLMSStack *stack, GLMSAST *out) {

int64_t len = ast->children ? ast->children->length : 0;

if (len <= 0 || (args == 0 || args->length <= 0 || args->items == 0)) {
*out = (GLMSAST){ .type = GLMS_AST_TYPE_BOOL, .as.boolean = false };
return 1;
}


GLMSAST compare = args->items[0];

for (int64_t i = 0; i < len; i++) {
GLMSAST* child = ast->children->items[i];

if (glms_ast_compare_equals_equals(*child, compare)) {
*out = (GLMSAST){ .type = GLMS_AST_TYPE_BOOL, .as.boolean = true };
return 1;
}
}

*out = (GLMSAST){ .type = GLMS_AST_TYPE_BOOL, .as.boolean = false };

return 1;
}

void glms_array_constructor(GLMSEval *eval, GLMSStack *stack,
GLMSASTBuffer *args, GLMSAST *self) {

Expand All @@ -194,6 +221,7 @@ void glms_array_constructor(GLMSEval *eval, GLMSStack *stack,
glms_ast_register_function(eval->env, self, "push", glms_array_fptr_push);
glms_ast_register_function(eval->env, self, "length", glms_array_fptr_length);
glms_ast_register_function(eval->env, self, "count", glms_array_fptr_length);
glms_ast_register_function(eval->env, self, "includes", glms_array_fptr_includes);
}

void glms_array_type(GLMSEnv *env) {
Expand Down
33 changes: 32 additions & 1 deletion src/modules/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,26 @@ int glms_string_fptr_replace(GLMSEval *eval, GLMSAST *ast, GLMSASTBuffer *args,
*out = (GLMSAST){ .type = GLMS_AST_TYPE_STACK_PTR, .as.stackptr.ptr = new_ast };

return 1;

}

int glms_string_fptr_includes(GLMSEval *eval, GLMSAST *ast, GLMSASTBuffer *args,
GLMSStack *stack, GLMSAST *out) {

if (!glms_eval_expect(eval, stack, (GLMSASTType[]){ GLMS_AST_TYPE_STRING }, 1, args)) return 0;

const char* needle = glms_ast_get_string_value(&args->items[0]);
const char* value = glms_ast_get_string_value(ast);


if (!needle || !value) {

*out = (GLMSAST){ .type = GLMS_AST_TYPE_BOOL, .as.boolean = false };
return 1;
}

*out = (GLMSAST){ .type = GLMS_AST_TYPE_BOOL, .as.boolean = (strstr(value, needle) != 0) };

return 1;
}

void glms_string_constructor(GLMSEval *eval, GLMSStack *stack,
Expand All @@ -73,6 +92,7 @@ void glms_string_constructor(GLMSEval *eval, GLMSStack *stack,

glms_ast_register_operator_overload(eval->env, self, GLMS_TOKEN_TYPE_ADD, glms_string_type_op_overload_add);
glms_ast_register_function(eval->env, self, "replace", glms_string_fptr_replace);
glms_ast_register_function(eval->env, self, "includes", glms_string_fptr_includes);

glms_env_register_function_signature(
eval->env,
Expand All @@ -84,6 +104,17 @@ void glms_string_constructor(GLMSEval *eval, GLMSStack *stack,
.args_length = 2
}
);

glms_env_register_function_signature(
eval->env,
self,
"includes",
(GLMSFunctionSignature){
.return_type = (GLMSType){ GLMS_AST_TYPE_BOOL },
.args = (GLMSType[]){ (GLMSType){ GLMS_AST_TYPE_STRING, .valuename = "needle" }},
.args_length = 1
}
);
}

void glms_string_type(GLMSEnv *env) {
Expand Down

0 comments on commit f254f70

Please sign in to comment.