libclod
C library for interacting with NBTs, region files, LOD data and other things.
Loading...
Searching...
No Matches
filename.c
1#include "filename.h"
2
3#include <assert.h>
4#include <inttypes.h>
5#include <stdio.h>
6#include <string.h>
7#include <stdint.h>
8#include <stddef.h>
9#include <stdlib.h>
10
11void str_copy(
12 char *restrict dst, const ptrdiff_t dst_max, size_t *dst_offset,
13 const char *restrict src, const ptrdiff_t src_max, size_t *src_offset,
14 const char delim
15) {
16 const size_t d = dst_offset ? *dst_offset : 0;
17 const size_t s = src_offset ? *src_offset : 0;
18
19 size_t i;
20 for (i = 0; (ptrdiff_t)(i + s) < src_max && src[i + s] && src[i + s] != delim; i++)
21 if ((ptrdiff_t)(i + d) < dst_max) dst[i + d] = src[i + s];
22
23 if (dst_offset) *dst_offset = d + i;
24 if (src_offset) *src_offset = s + i;
25}
26
32size_t filename_make(
33 char filename[REGION_FILENAME_MAX + 1],
34 const char prefix[PREFIX_MAX],
35 const char *extension,
36 const int64_t *pos, const uint8_t dims
37) {
38 assert(dims <= CLOD_REGION_DIMENSIONS_MAX);
39 memset(filename, 0, REGION_FILENAME_MAX + 1);
40
41 size_t offset = 0;
42 str_copy(filename, REGION_FILENAME_MAX, &offset, prefix, CLOD_REGION_PREFIX_MAX, nullptr, '.');
43 str_copy(filename, REGION_FILENAME_MAX, &offset, ".", 1, nullptr, 0);
44
45 for (int i = 0; i < dims; i++) {
46 const size_t max_len = offset > REGION_FILENAME_MAX ? 0 : REGION_FILENAME_MAX - offset;
47 char *cursor = offset > REGION_FILENAME_MAX ? filename + REGION_FILENAME_MAX : filename + offset;
48 offset += (size_t)snprintf(cursor, max_len, "%"PRId64".", pos[i]);
49 }
50
51 str_copy(filename, REGION_FILENAME_MAX, &offset, extension, EXTENSION_MAX, nullptr, 0);
52 assert(offset <= REGION_FILENAME_MAX);
53 return offset;
54}
55
60bool filename_parse_pos(const char filename[REGION_FILENAME_MAX + 1],
61 const char prefix[PREFIX_MAX],
62 const char *extension,
63 int64_t *pos, const uint8_t dims
64) {
65 size_t offset = 0;
66 while (offset < PREFIX_MAX && prefix[offset]) {
67 if (prefix[offset] != filename[offset]) return false;
68 offset++;
69 }
70
71 if (filename[offset] != '.') return false;
72 offset++;
73
74 for (uint8_t i = 0; i < dims; i++) {
75 char *end;
76 pos[i] = strtoll(&filename[offset], &end, 10);
77 if (end == filename + offset) return false;
78 offset += (size_t)(end - filename) + 1;
79 }
80
81 size_t extension_offset = 0;
82 while (extension_offset < EXTENSION_MAX && extension[extension_offset]) {
83 if (extension[extension_offset] != filename[offset]) return false;
84 extension_offset++;
85 offset++;
86 }
87
88 if (filename[offset]) return false;
89 return true;
90}
Sized string helpers.