aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2015-05-01 13:33:58 +0100
committerTomasz Kramkowski <tk@the-tk.com>2015-05-01 13:33:58 +0100
commit2b744b571515645456946b58444d68ab47b02659 (patch)
tree7fb10dc448116b7c82b972f1e181648ed782da4a
parent982705cc279fce7591536d23653ed3819dd37f01 (diff)
downloadc-stuff-2b744b571515645456946b58444d68ab47b02659.tar.gz
c-stuff-2b744b571515645456946b58444d68ab47b02659.tar.xz
c-stuff-2b744b571515645456946b58444d68ab47b02659.zip
sdl.c, undefined.c, md5.c
-rw-r--r--md5.c130
-rw-r--r--sdl.c131
-rw-r--r--undefined.c10
3 files changed, 271 insertions, 0 deletions
diff --git a/md5.c b/md5.c
new file mode 100644
index 0000000..359fb94
--- /dev/null
+++ b/md5.c
@@ -0,0 +1,130 @@
+/*
+ * This is an attempt at implementing md5 in c, so far it doesn't work :(.
+ * I took the values from wikipedia (https://en.wikipedia.org/wiki/MD5).
+ *
+ * Copyright (C) 2015 Tomasz Kramkowski <tk@the-tk.com>
+ *
+ * This program is free software. It is licensed under version 3 of the
+ * GNU General Public License.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see [http://www.gnu.org/licenses/].
+ */
+#include <math.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void shuffle_bytes(char *buf, size_t length)
+{
+ length = length - length % 4;
+
+ for (size_t i = 0; i < length / 4; i++) {
+ char *bufc = buf + i * 4;
+ char chars[4] = {
+ bufc[3],
+ bufc[2],
+ bufc[1],
+ bufc[0]
+ };
+ strncpy(bufc, chars, 4);
+ }
+}
+
+int main(void)
+{
+ uint32_t *s, *K, a0, b0, c0, d0, length;
+ char input[64] = "";
+
+ length = strlen(input);
+
+ s = (uint32_t []){
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21};
+
+ K = (uint32_t []){
+ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
+ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
+ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
+ 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
+ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
+ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
+ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
+ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
+
+ a0 = 0x67452301;
+ b0 = 0xefcdab89;
+ c0 = 0x98badcfe;
+ d0 = 0x10325476;
+
+ input[length] = 128;
+
+ for (uint8_t i = length + 1; i < 56; i++)
+ input[i] = 0;
+
+ /*((uint64_t *)input)[7] = (uint64_t)length;*/
+ input[63] = 0;
+
+ for (uint8_t i = 0; i < 64; i++)
+ putchar(input[i]);
+
+ /*shuffle_bytes(input, 64);*/
+ uint32_t *M = (uint32_t *)input;
+
+ uint32_t A = a0, B = b0, C = c0, D = d0;
+
+ for (uint32_t i = 0; i < 64; i ++) {
+ uint16_t F, g, dTemp;
+
+ switch (i) {
+ case 0 ... 15:
+ F = (B & C) | ((~B) & D);
+ g = i;
+ break;
+ case 16 ... 31:
+ F = (D & B) | ((~D) & C);
+ g = (5 * i + 1) % 16;
+ break;
+ case 32 ... 47:
+ F = B ^ C ^ D;
+ g = (3 * i + 5) % 16;
+ break;
+ case 48 ... 63:
+ F = C ^ (B | (~D));
+ g = (7 * i) % 16;
+ break;
+ }
+
+ dTemp = D;
+
+ D = C;
+ C = B;
+ B += ((A + F + K[i] + M[g]) << s[i]) | ((A + F + K[i] + M[g]) >> (32-s[i]));
+ A = dTemp;
+ }
+
+ a0 += A;
+ b0 += B;
+ c0 += C;
+ d0 += D;
+
+ /*shuffle_bytes((char *)&a0, 4);*/
+ /*shuffle_bytes((char *)&b0, 4);*/
+ /*shuffle_bytes((char *)&c0, 4);*/
+ /*shuffle_bytes((char *)&d0, 4);*/
+
+ printf("%.8x%.8x%.8x%.8x\n", a0, b0, c0, d0);
+
+ return EXIT_SUCCESS;
+}
diff --git a/sdl.c b/sdl.c
new file mode 100644
index 0000000..bc75984
--- /dev/null
+++ b/sdl.c
@@ -0,0 +1,131 @@
+#include <SDL2/SDL.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define WIDTH 640
+#define HEIGHT 480
+#define DEPTH 32
+
+enum obj_type {
+ O_QUAD,
+ O_TRIG,
+ O_CIRC
+};
+
+struct quad {
+ uint32_t x, y, width, height;
+};
+
+struct circle {
+ uint32_t x, y, diameter;
+};
+
+typedef union colour_t {
+ struct {
+ uint8_t a, r, g, b;
+ } comp;
+ uint32_t colour;
+} colour_t;
+
+struct object {
+ enum obj_type type;
+ colour_t colour;
+ union {
+ struct quad quad;
+ struct circle circle;
+ } obj;
+};
+
+SDL_Window *window;
+SDL_Renderer *renderer;
+SDL_Texture *screen;
+colour_t *buffer;
+
+struct object *objects;
+uint32_t object_count;
+
+volatile bool running = true;
+
+#define QUOTE(text) "`" #text "'"
+#define SDL_ASSERT(expr, comp, val) \
+ if ((expr) comp val) { \
+ fprintf(stderr, "SDL Error: %s - %s\n", QUOTE(expr), SDL_GetError()); \
+ exit(EXIT_FAILURE); \
+ }
+
+#define SDL_ASSERT_NN(expr) SDL_ASSERT(expr, ==, NULL)
+#define SDL_ASSERT_Z(expr) SDL_ASSERT(expr, !=, 0)
+
+void prep_objects()
+{
+ objects = malloc(1 * sizeof *objects);
+ objects[0] = (struct object){O_QUAD, {{255, 0, 0, 0}}, {.quad = {30, 30, 30, 30}}};
+
+ object_count = 1;
+}
+
+void draw_screen()
+{
+ for (size_t i = 0; i < WIDTH * HEIGHT; i++)
+ buffer[i] = (colour_t){{0, 255, 0, 0}};
+
+ SDL_UpdateTexture(screen, NULL, buffer, 640 * sizeof *buffer);
+ SDL_RenderClear(renderer);
+ SDL_RenderCopy(renderer, screen, NULL, NULL);
+ SDL_RenderPresent(renderer);
+}
+
+void poll_for_events()
+{
+ SDL_Event event;
+
+ while (SDL_PollEvent(&event)) {
+ switch (event.type) {
+ case SDL_QUIT:
+ exit(EXIT_SUCCESS);
+ break;
+ case SDL_KEYDOWN:
+ printf("Key.\n");
+ break;
+ }
+ }
+}
+
+void simulate(uint32_t difference)
+{
+ printf("%lu\n", difference);
+}
+
+uint32_t get_time_delta()
+{
+ static uint32_t old_time;
+ uint32_t time = SDL_GetTicks();
+ uint32_t difference = time - old_time;
+ old_time = time;
+ return difference;
+}
+
+int main(void)
+{
+ SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
+ atexit(SDL_Quit);
+
+ window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL);
+ renderer = SDL_CreateRenderer(window, -1, 0);
+ screen = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);
+ buffer = malloc(sizeof *buffer * 640 * 480);
+
+ prep_objects();
+
+ get_time_delta();
+
+ while (running) {
+ draw_screen();
+ poll_for_events();
+ simulate(get_time_delta());
+ }
+
+ return(EXIT_SUCCESS);
+}
diff --git a/undefined.c b/undefined.c
new file mode 100644
index 0000000..38977d8
--- /dev/null
+++ b/undefined.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+
+int main(void)
+{
+ int i = 0;
+
+ printf("%d %d %d %d\n", i, i++, i, i++);
+
+ return 0;
+}