Version 1

This commit is contained in:
Emil 2023-08-06 20:51:57 -06:00
parent 935243d8b4
commit d95043bd15
23 changed files with 409 additions and 324 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
build build
probotic probotic
config.h config.h
*/**.out
.gdb_history .gdb_history
*.sqlite *.sqlite
build.sh build.sh

11
CHANGELOG Normal file
View File

@ -0,0 +1,11 @@
Upgraded to just Make
New entries in project_list.sql
Deleted various irrelevant files
Updated project goals
Pruned pair parser
Reduced creds struct
ADDED NVULN=1 build option to remove kill, raw and dump
ADDED new -url option
Updated Version to 1

View File

@ -1,11 +1,35 @@
# note that this file does not properly handle options # note that this file does not properly handle options
PROGN:=probotic
CFLAGS:=-std=c99 -Wall -Wextra -Wpedantic -Wvla -Wshadow -Wundef
CPPFLAGS:=-I/usr/include/libircclient/ -Iinclude -D_GNU_SOURCE -DPROGN=\"${PROGN}\" -D_FORTIFY_SOURCE=2
LDLIBS:=-lircclient -lsqlite3
SRC := api.c irc.c main.c parse.c unity.c SRC := api.c irc.c main.c parse.c unity.c
HDR := api.h error.h irc.h irccolors.h parse.h stmt.h HDR := api.h error.h irc.h irccolors.h parse.h stmt.h
DEBUG := 1
probotic: $(SRC) $(HDR) ifeq (${DEBUG},1)
DEBUG=$(DEBUG) ./build.sh CFLAGS += -Og -ggdb
else
CFLAGS += -O3 -flto=auto -fomit-frame-pointer
endif
ifdef SAN
CFLAGS += -fsanitize=${SAN}
endif
ifeq (${NVULN},1)
CPPFLAGS += -DNO_VULN_COMMANDS
endif
${PROGN}: ${HDR} ${SRC}
${LINK.c} src/unity.c -o $@ ${LDLIBS}
# do nothing but update them... # do nothing but update them...
$(SRC) $(HDR): $(SRC) $(HDR):
.PHONY: clean
clean:
-rm ${OBJ}

View File

@ -18,8 +18,7 @@ INSERT INTO tag VALUES('Tools');
INSERT INTO project (title, body) VALUES ( INSERT INTO project (title, body) VALUES (
'IRC Bot', 'IRC Bot',
'Build an IRC Bot using SQLite3 and libircclient\nhttps://www.sqlite.org/index.html\n 'Contribute to Probotic'
http://www.ulduzsoft.com/libircclient/'
); );
INSERT INTO assignment (who, project) VALUES ( INSERT INTO assignment (who, project) VALUES (

View File

@ -1,7 +1,7 @@
-- Starting off: -- Starting off:
INSERT INTO project (title, difficulty, span) VALUES ('Hello world', 1, 1); INSERT INTO project (title, difficulty, span) VALUES ('Hello world', 1, 1);
INSERT INTO project (title, difficulty, span) VALUES ('Fizz Buzz', 1, 1); INSERT INTO project (title, difficulty, span) VALUES ('Fizz Buzz', 1, 1);
INSERT INTO project (title, difficulty, span) VALUES ('Data Structures (Stacks, Heaps, Binary Trees, etc)', 2, 7); INSERT INTO project (title, difficulty, span) VALUES ('Data Structures (Stack, List, Heap, Binary Tree, etc)', 2, 7);
-- AI: -- AI:
INSERT INTO project (title, difficulty, span) VALUES ('Neural Network', 2, 7); INSERT INTO project (title, difficulty, span) VALUES ('Neural Network', 2, 7);
@ -46,7 +46,8 @@ INSERT INTO project (title, difficulty, span) VALUES ('BitTorrent Client', 2, 30
INSERT INTO project (title, difficulty, span, body) VALUES ('Your own Operating system', 4, 30, 'wiki.osdev.org'); INSERT INTO project (title, difficulty, span, body) VALUES ('Your own Operating system', 4, 30, 'wiki.osdev.org');
-- Rendering: -- Rendering:
INSERT INTO project (title, difficulty, span) VALUES ('3D CAD Software', 4, 7); -- INSERT INTO project (title, difficulty, span) VALUES ('3D CAD Software', 4, 7);
INSERT INTO project (title, difficulty, span) VALUES ('2D Vertex Editor', 3, 30);
INSERT INTO project (title, difficulty, span) VALUES ('3D Vertex Editor', 3, 30); INSERT INTO project (title, difficulty, span) VALUES ('3D Vertex Editor', 3, 30);
INSERT INTO project (title, difficulty, span) VALUES ('Bitmap Raytracer', 3, 7); INSERT INTO project (title, difficulty, span) VALUES ('Bitmap Raytracer', 3, 7);
INSERT INTO project (title, difficulty, span) VALUES ('Media Player (Think MPV & VLC)', 3, 30); INSERT INTO project (title, difficulty, span) VALUES ('Media Player (Think MPV & VLC)', 3, 30);
@ -54,15 +55,97 @@ INSERT INTO project (title, difficulty, span) VALUES ('Music Player Daemon Imple
INSERT INTO project (title, difficulty, span) VALUES ('Image to ASCII (BONUS: Use Unicode or Color)', 2, 7); INSERT INTO project (title, difficulty, span) VALUES ('Image to ASCII (BONUS: Use Unicode or Color)', 2, 7);
-- Simulation: -- Simulation:
INSERT INTO project (title, difficulty, span) VALUES ('Hydrodynamics', 2, 7); -- INSERT INTO project (title, difficulty, span) VALUES ('Hydrodynamics', 2, 7);
INSERT INTO project (title, difficulty, span) VALUES ('Aerodynamics', 2, 7); -- INSERT INTO project (title, difficulty, span) VALUES ('Aerodynamics', 2, 7);
INSERT INTO project (title, difficulty, span) VALUES ('Rigid Body Physics', 2, 7); INSERT INTO project (title, difficulty, span) VALUES ('Rigid Body Physics', 2, 7);
INSERT INTO project (title, difficulty, span) VALUES ('Voronoi Diagram (HARDMODE: hardware rendering)', 1, 7); INSERT INTO project (title, difficulty, span) VALUES ('Voronoi Diagram (HARDMODE: hardware rendering)', 1, 7);
-- Tools (Usable and Applied Algorithms): -- Tools (Usable and Applied Algorithms):
INSERT INTO project (title, difficulty, span) VALUES ('Terminal Emulator', 3, 7); INSERT INTO project (title, difficulty, span) VALUES ('Terminal Emulator', 3, 7);
INSERT INTO project (title, difficulty, span) VALUES ('Text Editor', 3, 7); INSERT INTO project (title, difficulty, span) VALUES ('Text Editor (Autosave with dates, Configurable binds)', 3, 7);
INSERT INTO project (title, difficulty, span) VALUES ('Syntax Highlighter (preferably for your own editor)', 2, 30); INSERT INTO project (title, difficulty, span) VALUES ('Syntax Highlighter (preferably for your own editor)', 2, 30);
INSERT INTO project (title, difficulty, span) VALUES ('General Compression Library (Think zlib)', 2, 30); INSERT INTO project (title, difficulty, span) VALUES ('General Compression Library', 2, 30);
INSERT INTO project (title, difficulty, span) VALUES ('Multi-Threaded GREP Implementation (BONUS: Highlighting and line numbers)(Hint: use pThread and AIO)', 2, 30); INSERT INTO project (title, difficulty, span) VALUES ('Multi-Threaded GREP Implementation (BONUS: Highlighting and line numbers)(Hint: use pThread and AIO)', 2, 30);
INSERT INTO project (title, difficulty, span) VALUES ('Vector/Bitmap Image Manipulation Program', 2, 30); INSERT INTO project (title, difficulty, span) VALUES ('Vector/Bitmap Image Manipulation Program', 2, 30);
-- V4, pruned and slightly revised
INSERT INTO project (title, difficulty, span) VALUES ('Download Manager', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Make an elastic producer/consumer task queue', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Markov Chain Sentence Generator', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('English Sentence Parser that points the Context of a Sentence', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('MIDI Player + Editor', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Stock Market Simulator Using Yahoo Spreadsheet Data', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Parametric/Graphic Equalizer for .wav files', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('To-Do List Application', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Verlet Integration', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('TCP/UDP Chat Server + Client (Bonus: No web browser needed)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Music Streaming', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Shazam', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Chatbot', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Curses Text Editor', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('paint.net Clone', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Image to ASCII Art', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Booru (Image Board) Image Downloader', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Image Converter (png -> jpeg -> avif)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('ID3 Reader', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Sound Synthesis (Sine, Square, Sawtooth, etc.) ("Fuck You" mode: Realtime MIDI Playback with Custom instruments)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('C++ IDE Plugin for your Text Editor', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Simple Version Control System supporting branches, commits with messages, unlocking, and per-file configuration of number of revisions and blame. ("Fuck You" mode: Do it all)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Imageboard (Think vichan)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Password Manager (think KeePassXC)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Torrent Client', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Booru Client', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Key Press Bot', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('IP/URL Obscurification (http://www.pc-help.org/obscure.htm)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Radix Base Converter (Give a radix base, convert it to a number, vice versa)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Chan aggregator (Lets users view multiple Chans)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Encrypt / Decrypt Tool (Using AES)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Create a HSV Color Representation', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Window Manager (Bonus: for Wayland)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Basic Relational Database Software (SQL Support Handle Relationships, Focus on Efficiency)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Pixel Editor', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Trivial File Transfer Protocol (TFTP): Allows a client to put a file onto a remote host and retrieve it', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Markdown (HTML/XML) Editor', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('IP Tracking Visualization', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Port Scanner', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Old School Demo Effect (Plasma Tunnel, Scrollers, Zoomers, etc...)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Fizzbuzz (Bonus: in Machine Code / Assembly)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('RPN Calculator', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Coreutils implementation of wc that supports printing numbers optionally in a human readible format (Bonus: for the rest of Coreutils)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Towers of Hanoi', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Music Visualizer', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Unicode Converter (Support for UTF-8, 16LE, 32LE, and 32BE)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Calculate nth digits of pi (Bonus: arbitrary precision, what is the 2^2082 digit of pi?)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Least Squares Fitting Algorithm', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Given an Array of Stocks values over time, find the period of time where the stocks could have made the most money', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Highest Prime Factor Calculator', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Hide and Extract Data in images (Basic Steganography)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Web Page Crawler', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Password Generator (Configurable)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Vigenère cipher', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Game Of Life (Bonus: Save load state / drop-in constructions)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Caesar Cipher Cracker', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Dijkstras Algorithm', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Caesar, ROT 13, ROT 47 ciphers (Bonus: In Assembly)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Program that displays MBR/GUID contents', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Random Name Picker (Bonus: Fetches data from the internet)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Youtube to MP3', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Text to Hexadecimal, Octal, and Binary', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Calculate the first 1,000 digits of pi iteratively', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Sierpinski Triangle', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Mandlebrot Set', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('OpenAI Gym Project', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('AI for Roguelikes', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Sudoku Solver (Using A* algorithm)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Connect-4 AI Player using Aplha-Beta Pruning', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Basic Neural Network - Simulate individual Neurons and their connections', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Real Neural Network - Implement a basic feed forward neural network using matrices for entire layers along with matrix operations for computation', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Convolutional Neural Network: For handwritten digit recognition, test on MNIST database (Use TensorFlow, Theano, etc)', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Convolutional Neural Network: Implement your own Convolutional N.N. for handwritten digit recognition.', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Virtual Machine with a script that writes "Hello, World!"', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Basic Bootloader', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Terminal Shell (Executable Binaries, Pipes, Redirection, History,) (Bonus 1: Supports VT100) (Bonus 2: Make it have its own Terminal Emulator', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('HTML + JavaScript Debugger', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('Write an Interpreted LISP-like Programming Language', 1000, 1000);
INSERT INTO project (title, difficulty, span) VALUES ('make an application tha tis capable of mounting filesystems from othe OSes using the FUSE model', 1000, 1000);

View File

@ -1,14 +1,13 @@
# Syntax
<bot_name>: <command>
# Commands # Commands
+ remind : dump current assignment + remind : dump current assignment
## Admin ## User
+ reroll : terminate current assignment early and get a new + magic : does a magical spell
+ set_repo <link> : set project repository link (to be dumped on remind) + reroll : terminate current assignment early and get a new
+ raw <sql> : execute raw sql, so add/delete is covered without retarded interfaces + remind : dump the users current personal assignment
## PM ## Dev
So random users cant shit up the channel / add support for personal assignments. + dump : list all possible projects
+ dump : list all possible projects + raw <sql> : execute raw sql, so add/delete is covered without retarded interfaces
+ request : request personal project + kill : kills the process
+ remind : dump the users current personal assignment ## Undefined
+ request : request personal project
+ repo <link> : set project repository link (to be dumped on remind)

View File

@ -1,9 +0,0 @@
-server SERVER - The desired server.
-port PORT - Places port number.
-username USERNAME - Specifies the username.
-password PASSW0RD - Sets a password.
-auth FILE - Uses an authorization file.
-help - A message likewise.
-version - Currently nothing.
options before are overwritten, and after take precedence.

View File

@ -1 +0,0 @@
./probotic irc.rizon.net 6667 '#/g/chad' probotic

View File

@ -1,2 +0,0 @@
/*--------------------------------------------------------------------------------*/
/* Lines shouldn't be longer than 80 characters, which is this long ^ */

View File

@ -1,51 +1,12 @@
--- Probotic --- Goals
A IRC Bot that is able to recieve several commands and on a weekly Provides users with commands to retrieve project ideas via a few simple
(or daily, biweekly, monthly) basis will (privately?) declare an commands. Possibly extended to where admins/users may prune/submit
assignment for users to do. new ideas.
--- Speculations This project was created solely for a few people to learn to work together.
Internally this suggests that it must handle entries of these projects --- Formatting
that could be preconceived or composed exactly for a given date (what
we're doing.)
This may be done via a simplistic append-only database or a SQL-based Formatting is BSD spc2, always bracketed (unless the block is upon
database. another keyword), overwrap functions and combinators.
--- Requirements
The bot should support printing at a regular interval or at a given date.
The bot should respect some commands, such as POST, for if someone wishes
to post a project challenge.
The bot should respect an administrator, such that he could POST, and
REMOVE entered items.
Command SEARCH, SINCE and LIST, for regexp searching, entries since a
date (presumably a <from> <to> relationship), and a list all.
The tooling behind the bot should be accessible to do the same sort of
interfacing to recieve a given task at the running of a command (to avoid
having to deal with unix mail, this could be done through a daily check
in a crontab file.)
--- Autism
Formatting is BSD spc2, always bracketed (unless the block is upon another
keyword), overwrap functions and combinators.
--- Example
int /* what I meant by overwrap functions */
main(int argc,
argv * argv)
{
int * somevar = 0 + 1;
if (1 || /* what I meant by overwrap combinators */
*somevar)
{ return 0; }
else /* switch, if, do/while/for, would not be nested within */
{
puts("fruakk");
return 1;
}
}

View File

@ -1,3 +0,0 @@
server=irc.rizon.net
username=probotic
port=6667

View File

@ -1,9 +0,0 @@
2023-08-02 - Week 1 - The Challenge Bot
Contribute to the bot!
END
2023-08-09 - Week 2 - dunno...
\END or EOF

90
docs/v4.txt Normal file
View File

@ -0,0 +1,90 @@
1 - Download Manager
2 - Make an elastic producer/consumer task queue
4 - Markov Chain Sentence Generator
5 - English Sentence Parser that points the Context of a Sentence
6 - MIDI Player + Editor
7 - Stock Market Simulator Using Yahoo Spreadsheet Data
8 - Parametric/Graphic Equalizer for .wav files
10 - To-Do List Application
11 - Verlet Integration
12 - TCP/UDP Chat Server + Client (Bonus: No web browser needed)
13 - Music Streaming
14 - Shazam
15 - Chatbot
16 - Curses Text Editor
17 - paint.net Clone
18 - Image to ASCII Art
19 - Booru (Image Board) Image Downloader
20 - Image Converter (png -> jpeg -> avif)
21 - ID3 Reader
22 - Sound Synthesis (Sine, Square, Sawtooth, etc.) ("Fuck You" mode: Realtime MIDI Playback with Custom instruments)
23 - C++ IDE Plugin for your Text Editor
24 - Simple Version Control System supporting branches, commits with messages, unlocking, and per-file configuration of number of revisions and blame. ("Fuck You" mode: Do it all)
25 - Imageboard (Think vichan)
26 - Password Manager (think KeePassXC)
27 - Torrent Client
28 - Booru Client
29 - Key Press Bot
30 - IP/URL Obscurification (http://www.pc-help.org/obscure.htm)
31 - Radix Base Converter (Give a radix base, convert it to a number, vice versa)
32 - Chan aggregator (Lets users view multiple Chans)
33 - Encrypt / Decrypt Tool (Using AES)
35 - Create a HSV Color Representation
36 - Window Manager (Bonus: for Wayland)
37 - Basic Relational Database Software (SQL Support Handle Relationships, Focus on Efficiency)
38 - Pixel Editor
39 - Trivial File Transfer Protocol (TFTP): Allows a client to put a file onto a remote host and retrieve it
40 - Markdown (HTML/XML) Editor
41 - IP Tracking Visualization
42 - Port Scanner
43 - Old School Demo Effect (Plasma Tunnel, Scrollers, Zoomers, etc...)
44 - Fizzbuzz (Bonus: in Machine Code / Assembly)
45 - RPN Calculator
46 - Coreutils implementation of wc that supports printing numbers optionally in a human readible format (Bonus: for the rest of Coreutils)
47 - Towers of Hanoi
48 - Music Visualizer
49 - Unicode Converter (Support for UTF-8, 16LE, 32LE, and 32BE)
50 - Calculate nth digits of pi (Bonus: arbitrary precision, what is the 2^2082 digit of pi?)
51 - Least Squares Fitting Algorithm
52 - Given an Array of Stocks' values over time, find the period of time where the stocks could have made the most money
53 - Highest Prime Factor Calculator
54 - Hide and Extract Data in images (Basic Steganography)
55 - Web Page Crawler
56 - Password Generator (Configurable)
57 - Vigenère cipher
58 - Conway's Game Of Life (Bonus: Save load state / drop-in constructions)
59 - Caesar Cipher Cracker
60 - Dijkstra's Algorithm
61 - Caesar, ROT 13, ROT 47 ciphers (Bonus: In Assembly)
62 - Program that displays MBR/GUID partion's contents
63 - Random Name Picker (Bonus: Fetches data from the internet)
65 - Youtube to MP3
66 - Text to Hexadecimal, Octal, and Binary
67 - Calculate the first 1,000 digits of pi iteratively
68 - Sierpinski Triangle
69 - Mandlebrot Set
70 - OpenAI Gym Project
71 - AI for Roguelikes
72 - Sudoku Solver (Using A* algorithm)
73 - Connect-4 AI Player using Aplha-Beta Pruning
74 - Basic Neural Network - Simulate individual Neurons and their connections
75 - Real Neural Network - Implement a basic feed forward neural network using matrices for entire layers along with matrix operations for computation.
76 - Convolutional Neural Network: For handwritten digit recognition, test on MNIST database (Use TensorFlow, Theano, etc)
77 - Convolutional Neural Network: Implement your own Convolutional N.N. for handwritten digit recognition.
78 - Virtual Machine with a script that writes "Hello, World!"
79 - Basic Bootloader
80 - Terminal Shell (Executable Binaries, Pipes, Redirection, History,) (Bonus 1: Supports VT100) (Bonus 2: Make it have it's own Terminal Emulator)
81 - HTML + JavaScript Debugger
82 - Write an Interpreted LISP-like Programming Language
83 - make an application tha tis capable of mounting filesystems from othe OSes using the FUSE model
Already included
3 - IRC Client
9 - Graphing Calculator
34 - Text Editor /w autosave
Broken Link
64 - Encrypt/Decrypt Text: Implement at least one from http://rumkin.com/tools/cipher/collection

1
docs/v5-ext-2.txt Normal file
View File

@ -0,0 +1 @@
Write Your Own Custom Filesystem (Bonus: Supports Journaling)

View File

@ -1,3 +1,5 @@
An extension to v4
[easy] [medi] [hard] [fuck you] -- I'm not entirely sure about: [netlet] [mathlet] [easy] [medi] [hard] [fuck you] -- I'm not entirely sure about: [netlet] [mathlet]
[-day] [-week] [-month] [-year] [-never] To completion [-day] [-week] [-month] [-year] [-never] To completion

2
docs/v5.txt Normal file
View File

@ -0,0 +1,2 @@
TODO compile v4 and v5-ext* into this document, make sure it's in a format that
can easily be converted into SQL code via Editor Macros.

View File

@ -6,8 +6,7 @@ DECL int api_init(void);
DECL void api_rope(void); DECL void api_rope(void);
DECL void rope(void); DECL void rope(void);
DECL char * remind(char * who); DECL char * remind(char * who);
DECL char * raw(char const * const sql); /* DECL int is_no_assignment(char const * const who); */
DECL int is_no_assignment(char const * const who);
#define API_H_ #define API_H_
#endif #endif

View File

@ -1,9 +1,6 @@
#ifndef HELP_H_ #ifndef HELP_H_
/* (((git))) */
VARDECL char const * help_msg; VARDECL char const * help_msg;
VARDECL char const * fmsg;
#define HELP_H_ #define HELP_H_
#endif #endif

View File

@ -2,27 +2,23 @@
typedef struct typedef struct
{ {
size_t admin_count;
char * username; char * username;
char * password; char * password;
char * channel; char * channel;
char * server; char * server;
char ** admins;
int port; int port;
} creds_t; } creds_t;
VARDECL creds_t creds; VARDECL creds_t creds;
DECL char ** str_split(char const * s, char c); /* DECL char ** str_split(char const * s, char c); */
DECL void split_clean(char ** split); /* DECL void split_clean(char ** split); */
DECL char * dump(void); /* DECL int is_admin(char const * user); */
DECL char * raw(char const * const sql);
/* DECL char * dump(void); */
/* DECL char * raw(char const * const sql); */
DECL char * remind(char * who); DECL char * remind(char * who);
DECL char * slurp(char const * fn); DECL void creds_free(void);
DECL int is_admin(char const * user);
DECL int parse_pair(char const * buf, size_t const len);
DECL void creds_free_password(void);
DECL void creds_free_rest(void);
DECL void parse_command(char const * const cmd); DECL void parse_command(char const * const cmd);
DECL void purge_assignments(char const * const who); DECL void purge_assignments(char const * const who);
DECL void random_assign(char const * const sql); DECL void random_assign(char const * const sql);

View File

@ -70,10 +70,12 @@ remind(char * who)
if (desc) { desc = strdup(desc); } else { desc = ""; } if (desc) { desc = strdup(desc); } else { desc = ""; }
repo = (char *) sqlite3_column_text(remind_stmt, 3); repo = (char *) sqlite3_column_text(remind_stmt, 3);
if (repo) { repo = strdup(repo); } else { repo = "<no link available>"; } if (repo) { repo = strdup(repo); } else { repo = "<no link available>"; }
asprintf(&r, if (-1 == asprintf(&r,
IRC_RED "%s: " IRC_YELLOW "%s" IRC_GREEN IRC_RED "%s: " IRC_YELLOW "%s" IRC_GREEN
" (@" IRC_BLUE "%s" IRC_GREEN ")" IRC_STOP, " (@" IRC_BLUE "%s" IRC_GREEN ")" IRC_STOP,
title, desc, repo); title, desc, repo))
{ /* this will probably never happen. But it implies a memory failure */
r = strdup(IRC_RED "No memory!" IRC_STOP); }
} }
else else
{ {
@ -92,12 +94,16 @@ set_repo(char const * const who,
DBERR(sqlite3_step(set_repo_stmt)); DBERR(sqlite3_step(set_repo_stmt));
} }
#ifndef NO_VULN_COMMANDS
/* Note that this function is may not be vuln,
but is included as it's only used by vulns */
DECL int DECL int
rtos(void * data, rtos(void * data,
int argc, int argc,
char** argv, char** argv,
char** colname char** colname)
){ {
(void) colname; (void) colname;
char ** r = (char**)data; char ** r = (char**)data;
@ -154,7 +160,7 @@ raw(char const * const sql)
char *r = NULL; char *r = NULL;
sqlite3_exec(connection, sql, rtos, &r, &errmsg); sqlite3_exec(connection, sql, rtos, &r, &errmsg);
if (errmsg){ if (errmsg){
free(r); free(r);
r = errmsg; r = errmsg;
@ -162,6 +168,8 @@ raw(char const * const sql)
return r; return r;
} }
#endif /* !NO_VULN_COMMANDS */
DECL int DECL int
get_project_count_callback(void* data, int argc, char** argv, char** colname) get_project_count_callback(void* data, int argc, char** argv, char** colname)
@ -220,11 +228,16 @@ purge_assignments(char const * const who)
DBERR(sqlite3_step(purge_assignments_stmt)); DBERR(sqlite3_step(purge_assignments_stmt));
} }
#ifdef INITIAL_ASSIGNMENT_MESSAGE
DECL int DECL int
is_no_assignment(char const * const who){ is_no_assignment(char const * const who)
{
DBERR(sqlite3_reset(is_no_assignment_stmt)); DBERR(sqlite3_reset(is_no_assignment_stmt));
DBERR(sqlite3_bind_text(is_no_assignment_stmt, 1, who, -1, SQLITE_STATIC)); DBERR(sqlite3_bind_text(is_no_assignment_stmt, 1, who, -1, SQLITE_STATIC));
const int e = sqlite3_step(is_no_assignment_stmt); const int e = sqlite3_step(is_no_assignment_stmt);
DBERR(e); DBERR(e);
return (e == SQLITE_DONE); return (e == SQLITE_DONE);
} }
#endif /* INITIAL_ASSIGNMENT_MESSAGE */

View File

@ -15,20 +15,15 @@
*/ */
VARDECL char const * help_msg = VARDECL char const * help_msg =
IRC_GREEN "!help " IRC_STOP " : This message\n" /* IRC_GREEN "!help " IRC_STOP " : This message\n" */
IRC_GREEN "!remind " IRC_STOP " : Dump current assignment\n" IRC_GREEN "!remind " IRC_STOP " : Dump current assignment\n"
IRC_GREEN "!reroll " IRC_STOP " : Rerolls assignment\n" IRC_GREEN "!reroll " IRC_STOP " : Rerolls assignment\n"
IRC_GREEN "!set_repo <link>" IRC_STOP " : Sets project repository link\n" /* IRC_GREEN "!repo <link>" IRC_STOP " : Sets project repository link\n" */
IRC_GREEN "!raw <sql> " IRC_STOP " : Execute raw SQL\n" /* IRC_GREEN "!raw <sql> " IRC_STOP " : Execute raw SQL\n" */
IRC_GREEN "!dump " IRC_STOP " : List all possible projects\n" /* IRC_GREEN "!dump " IRC_STOP " : List all possible projects\n" */
IRC_GREEN "!request " IRC_STOP " : Request personal project\n" IRC_GREEN "!request " IRC_STOP " : Request personal project\n"
IRC_GREEN "!remind " IRC_STOP " : Prints your assignment\n"; IRC_GREEN "!remind " IRC_STOP " : Prints your assignment\n";
VARDECL char const * fmsg =
"%s\x2C\x20\x79\x6F\x75\x20\x61\x72\x65\x20\x66\x61\x67\x67"
"\x6F\x74\x20\x66\x6F\x72\x20\x74\x68\x61\x74\x20\x6F\x70"
"\x69\x6E\x69\x6F\x6E\x2E";
#define PREFIX_COMMAND_CHAR '!' #define PREFIX_COMMAND_CHAR '!'
#define PREFIX_CHANNEL_COMMAND_CHAR '%' #define PREFIX_CHANNEL_COMMAND_CHAR '%'
@ -36,8 +31,6 @@ VARDECL irc_session_t * session;
VARDECL irc_callbacks_t callbacks; VARDECL irc_callbacks_t callbacks;
VARDECL char * current_username = NULL; VARDECL char * current_username = NULL;
/* Do you have any idea how many things this breaks? */
int stupid_shit = -1;
#define IRCMSG(msg) irc_cmd_msg(session, creds.channel, msg) #define IRCMSG(msg) irc_cmd_msg(session, creds.channel, msg)
@ -50,8 +43,11 @@ get_username(const char * origin)
while (origin[i] != USERNAME_TERMINATOR) while (origin[i] != USERNAME_TERMINATOR)
{ i++; } { i++; }
r = (char *) malloc(i + 1); r = (char *) malloc(i + 1);
strncpy(r, origin, i); if (r)
r[i] = '\00'; {
strncpy(r, origin, i);
r[i] = '\00';
}
return r; return r;
} }
@ -59,30 +55,33 @@ DECL void
ircmsg(const char* fmt, ircmsg(const char* fmt,
...) ...)
{ {
if(!strcmp(fmt, "") || fmt == NULL){ return; }
va_list args; va_list args;
char * fmtdmsg; char * fmtdmsg;
char * swp; char * swp;
const char * delim = "\n";
char * data;
if(!strcmp(fmt, "") || fmt == NULL)
{ return; }
va_start(args, fmt); va_start(args, fmt);
if(vasprintf(&fmtdmsg, fmt, args) == -1) if(vasprintf(&fmtdmsg, fmt, args) == -1)
{ exit(1); } { exit(1); }
puts(fmtdmsg); puts(fmtdmsg);
const char* delim = "\n"; data = strtok(fmtdmsg, delim);
char* data = strtok(fmtdmsg, delim); do
do{ {
swp = irc_color_convert_to_mirc(data); swp = irc_color_convert_to_mirc(data);
IRCMSG(swp); IRCMSG(swp);
free(swp); free(swp);
}while((data = strtok(NULL, delim), data)); } while((data = strtok(NULL, delim), data));
free(fmtdmsg); free(fmtdmsg);
va_end(args); va_end(args);
} }
DECL void DECL void
event_connect(irc_session_t * session, event_connect(irc_session_t * lsession,
const char * event, const char * event,
const char * origin, const char * origin,
const char ** params, const char ** params,
@ -93,16 +92,19 @@ event_connect(irc_session_t * session,
(void) params; (void) params;
(void) count; (void) count;
/* msg ChanServ IDENTIFY? */ /* msg ChanServ IDENTIFY? */
irc_cmd_join(session, creds.channel, 0); irc_cmd_join(lsession, creds.channel, 0);
if(is_no_assignment(creds.channel)){ #ifdef INITIAL_ASSIGNMENT_MESSAGE
if(is_no_assignment(creds.channel))
{
ircmsg(IRC_RED "No assignment for this channel. Finding a new..." IRC_STOP); ircmsg(IRC_RED "No assignment for this channel. Finding a new..." IRC_STOP);
random_assign(creds.channel); random_assign(creds.channel);
} }
ircmsg(remind(creds.channel)); ircmsg(remind(creds.channel));
#endif /* INITIAL_ASSIGNMENT_MESSAGE */
} }
DECL void DECL void
event_channel(irc_session_t * session, event_channel(irc_session_t * lsession,
char const * event, char const * event,
char const * origin, char const * origin,
char const ** params, char const ** params,
@ -110,25 +112,25 @@ event_channel(irc_session_t * session,
{ {
/* char const * channel = params[0]; */ /* char const * channel = params[0]; */
char const * message = params[1]; char const * message = params[1];
(void) session; (void) lsession;
(void) event; (void) event;
(void) origin; (void) origin;
/* (void) channel; */ /* (void) channel; */
(void) message; (void) message;
(void) count; (void) count;
/* parses the command */ /* parses the command */
switch(*message){ switch(*message)
{
case PREFIX_CHANNEL_COMMAND_CHAR: case PREFIX_CHANNEL_COMMAND_CHAR:
current_username = strdup(creds.channel); current_username = strdup(creds.channel);
break; break;
case PREFIX_COMMAND_CHAR: case PREFIX_COMMAND_CHAR:
current_username = get_username(origin); current_username = get_username(origin);
break; break;
} }
if(!current_username || *(message+1) == '\00'){ return; } if (!current_username ||
--stupid_shit; message[1] == '\0')
if(stupid_shit == 0) { return; }
{ ircmsg(fmsg, current_username); }
parse_command(message+1); parse_command(message+1);
free(current_username); free(current_username);
current_username = NULL; current_username = NULL;
@ -154,11 +156,11 @@ init(void)
irc_connect(session, irc_connect(session,
creds.server, creds.port, creds.password, creds.server, creds.port, creds.password,
creds.username, creds.username, creds.username); creds.username, creds.username, creds.username);
creds_free_password(); FULL_FREE(creds.password);
atexit(rope); atexit(rope);
return 0; return 0;
fail: fail:
creds_free_password(); FULL_FREE(creds.password);
return 1; return 1;
} }

View File

@ -14,17 +14,15 @@
*/ */
#define VERSION_STRING "0.999" #define VERSION_STRING "1"
void void
help(void) help(void)
{ {
ERRMSG(PROGN ": usage\n" ERRMSG(PROGN ": usage\n"
"-server SERVER - Sets server\n" "-channel CHANNEL - Sets the target channel\n"
"-port PORT - Sets port\n" "-url URL - Sets the target URL\n"
"-username USERNAME - Sets username\n" "Use format username[:password]@server[:port], port defaults to 6667.\n");
"-password PASSW0RD - Sets password\n"
"-auth FILE - Use auth file");
} }
void void
@ -37,11 +35,9 @@ int
main (int argc, main (int argc,
char ** argv) char ** argv)
{ {
char const * authfile = NULL;
if (argc > 1) if (argc > 1)
{ {
char * arg; char * arg;
char * buf;
while (++argv, --argc) while (++argv, --argc)
{ {
arg = *argv; arg = *argv;
@ -49,40 +45,28 @@ main (int argc,
{ {
++arg; ++arg;
if (strcmp(arg, "version") == 0) if (strcmp(arg, "version") == 0)
{ return 0; } { ERR(1, PROGN ": Version " VERSION_STRING); }
else if (strcmp(arg, "help") == 0) else if (strcmp(arg, "help") == 0)
{ goto help; } { goto help; }
if (argc < 2) if (argc < 2)
{ goto nop; } { goto nop; }
if (strcmp(arg, "db") == 0) if (strcmp(arg, "db") == 0)
{ db = argv[1]; } { db = argv[1]; }
else if (strcmp(arg, "server") == 0) else if (strcmp(arg, "url") == 0)
{ free(creds.server); creds.server = strdup(argv[1]); } { parse_url(argv[1]); }
else if (strcmp(arg, "port") == 0) /* else if (strcmp(arg, "server") == 0) */
{ creds.port = atoi(argv[1]); } /* { free(creds.server); creds.server = strdup(argv[1]); } */
/* else if (strcmp(arg, "port") == 0) */
/* { creds.port = atoi(argv[1]); } */
else if (strcmp(arg, "channel") == 0) else if (strcmp(arg, "channel") == 0)
{ free(creds.channel); creds.channel = strdup(argv[1]); } { free(creds.channel); creds.channel = strdup(argv[1]); }
else if (strcmp(arg, "username") == 0) /* else if (strcmp(arg, "username") == 0) */
{ free(creds.username); creds.username = strdup(argv[1]); } /* { free(creds.username); creds.username = strdup(argv[1]); } */
else if (strcmp(arg, "password") == 0) /* else if (strcmp(arg, "password") == 0) */
{ free(creds.password); creds.password = strdup(argv[1]); } /* { free(creds.password); creds.password = strdup(argv[1]); } */
else if (strcmp(arg, "auth") == 0) else
{ {
authfile = argv[1]; ERR(1,"Unknown command provided");
buf = slurp(authfile);
if (!buf)
{
fprintf(stderr, "file: %s\n", authfile);
PERROR(1);
}
if (parse_pair(buf, strlen(buf)))
{
free(buf);
creds_free_rest();
ERR(CREDS_ERROR, "Cannot parse creds");
}
free(buf);
atexit(creds_free_rest);
} }
++argv; --argc; ++argv; --argc;
} }
@ -90,11 +74,11 @@ main (int argc,
{ nop: ERRFMT(1, "Oprand without option '%s'", arg); } { nop: ERRFMT(1, "Oprand without option '%s'", arg); }
} }
} }
#ifndef NDEBUG atexit(creds_free);
fprintf(stderr, "-- server:'%s:%d' channel:'%s' username:'%s' pass:%s --\n",
creds.server, creds.port, creds.channel, creds.username, fprintf(stderr, "Connecting to %s:%s@%s:%d\nChannel: %s\n",
creds.password); creds.username, creds.password,
#endif /* NDEBUG */ creds.server, creds.port, creds.channel);
if (init()) if (init())
{ return 1; } { return 1; }

View File

@ -16,38 +16,22 @@
#define PARAMS_COUNT 6 #define PARAMS_COUNT 6
enum cred_names_map VARDECL creds_t creds =
{ {
DATABASE, .username = NULL,
USERNAME, .password = NULL,
PASSWORD, .channel = NULL,
CHANNEL, .server = NULL, /* localhost? */
SERVER, #ifndef IRC_SSL_SUPPORT
PORT .port = 6667
#else
.port = 6669
#endif /* IRC_SSL_SUPPORT */
}; };
VARDECL char const * cred_names[] =
{
"database",
"username",
"password",
"channel",
"server",
"port"
};
VARDECL size_t const cred_names_len[] =
{
8,
8,
8,
7,
6,
4,
6
};
VARDECL creds_t creds = {0}; #if 0
DECL char ** DECL char **
str_split(char const * s, char c) str_split(char const * s, char c)
@ -110,30 +94,7 @@ split_clean(char ** split)
free(split); free(split);
} }
DECL char * #endif /* 0 */
slurp(char const * fn)
{
size_t len;
char * b;
FILE * fp = fopen(fn, "r");
if (fp)
{
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);
b = malloc(len+2);
if (b)
{
fread(b, 1, len, fp);
b[len+1] = '\0';
}
fclose(fp);
return b;
}
else
{ return NULL; }
}
DECL void DECL void
parse_command(char const * cmd) parse_command(char const * cmd)
@ -149,32 +110,35 @@ parse_command(char const * cmd)
if (cmd[i] == '\0') if (cmd[i] == '\0')
{ {
/* no arguments */ /* no arguments */
#ifndef NO_VULN_COMMANDS
if (strcmp(cmd, "kill") == 0) if (strcmp(cmd, "kill") == 0)
{ exit(1); } { exit(1); }
#endif /* !NO_VULN_COMMANDS */
if (strcmp(cmd, "remind") == 0) if (strcmp(cmd, "remind") == 0)
{ {
msgswp = remind(current_username); msgswp = remind(current_username);
ircmsg("%s: %s", current_username, msgswp); ircmsg("%s: %s", current_username, msgswp);
} }
/* XXX: maybe no? */
/*else if (strcmp(cmd, "next") == 0) | TODO: implement */
/* { ircmsg("%s: No future assignments", current_username); } */
else if (strcmp(cmd, "help") == 0) else if (strcmp(cmd, "help") == 0)
{ ircmsg(help_msg); } { ircmsg(help_msg); }
else if (strcmp(cmd, "magic") == 0) else if (strcmp(cmd, "magic") == 0)
{ stupid_shit = 8 + (rand() % 100); } { ircmsg("%s: " IRC_YELLOW "%d" IRC_STOP, current_username, (rand() % 100) + 1); }
else if (strcmp(cmd, "dump") == 0) else if (strcmp(cmd, "dump") == 0)
{ {
#ifndef NO_VULN_COMMANDS
ircmsg("%s: All projects:", current_username); ircmsg("%s: All projects:", current_username);
msgswp = dump(); msgswp = dump();
ircmsg(msgswp); ircmsg(msgswp);
#else
ircmsg("%s: dump disabled", current_username);
#endif /* !NO_VULN_COMMANDS */
} }
else if (strcmp(cmd, "reroll") == 0) else if (strcmp(cmd, "reroll") == 0)
{ {
ircmsg("%s: Rerolling...", current_username); /* ircmsg("%s: Rerolling...", current_username); */
purge_assignments(current_username); purge_assignments(current_username);
random_assign(current_username); random_assign(current_username);
ircmsg(remind(current_username)); ircmsg("%s: %s", current_username, remind(current_username));
} }
} }
else else
@ -183,96 +147,77 @@ parse_command(char const * cmd)
char const * const arg = cmd + i + 1; char const * const arg = cmd + i + 1;
if (strncmp(cmd, "raw", i) == 0) if (strncmp(cmd, "raw", i) == 0)
{ {
ircmsg("%s: Executing SQL `%s'.", current_username, arg); #ifndef NO_VULN_COMMANDS
msgswp = raw(arg); /* ircmsg("%s: Executing SQL `%s'.", current_username, arg); */
ircmsg(msgswp); msgswp = raw(arg);
} ircmsg(msgswp);
else if (strncmp(cmd, "set_repo", i) == 0) #else
ircmsg("%s: raw disabled", current_username);
#endif /* !NO_VULN_COMMANDS */
}
else if (strncmp(cmd, "repo", i) == 0)
{ {
ircmsg("%s: Setting project repository...", current_username); /* ircmsg("%s: Setting project repository...", current_username); */
set_repo(creds.channel, arg); set_repo(creds.channel, arg);
msgswp = remind(creds.channel); msgswp = remind(creds.channel);
ircmsg("%s: %s", current_username, msgswp); ircmsg("%s: %s", current_username, msgswp);
} }
/* XXX: what is this suppose to do? */
else if (strncmp(cmd, "submit", i) == 0) /* TODO: implement */
{
ircmsg("%s: Submitting project link '%s' to <random janny>",
current_username, arg);
}
} }
free(msgswp); free(msgswp);
} }
/* Parses the format username[:password]@server[:port] */
#define GENCOPY(dst,src,l) \
do \
{ \
dst = malloc(sep + 1); \
if (dst) \
{ \
strncpy(dst,src,l); \
dst[len] = '\0'; \
} \
else \
{ return 1; } \
} while (0)
DECL int DECL int
parse_pair(char const * buf, size_t len) parse_url(char const * url)
{ {
size_t i, f, x; size_t len = strlen(url);
/* fprintf(stderr, "ENT len:%ld buf:%sEOF\n", len, buf); */ size_t sep = 0, ls = 0, rs;
for (i = 0; buf[i] && while (++sep < len && url[sep] != '@');
i < len; ++i) while (++ls < len && url[ls] != ':')
{ {
if (buf[i] == '=') if (ls >= sep)
{ { ls = 0; break; }
++i; }
for (f = 0, x = 0; f < PARAMS_COUNT; ++f) rs = sep;
{ while (++rs < len && url[rs] != ':');
/* fprintf(stderr, "x%ld, i%ld, %s\n", x, i, buf); */ if (rs == len)
/* X macro for handling this data may be better */ { rs = 0; }
if (strncmp(buf, cred_names[f], cred_names_len[f]) == 0) GENCOPY(creds.username, url, ls ? ls : sep);
{ if (ls)
/* fprintf(stderr, "f%ld:len%ld:%s\n", f, cred_names_len[f], */ {
/* cred_names[f]); fflush(stderr); */ GENCOPY(creds.password, url + ls + 1, sep - ls - 1);
buf += i; }
while (buf[x] != '\0') if (rs)
{ {
if (buf[x] == '\n') GENCOPY(creds.server, url + sep + 1, rs - sep - 1);
{ creds.port = atoi(url + rs + 1);
len -= i; i = 0; break; }
} else
++x; {
} GENCOPY(creds.server, url + sep + 1, len - sep - 1);
switch (f)
{
case DATABASE: db = strndup(buf,x); break;
case USERNAME: creds.username = strndup(buf,x); break;
case PASSWORD: creds.password = strndup(buf,x); break;
case CHANNEL: creds.channel = strndup(buf,x); break;
case SERVER: creds.server = strndup(buf,x); break;
case PORT: creds.port = atoi(buf); break;
}
if (x + 2 < len)
{ buf += x + 1; }
else
{ return 1; }
goto next;
}
}
}
next:;
} }
return 0; return 0;
} }
DECL int DECL void
is_admin(char const * user) creds_free(void)
{
/* No Gods or Kings, Only size_t */
return 1;
}
void
creds_free_password(void)
{
FULL_FREE(creds.password);
}
void
creds_free_rest(void)
{ {
FULL_FREE(creds.username); FULL_FREE(creds.username);
/* FULL_FREE(creds.password); */ FULL_FREE(creds.password);
FULL_FREE(creds.channel); FULL_FREE(creds.channel);
FULL_FREE(creds.server); FULL_FREE(creds.server);
FREE(creds.admins);
} }