反思
1、数组计算中的加减1判断
很多时候关于数组的计算都会涉及到加减1问题。
原理: j-i只能得到两个之间距离多少个数,但是忽略了i本身也是一个数。
- n_free = p->start - p->buf
这里的原因和第三个是一样的,因为p->start指向的位置已经写入了’/’ - new_p = new_buf + n_new - n_used
new_p = new_buf + n_new - 1 - (n_used-1),两个约掉就没1了! - p->start -= 1 + n
这里不再-1的原因是:这里的p->start == p->start-1,即j = i + n -1 中的j为j-1,因为p->start指向的位置已经有值了!!!
2、C语言中的const
加入const只是在编译的时候会检查是否const的变量被改变了,若是,则抛出编译错误,然而其实编译以后都是一样的,计算机可不知道这东西是不是常量。
3、数据的构造方式更加符合实际
文件的绝对路径是逐级往上走的,所以源码中采用了更加贴合实际的数据结构(指向文件名的指针是从尾往头走的)。
代码
/* prepend the n length of s before file_name, p. */
static void
file_name_prepend (struct file_name* p, char const* s, size_t n)
{
size_t n_free = p->start - p->buf;
if (n > 1 + n_free)
{
size_t n_new = p->n_alloc * 2;
size_t n_used = p->n_alloc - n_free;
char* new_buf = malloc (n_new);
char* new_p = new_buf + n_new - n_used;
memcpy (new_p, p->start, n_used);
free (p->buf);
p->buf = new_buf;
p->n_alloc = n_new;
p->start = new_p;
}
p->start -= 1 + n;
p->start[0] = '/';
memcpy (p->start + 1, s, n);
}