From a5c943482dea248f41d6f7d6f6d7d03c4205cd88 Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Mon, 14 Aug 2017 18:06:27 -0400 Subject: [PATCH] handle special case of trailing "/" or "/~" in legacy external classnames --- pd/src/s_loader.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/pd/src/s_loader.c b/pd/src/s_loader.c index 84924cbf8..a3b7fa454 100644 --- a/pd/src/s_loader.c +++ b/pd/src/s_loader.c @@ -88,6 +88,27 @@ void sys_putonloadlist(const char *classname) /* post("put on list %s", classname); */ } +static char *get_last_file_separator(const char *objectname) +{ + char *c = strrchr(objectname, '/'); + if (c) + { + char *ret = c; + /* if we're the last character before the null terminator, + OR if the end of the string is "/~", let's interpret the + slash as part of the class name. + */ + if (c[1] == '\0' || (c[1] == '~' && c[2] == '\0')) + { + *c = '\0'; + ret = strrchr(objectname, '/'); + *c = '/'; + } + return ret; + } + return NULL; +} + void class_set_extern_dir(t_symbol *s); static int sys_do_load_abs(t_canvas *canvas, const char *objectname, @@ -108,7 +129,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, but we have already tried all paths */ if(!path)return (0); - if ((classname = strrchr(objectname, '/'))) + if ((classname = get_last_file_separator(objectname))) classname++; else classname = objectname; for (i = 0, cnameptr = classname; i < MAXPDSTRING-7 && *cnameptr; -- GitLab