5144d926e82f0ccdaa08a2e4036594136239b125 jcasper Thu Jun 18 16:11:08 2015 -0700 Adding a function to generate relative URLs diff --git src/lib/filePath.c src/lib/filePath.c index 68bf0f1..68fe762 100644 --- src/lib/filePath.c +++ src/lib/filePath.c @@ -120,15 +120,56 @@ * relative path interpreted as if it were seen from the * same directory holding the baseFile. * An example of using this would be in processing include * files. In this case the baseFile would be the current * source file, and the relPath would be from the include * statement. The returned result could then be used to * open the include file. */ { char dir[PATH_LEN]; splitPath(baseFile, dir, NULL, NULL); int dirLen = strlen(dir); if (dirLen > 0 && dir[dirLen-1] == '/') dir[dirLen-1] = 0; return expandRelativePath(dir, relPath); } + +char *makeRelativePath(char *from, char *to) +/* Calculate a relative path from one absolute directory/file to another. + * Assumptions: both from and to are absolute paths beginning at "/", and + * may be as small as only "/". Filenames are okay, but all directory + * names must end with a "/" to distinguish them from files. + * e.g., /test/dir/ is a directory, but /test/dir is a file. + */ +{ +int i, j, toCount, fromCount; +char fromDir[PATH_LEN]; +char toDir[PATH_LEN], toFile[FILENAME_LEN], toExt[FILEEXT_LEN]; +char relPath [PATH_LEN] = ""; +char *fromDirList[PATH_LEN], *toDirList[PATH_LEN]; + +splitPath(from, fromDir, NULL, NULL); +splitPath(to, toDir, toFile, toExt); + +fromCount = chopByChar(fromDir, '/', fromDirList, ArraySize(fromDirList)); +toCount = chopByChar(toDir, '/', toDirList, ArraySize(toDirList)); + +for (i=1; i < min(fromCount, toCount); i++) + { + if (!sameString(fromDirList[i], toDirList[i])) + break; + } +for (j=i; j < fromCount-1; j++) + { + safecat(relPath, sizeof relPath, "../"); + } +for (j=i; j < toCount-1; j++) + { + safecat(relPath, sizeof relPath, toDirList[j]); + safecat(relPath, sizeof relPath, "/"); + } + +safecat(relPath, sizeof relPath, toFile); +safecat(relPath, sizeof relPath, toExt); + +return cloneString(relPath); +}