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);
+}