Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
1aae21a
Adding sketch for buffers and contexts
leios Aug 5, 2024
1012cbf
replacing some of the cl functions with quibble context
leios Aug 6, 2024
fa8398b
small changes
leios Aug 6, 2024
c5f2c16
context -> canvas
leios Aug 9, 2024
d4b4a68
adding sketch for finding devices
leios Aug 9, 2024
bc1a8de
adding simple qbinfo command
leios Aug 9, 2024
498c0ce
updating how qb canvases are created
leios Aug 11, 2024
0ae86b0
moving kernel generation to quibble_context
leios Aug 11, 2024
206cafe
all necessary features for the quibble canvas are in
leios Aug 11, 2024
4b35af0
renaming quibble buffer convention to match canvas
leios Aug 11, 2024
1ae11bb
adding copy functions for buffers
leios Aug 12, 2024
8137dd6
adding draft for quibble inputs
leios Aug 13, 2024
52c8adb
typedefing everything
leios Aug 16, 2024
8a71c2a
adding skeleton for quibble_verses
leios Aug 18, 2024
fc2cfcc
almost done with preprocessing verses from DCOMPILE macro
leios Aug 18, 2024
da3dd5d
adding qb_replace_char_if_proceeding
leios Aug 19, 2024
7b0618d
adding testing for string functions in demo
leios Aug 20, 2024
2283fc5
modifying tests at start
leios Aug 20, 2024
02e9939
adding preamble parsing to kwargs
leios Aug 21, 2024
58c3d80
adding qb_create_preamble
leios Aug 21, 2024
a027a76
adding skeleton for qb_parse_verse
leios Aug 21, 2024
d41299b
adding sketch for qb_create_program. tests to come
leios Aug 25, 2024
e37a5b1
qb_create_program seems to work
leios Aug 26, 2024
9dbec32
fixing warnings
leios Aug 26, 2024
a165ab4
adding sketched for qb_***_to_string
leios Aug 26, 2024
19ff23d
preamble -> prologue
leios Aug 26, 2024
fe81d13
reworking DCOMPILE
leios Aug 26, 2024
00f7d38
small refactor to quibble_array -> string
leios Aug 26, 2024
44780f3
malloc -> calloc where appropriate
leios Aug 26, 2024
f5a84e2
Adding sketch for variadic function
leios Aug 27, 2024
4c0931c
'working' version for variadic function
leios Aug 28, 2024
1e9d32c
adding generic tests for verse configuration and echos
leios Sep 4, 2024
be09b78
restructuring buffers into inputs
leios Sep 4, 2024
d14bc7f
splitting off tests into separate file
leios Sep 5, 2024
4a937e9
working on android
leios Sep 8, 2024
c020c57
meh
leios Jun 7, 2025
7b5c73e
fixing warnings and messing with overall structure for input tests
leios Jun 10, 2025
7e79442
DCOMPILE -> QBINLINE
leios Jun 11, 2025
be8f8fe
restructuring everything into a quibble_program.c file
leios Jun 11, 2025
5ce1523
restructuring before major revision
leios Jun 11, 2025
38e1390
lots of changes. Nothing works, but it does mostly compile
leios Jun 12, 2025
a3055e3
fixing quibble_config_prologue
leios Jun 12, 2025
ba6b294
restructuring
leios Jun 12, 2025
fe5ebf1
simple commit before working on expansion logic
leios Jun 13, 2025
a257ce2
everything's in place. Now for a few days of testing...
leios Jun 13, 2025
fbf4f60
restructuring
leios Jun 14, 2025
b0ea329
moving QBINLINE -> IO
leios Jun 14, 2025
48f3d26
restructuring IO String tests
leios Jun 14, 2025
fd84749
parsing args / kwargs seems to work
leios Jun 14, 2025
efde438
works better now...
leios Jun 14, 2025
643b51b
freeing
leios Jun 14, 2025
9c78ea8
keyword -> kwarg ; prologue -> config
leios Jun 14, 2025
6f8e273
adding more arg parsing tests
leios Jun 15, 2025
4684577
refactorish
leios Jun 15, 2025
3150f5d
restructuring and messing with qbinline
leios Jun 15, 2025
86efc5d
replacing string functions with std library functions.
leios Jun 18, 2025
ad201a8
args and kwargs tests pass
leios Jun 19, 2025
8d7d668
seem to be parsing programs correctly
leios Jun 19, 2025
b17a2c2
mostly working, but still need to write some tests. Also added printing
leios Jun 20, 2025
e20ed5f
adding tests for create_program
leios Jun 20, 2025
e9c0e94
it runs, but the bodies need to be massaged
leios Jun 25, 2025
e2a16f1
works in principle, but I need to think about variable reuse
leios Jun 25, 2025
a32c790
adding configure and clean scripts
leios Jun 26, 2025
29bfdfa
adding config dir to tests
leios Jun 26, 2025
82cdf18
meh
leios Jun 27, 2025
3a979fc
splitting up my C file
leios Jun 27, 2025
717de09
decoupling qb canvas and qb info
leios Jun 27, 2025
88197ce
removing quibble inputs
leios Jun 27, 2025
c504451
building after rebase
leios Jul 4, 2025
f37444c
removing last doc file
leios Jul 4, 2025
94e030e
adding skeleton
leios Jul 4, 2025
c2694b2
programs -> program (singular)
leios Jul 4, 2025
4e303a1
adding variadic function to set arguments
leios Jul 4, 2025
5a41798
removing unnecessary bits from verses and quibble_canvases
leios Jul 4, 2025
b4825a1
meh
leios Jul 8, 2025
351359b
adding skeleton to parse type information of args / kwargs
leios Jul 8, 2025
8ae2f8f
testing the types
leios Jul 9, 2025
de2f43b
interem
leios Jul 9, 2025
2bc840f
setting args seems to work
leios Jul 9, 2025
d1278a7
restructuring arg parsing
leios Jul 9, 2025
1c98c5d
simplifying (and breaking) arg setting
leios Jul 9, 2025
931c141
it runs?
leios Jul 10, 2025
3c08fdc
adding condition for keywords in poem expansion
leios Jul 10, 2025
4a730b5
tests pass?
leios Jul 10, 2025
304a165
removing asan from CMakeLists.txt
leios Jul 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ CMake*
cmake*
*.bak

# Julia docs
docs/build/*
docs/Manifest.toml

quibble
qbinfo
46 changes: 44 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,19 +1,61 @@
cmake_minimum_required (VERSION 3.8)

set(CMAKE_C_COMPILER clang)
project (Quibble LANGUAGES C)
find_package(OpenCL REQUIRED)

if (MSVC)
add_compile_options(/W4)
else()
add_compile_options(-Wall -Wextra -Wpedantic -Wno-varargs)
endif()

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# QUIBBLE

add_executable(
quibble
include/macros.h

include/errors.h
src/errors.c

include/demo_functions.h
src/demo_functions.c
include/io.h
src/io.c

include/quibble_args.h
src/quibble_args.c

include/quibble_program.h
src/quibble_verses.c
src/quibble_stanzas.c
src/quibble_poems.c
src/quibble_program.c

test/tests.h
test/io_tests.c
test/program_tests.c

src/demo.c
)

target_link_libraries(quibble OpenCL::OpenCL)

# QBINFO

add_executable(
qbinfo

include/errors.h
src/errors.c

include/qbinfo.h
src/qbinfo.c
)

target_link_libraries(qbinfo OpenCL::OpenCL)

execute_process(COMMAND bash ${PROJECT_SOURCE_DIR}/configure)
9 changes: 9 additions & 0 deletions clean
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash
if [ -z ${XDG_CONFIG_HOME+x} ]; \
then config_dir="$HOME/.config/quibble"; echo "XDG_CONFIG_HOME is unset, attempting to clean $config_dir"; \
else config_dir="$XDG_CONFIG_HOME/quibble"; echo "attempting to clean $config_dir..."; \
fi

rm -r $config_dir

echo "done!"
11 changes: 11 additions & 0 deletions configure
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
cd $(dirname $0)
if [ -z ${XDG_CONFIG_HOME+x} ]; \
then config_dir="$HOME/.config/quibble"; echo "XDG_CONFIG_HOME is unset, using $config_dir"; \
else config_dir="$XDG_CONFIG_HOME/quibble"; echo "using $config_dir..."; \
fi

mkdir -p $config_dir/scribbles
cp scribbles/* $config_dir/scribbles/.

echo "done!"
12 changes: 0 additions & 12 deletions include/demo_functions.h

This file was deleted.

12 changes: 12 additions & 0 deletions include/errors.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@
#include "macros.h"
#include <CL/cl.h>

#include <stdio.h>
#include <stdlib.h>

// QBT -> Quibble Text
#define QBT_RED "\x1b[31m"
#define QBT_GREEN "\x1b[32m"
#define QBT_YELLOW "\x1b[33m"
#define QBT_BLUE "\x1b[34m"
#define QBT_MAGENTA "\x1b[35m"
#define QBT_CYAN "\x1b[36m"
#define QBT_RESET "\x1b[0m"

void cl_check(cl_int error);

const char *get_cl_error_string(cl_int error);
Expand Down
42 changes: 42 additions & 0 deletions include/io.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#ifndef IO_H
#define IO_H

#include <stdlib.h>
#include <string.h>
#include <png.h>
#include <stdlib.h>

typedef struct {
unsigned char red;
unsigned char green;
unsigned char blue;
unsigned char alpha;
} quibble_pixel;

quibble_pixel qb_zero_pixel(void);
quibble_pixel *qb_create_pixel_array(int height, int width);

char *qb_config_file(char *path);

size_t qb_find_type_size(char *type);

// String Manipulation
bool qb_is_space(char a);
char *qb_copy(char *buffer);
char *qb_strip_spaces(char *body, int start_index, int end_index);
int qb_find_next_char(char *body, int current_index, char a);
int qb_find_next_string(char *body, int current_index, char *a);
int qb_find_matching_char(char *body, int body_size, int current_index,
char a, char b);

void qb_replace_char(char *body, int body_size, char a, char b);
void qb_replace_next_char(char *content, int index, char a, char b);
void qb_replace_char_if_proceeding(char *content, char *query, char a, char b);

int qb_find_occurrences(char *query, char *body);

// QBINLINE
bool qb_is_inlined(char *verse);
void qb_preprocess_content(char *verse);

#endif
10 changes: 9 additions & 1 deletion include/macros.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
#ifndef MACROS_H
#define MACROS_H

//#define MAX_SOURCE_SIZE (0x100000)
// These numbers are arbitrarily set
// #define MAX_SOURCE_SIZE (0x100000)
#define MAX_SOURCE_SIZE (0x999999)
#define MAX_PROLOGUE_SIZE (0x100000)
#define MAX_META_SIZE (0x100000)

// I might want to ise 1.2 in the end...
#define CL_TARGET_OPENCL_VERSION 300
//#define CL_TARGET_OPENCL_VERSION 120

// Delay Compilation
#define QBINLINE(...) "// QBINLINE GENERATED\n" #__VA_ARGS__ "\0"

#endif
12 changes: 12 additions & 0 deletions include/qbinfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef QB_INFO_H
#define QB_INFO_H

#include "errors.h"
#include "macros.h"
#include <CL/cl.h>

char *get_device_name(cl_device_id device_id);
char *get_platform_name(cl_platform_id platform_id);
void qb_list_devices(void);

#endif
51 changes: 51 additions & 0 deletions include/quibble_args.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#ifndef QUIBBLE_ARGS_H
#define QUIBBLE_ARGS_H

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

#include "macros.h"
#include "io.h"

typedef struct{
char *type;
char *variable;
} quibble_arg;

typedef struct{
char *type;
char *variable;
char *value;
} quibble_kwarg;

void qb_find_type_arg(char *arg, char **type, char **variable);
void qb_parse_arg(quibble_arg *qa, char *arg);
void qb_parse_kwarg(quibble_kwarg *qk, char *lhs, char *rhs);

// Args / Kwargs
int qb_find_number_of_kwargs(char *config);
int qb_find_number_of_args(char *config);

quibble_arg *qb_parse_args(char *config, int num_entries);
quibble_kwarg *qb_parse_kwargs(char *config, int num_entries);

int qb_find_arg_index(quibble_arg *arg, int n, char *variable);
int qb_find_kwarg_index(quibble_kwarg *qk, int n, char *variable);

// prologue
char *qb_create_prologue(char *config, char *name,
quibble_arg *qargs, int num_args,
quibble_kwarg *qkwargs, int num_kwargs);

// Free
void qb_free_arg(quibble_arg arg);
void qb_free_kwarg(quibble_kwarg qkwarg);
void qb_free_arg_array(quibble_arg *args, int n);
void qb_free_kwarg_array(quibble_kwarg *qkwargs, int n);

// Printing
void qb_print_arg(quibble_arg qa);
void qb_print_kwarg(quibble_kwarg qk);

#endif
136 changes: 136 additions & 0 deletions include/quibble_program.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
#ifndef QUIBBLE_PROGRAM_H
#define QUIBBLE_PROGRAM_H

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdarg.h>

#include "macros.h"
#include <CL/cl.h>
#include "io.h"
#include "errors.h"
#include "quibble_args.h"

typedef struct{
char *body;
char *name;
quibble_kwarg *kwargs;
quibble_arg *args;
int num_kwargs;
int num_args;
} quibble_verse;

typedef struct{
quibble_kwarg *kwargs;
int num_kwargs;
quibble_arg *args;
int num_args;
char *name;
char *prologue;
char *epilogue;
} quibble_stanza;

typedef struct{
quibble_arg *args;
int num_args;
char *body;
char *name;
} quibble_poem;

typedef struct{
char *everything_else;
char *body;
quibble_verse *verse_list;
quibble_stanza *stanza_list;
quibble_poem *poem_list;
int num_verses;
int num_stanzas;
int num_poems;

// CL stuff
cl_platform_id *platform_ids;
cl_device_id *device_ids;
cl_uint num_devices;
cl_uint num_platforms;
int chosen_platform;
int chosen_device;
cl_context context;
cl_command_queue command_queue;
cl_program program;
cl_kernel *kernels;
bool configured;

} quibble_program;

// OpenCL Interface
char *get_device_name(cl_device_id device_id);
char *get_platform_name(cl_platform_id platform_id);
void qb_find_platforms(quibble_program *qp);
void qb_find_devices(quibble_program *qp);
void qb_configure_program(quibble_program *qp, int platform, int device);
void qb_run(quibble_program qp, char *kernel_name,
size_t global_item_size,
size_t local_item_size);
void qb_set_arg(quibble_program *qp, char *poem, char *arg, void *data);
void qb_set_args(quibble_program *qp, char *poem, int n, ...);


// string manip
bool qb_is_stanza(char *stanza, int offset);
bool qb_is_poem(char *poem, int offset);
bool qb_is_verse(char *verse, int offset);

// Reads an input file and parses everything into verses or OCL functions
quibble_program qb_parse_program(char *buffer);
quibble_program qb_parse_program_file(char *filename);
quibble_verse qb_find_verse(quibble_program qp, char *verse_name);
quibble_stanza qb_find_stanza(quibble_program qp, char *stanza_name);
quibble_poem qb_find_poem(quibble_program qp, char *poem_name);
int qb_find_verse_index(quibble_program qp, char *verse_name);
int qb_find_stanza_index(quibble_program qp, char *stanza_name);
int qb_find_poem_index(quibble_program qp, char *poem_name);

// Parsing from file
quibble_stanza qb_parse_stanza(char *stanza);
quibble_poem qb_parse_poem(char *stanza);
quibble_verse qb_parse_verse(char *verse);

// Build / expansion
bool qb_find_keyword(quibble_program qp, char *keyword);
bool qb_find_keyword_in_verses(quibble_program qp, char *keyword);
bool qb_find_keyword_in_stanzas(quibble_program qp, char *keyword);
bool qb_find_keyword_in_poems(quibble_program qp, char *keyword);
char *qb_create_prologue(char *config, char *name,
quibble_arg *args, int num_args,
quibble_kwarg *qkwargs, int num_kwargs);
void qb_build_program(quibble_program *qp);
void qb_rebuild_program(quibble_program *qp);
char *qb_expand_verse(quibble_program qp, char* verse_name, char *prologue);
char *qb_expand_stanza(quibble_program qp,
char* stanza_name, char *prologue, char *body);
char *qb_expand_poem(quibble_program qp, int index);

void qb_rebuild_program(quibble_program *qp);
void qb_build_program(quibble_program *qp);

// Free
void qb_free_arg(quibble_arg arg);
void qb_free_kwarg(quibble_kwarg qkwarg);
void qb_free_verse(quibble_verse qv);
void qb_free_stanza(quibble_stanza qs);
void qb_free_poem(quibble_poem qp);
void qb_free_kwarg_array(quibble_kwarg *qkwargs, int n);
void qb_free_arg_array(quibble_arg *args, int n);
void qb_free_program(quibble_program qp);

// Printing
void qb_print_arg(quibble_arg qa);
void qb_print_kwarg(quibble_kwarg qk);
void qb_print_verse(quibble_verse qv);
void qb_print_stanza(quibble_stanza qs);
void qb_print_poem(quibble_poem qp);
void qb_print_program(quibble_program qp);
void print_cl_info(quibble_program qp);

#endif
Loading