gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-support/makecom/path_ops.c
1 // This is free and unencumbered software released into the public domain.
2 // For more information, please refer to <https://unlicense.org>
3 // bbbbbr 2020
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdbool.h>
8 #include "common.h"
9 #include "path_ops.h"
10
11 const char kExtensionSeparator = '.';
12 const char kPathSeparator =
13
14 #ifdef _WIN32
15 #ifndef _WIN32
16 #define __WIN32__
17 #endif
18 #endif
19
20 #ifdef __WIN32__
21 '\\';
22 #else
23 '/';
24 #endif
25
26 const char kPathSeparator_unix = '/';
27
28
29 void filename_replace_extension(char * filename, char * new_ext, size_t maxlen) {
30
31 // Use a temp work string in case out and in filename are the same pointer
32 char temp[MAX_FILE_STR];
33 char ext_sep[2] = {'\0'}; // default to empty string
34
35 // Add leading . to path if needed
36 if (new_ext[0] != kExtensionSeparator) {
37 ext_sep[0] = kExtensionSeparator;
38 ext_sep[1] = '\0';
39 }
40
41 // Strip extension from filename, append new extension
42 filename_remove_extension(filename);
43 snprintf(temp, maxlen, "%s%s%s", filename, ext_sep, new_ext);
44 snprintf(filename, maxlen, "%s", temp);
45 }
46
47
48 void filename_replace_path(char * filename, char * new_path, size_t maxlen) {
49
50 // Use a temp work string in case out and in filename are the same pointer
51 char temp[MAX_FILE_STR];
52 char path_sep[2] = {'\0'}; // default to empty string
53
54 // Add trailing slash to path if needed (Windows needs both for when running under linix like env)
55 #ifdef __WIN32__
56 if (((new_path[(strlen(new_path)-1)] != kPathSeparator)) &&
57 ((new_path[(strlen(new_path)-1)] != kPathSeparator_unix)))
58 #else
59 if ((new_path[(strlen(new_path)-1)] != kPathSeparator))
60 #endif
61 {
62 path_sep[0] = kPathSeparator;
63 path_sep[1] = '\0';
64 }
65
66 // Strip path from path+filename, pre-pend new path
67 snprintf(temp, maxlen, "%s%s%s", new_path, path_sep, get_filename_from_path(filename));
68 snprintf(filename, maxlen, "%s", temp);
69 }
70
71
72 const char * get_filename_from_path(const char * path)
73 {
74 size_t i;
75
76 // Returns string starting at last occurrance of path separator char
77 for(i = strlen(path) - 1; i; i--) {
78
79 // Add trailing slash to path if needed (Windows needs both for when running under linix like env)
80 #ifdef __WIN32__
81 if ((path[i] == kPathSeparator) || (path[i] == kPathSeparator_unix))
82 #else
83 if (path[i] == kPathSeparator)
84 #endif
85 {
86 return &path[i+1];
87 }
88 }
89 return path;
90 }
91
92
93 void filename_remove_extension(char * path)
94 {
95 char * last_ext;
96 char * last_slash;
97
98 // Find the last path separator if present
99 // Starting from here ensures that no path ".." characters
100 // get mistaken as extension delimiters.
101 last_slash = strrchr (path, kExtensionSeparator);
102 if (!last_slash)
103 last_slash = path;
104
105 // Then check to see if there is an extension (starting with the last occurance of '.')
106 // (tries to remove *all* trailing extensions backward until the last slash)
107 last_ext = strrchr (last_slash, kExtensionSeparator);
108 while (last_ext) {
109 if (last_ext != NULL) {
110 // If an extension is found then overwrite it with a string terminator
111 *last_ext = '\0';
112 }
113 last_ext = strrchr (last_slash, kExtensionSeparator);
114 }
115 }
116
117
118 bool get_path_without_filename(const char * path, char * path_only, uint32_t str_max)
119 {
120 size_t i;
121
122 if (strlen(path) + 1 > str_max)
123 return false;
124
125 for(i = strlen(path) - 1; i; i--) {
126
127 // Add trailing slash to path if needed (Windows needs both for when running under linix like env)
128 #ifdef __WIN32__
129 if ((path[i] == kPathSeparator) || (path[i] == kPathSeparator_unix))
130 #else
131 if (path[i] == kPathSeparator)
132 #endif
133 {
134 memcpy(path_only, path, i+1 );
135 path_only[i+1] = '\0';
136 return true;
137 }
138 }
139
140 // memcpy(path_only, path, strlen(path));
141 // No separater found, so no path
142 path_only[0] = '\0';
143 return true;
144 }
145
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.