- nbuf = namebuf_create (cwd);
- for (i = 1; i <= chdir_current; i++)
- namebuf_add_dir (nbuf, wd[i].name);
- return namebuf_finish (nbuf);
+ if (!wd)
+ return cwd;
+
+ if (0 == chdir_current || !wd[chdir_current].cwd)
+ {
+ if (IS_ABSOLUTE_FILE_NAME (wd[chdir_current].name))
+ return wd[chdir_current].name;
+
+ if (!wd[0].cwd)
+ wd[0].cwd = cwd;
+
+ for (i = chdir_current - 1; i > 0; i--)
+ if (wd[i].cwd)
+ break;
+
+ nbuf = namebuf_create (wd[i].cwd);
+ for (i++; i <= chdir_current; i++)
+ namebuf_add_dir (nbuf, wd[i].name);
+ wd[chdir_current].cwd = namebuf_finish (nbuf);
+ }
+ return wd[chdir_current].cwd;