2 * Functions for \oct encoding used in mtab/fstab/swaps/etc.
4 * Based on code from mount(8).
6 * Copyright (C) 2010 Karel Zak <kzak@redhat.com>
15 #define isoctal(a) (((a) & ~7) == '0')
17 static unsigned char need_escaping
[] = { ' ', '\t', '\n', '\\' };
19 char *mangle(const char *s
)
25 ss
= sp
= malloc(4*n
+1);
29 for (n
= 0; n
< sizeof(need_escaping
); n
++) {
30 if (*s
== need_escaping
[n
]) {
32 *sp
++ = '0' + ((*s
& 0300) >> 6);
33 *sp
++ = '0' + ((*s
& 070) >> 3);
34 *sp
++ = '0' + (*s
& 07);
47 void unmangle_to_buffer(const char *s
, char *buf
, size_t len
)
51 while(*s
&& sz
< len
- 1) {
52 if (*s
== '\\' && sz
+ 4 < len
- 1 && isoctal(s
[1]) &&
53 isoctal(s
[2]) && isoctal(s
[3])) {
55 *buf
++ = 64*(s
[1] & 7) + 8*(s
[2] & 7) + (s
[3] & 7);
66 static inline const char *skip_nonspaces(const char *s
)
68 while (*s
&& !(*s
== ' ' || *s
== '\t'))
74 * Returns mallocated buffer or NULL in case of error.
76 char *unmangle(const char *s
)
82 end
= skip_nonspaces(s
);
89 unmangle_to_buffer(s
, buf
, sz
);
96 int main(int argc
, char *argv
[])
99 fprintf(stderr
, "usage: %s --mangle | --unmangle <string>\n",
100 program_invocation_short_name
);
104 if (!strcmp(argv
[1], "--mangle"))
105 printf("mangled: '%s'\n", mangle(argv
[2]));
107 else if (!strcmp(argv
[1], "--unmangle")) {
108 char *x
= unmangle(argv
[2]);
110 printf("unmangled: '%s'\n", x
);
112 err(EXIT_FAILURE
, "unmangle failed");
117 #endif /* TEST_PROGRAM */