Skip to content

Instantly share code, notes, and snippets.

@leiless
Last active November 23, 2018 09:39
Show Gist options
  • Save leiless/65cf1779d4e20102b87029e535884ca6 to your computer and use it in GitHub Desktop.
Save leiless/65cf1779d4e20102b87029e535884ca6 to your computer and use it in GitHub Desktop.
Check if a given UTF8-encoded path is valid
#include <assert.h>
/**
* Check if a given UTF8-encoded path is valid
* @return empty string yield false
* see:
* https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#naming-conventions
* https://github.com/apache/commons-lang/blob/master/src/main/java/org/apache/commons/lang3/CharUtils.java#L438
*/
static inline bool is_u8path_valid(const register char * __nonnull p)
{
static bool bad_chars[1<<8] = {
[0x00] = 1, [0x01] = 1, [0x02] = 1, [0x03] = 1, [0x04] = 1, [0x05] = 1, [0x06] = 1, [0x07] = 1,
[0x08] = 1, [0x09] = 1, [0x0a] = 1, [0x0b] = 1, [0x0c] = 1, [0x0d] = 1, [0x0e] = 1, [0x0f] = 1,
[0x10] = 1, [0x11] = 1, [0x12] = 1, [0x13] = 1, [0x14] = 1, [0x15] = 1, [0x16] = 1, [0x17] = 1,
[0x18] = 1, [0x19] = 1, [0x1a] = 1, [0x1b] = 1, [0x1c] = 1, [0x1d] = 1, [0x1e] = 1, [0x1f] = 1,
[0x7f] = 1, ['<'] = 1, ['>'] = 1, [':'] = 1, ['"'] = 1, ['\\'] = 1, ['|'] = 1, ['?'] = 1,
['*'] = 1,
};
assert(p != NULL);
do {
if (bad_chars[(unsigned char) *p])
return false;
} while (*(++p) != '\0');
return true;
}
@leiless
Copy link
Author

leiless commented Nov 23, 2018

0x00: 0 0x01: 0 0x02: 0 0x03: 0 0x04: 0 0x05: 0 0x06: 0 0x07: 0 0x08: 0 0x09: 0 0x0a: 0 0x0b: 0 0x0c: 0 0x0d: 0 0x0e: 0 0x0f: 0 0x10: 0 0x11: 0 0x12: 0 0x13: 0 0x14: 0 0x15: 0 0x16: 0 0x17: 0 0x18: 0 0x19: 0 0x1a: 0 0x1b: 0 0x1c: 0 0x1d: 0 0x1e: 0 0x1f: 0 0x20: 1 0x21: 1 0x22: 1 0x23: 1 0x24: 1 0x25: 1 0x26: 1 0x27: 1 0x28: 1 0x29: 1 0x2a: 1 0x2b: 1 0x2c: 1 0x2d: 1 0x2e: 1 0x2f: 1 0x30: 1 0x31: 1 0x32: 1 0x33: 1 0x34: 1 0x35: 1 0x36: 1 0x37: 1 0x38: 1 0x39: 1 0x3a: 1 0x3b: 1 0x3c: 1 0x3d: 1 0x3e: 1 0x3f: 1 0x40: 1 0x41: 1 0x42: 1 0x43: 1 0x44: 1 0x45: 1 0x46: 1 0x47: 1 0x48: 1 0x49: 1 0x4a: 1 0x4b: 1 0x4c: 1 0x4d: 1 0x4e: 1 0x4f: 1 0x50: 1 0x51: 1 0x52: 1 0x53: 1 0x54: 1 0x55: 1 0x56: 1 0x57: 1 0x58: 1 0x59: 1 0x5a: 1 0x5b: 1 0x5c: 1 0x5d: 1 0x5e: 1 0x5f: 1 0x60: 1 0x61: 1 0x62: 1 0x63: 1 0x64: 1 0x65: 1 0x66: 1 0x67: 1 0x68: 1 0x69: 1 0x6a: 1 0x6b: 1 0x6c: 1 0x6d: 1 0x6e: 1 0x6f: 1 0x70: 1 0x71: 1 0x72: 1 0x73: 1 0x74: 1 0x75: 1 0x76: 1 0x77: 1 0x78: 1 0x79: 1 0x7a: 1 0x7b: 1 0x7c: 1 0x7d: 1 0x7e: 1 0x7f: 0 0x80: 0 0x81: 0 0x82: 0 0x83: 0 0x84: 0 0x85: 0 0x86: 0 0x87: 0 0x88: 0 0x89: 0 0x8a: 0 0x8b: 0 0x8c: 0 0x8d: 0 0x8e: 0 0x8f: 0 0x90: 0 0x91: 0 0x92: 0 0x93: 0 0x94: 0 0x95: 0 0x96: 0 0x97: 0 0x98: 0 0x99: 0 0x9a: 0 0x9b: 0 0x9c: 0 0x9d: 0 0x9e: 0 0x9f: 0 0xa0: 0 0xa1: 0 0xa2: 0 0xa3: 0 0xa4: 0 0xa5: 0 0xa6: 0 0xa7: 0 0xa8: 0 0xa9: 0 0xaa: 0 0xab: 0 0xac: 0 0xad: 0 0xae: 0 0xaf: 0 0xb0: 0 0xb1: 0 0xb2: 0 0xb3: 0 0xb4: 0 0xb5: 0 0xb6: 0 0xb7: 0 0xb8: 0 0xb9: 0 0xba: 0 0xbb: 0 0xbc: 0 0xbd: 0 0xbe: 0 0xbf: 0 0xc0: 0 0xc1: 0 0xc2: 0 0xc3: 0 0xc4: 0 0xc5: 0 0xc6: 0 0xc7: 0 0xc8: 0 0xc9: 0 0xca: 0 0xcb: 0 0xcc: 0 0xcd: 0 0xce: 0 0xcf: 0 0xd0: 0 0xd1: 0 0xd2: 0 0xd3: 0 0xd4: 0 0xd5: 0 0xd6: 0 0xd7: 0 0xd8: 0 0xd9: 0 0xda: 0 0xdb: 0 0xdc: 0 0xdd: 0 0xde: 0 0xdf: 0 0xe0: 0 0xe1: 0 0xe2: 0 0xe3: 0 0xe4: 0 0xe5: 0 0xe6: 0 0xe7: 0 0xe8: 0 0xe9: 0 0xea: 0 0xeb: 0 0xec: 0 0xed: 0 0xee: 0 0xef: 0 0xf0: 0 0xf1: 0 0xf2: 0 0xf3: 0 0xf4: 0 0xf5: 0 0xf6: 0 0xf7: 0 0xf8: 0 0xf9: 0 0xfa: 0 0xfb: 0 0xfc: 0 0xfd: 0 0xfe: 0 0xff: 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment