]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/util.c
Add movement keys; Fix array_search deadlock; Remove mapgen height limit
[dragonblocks_alpha.git] / src / util.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include "util.h"
6
7 const char *program_name;
8
9 void syscall_error(const char *err)
10 {
11         perror(err);
12         exit(EXIT_FAILURE);
13 }
14
15 void internal_error(const char *err)
16 {
17         fprintf(stderr, "%s: %s\n", program_name, err);
18         exit(EXIT_FAILURE);
19 }
20
21 char *read_string(int fd, size_t bufsiz)
22 {
23         char buf[bufsiz + 1];
24         buf[bufsiz] = 0;
25         for (size_t i = 0;; i++) {
26                 char c;
27                 if (read(fd, &c, 1) == -1) {
28                         perror("read");
29                         return NULL;
30                 }
31                 if (i < bufsiz)
32                         buf[i] = c;
33                 if (c == EOF || c == 0)
34                         break;
35         }
36         return strdup(buf);
37 }
38
39 char *address_string(struct sockaddr_in6 *addr)
40 {
41         char address[INET6_ADDRSTRLEN] = {0};
42         char port[6] = {0};
43
44         if (inet_ntop(addr->sin6_family, &addr->sin6_addr, address, INET6_ADDRSTRLEN) == NULL)
45                 perror("inet_ntop");
46         sprintf(port, "%d", ntohs(addr->sin6_port));
47
48         char *result = malloc(strlen(address) + 1 + strlen(port) + 1);
49         sprintf(result, "%s:%s", address, port);
50         return result;
51 }
52
53 v3f html_to_v3f(const char *html)
54 {
55         unsigned int r, g, b;
56         sscanf(html, "#%2x%2x%2x", &r, &g, &b);
57         return (v3f) {(float) r / 255.0f, (float) g / 255.0f, (float) b / 255.0f};
58 }