Beispiel #1
0
static int fs_cd_file(const char *filename)
{
    struct directory d;

    if (is_cwd_zip()) {
        return fs_cd_file_zip(sf_list_tail(&fs.directories), filename);
    }

    if (strcmp(filename, "..") == 0) {
        if (sf_list_cnt(&fs.directories)) {
            sf_list_pop(&fs.directories);
        }
        return chdir("..");
    } else {
        if (directory_init(&d, filename) != SF_OK) {
            return SF_ERR;
        }
        sf_list_push(&fs.directories, &d);
        if (!d.iszip) {
            return chdir(filename);
        }
    }

    return SF_OK;
}
Beispiel #2
0
static int fs_cd_file_zip(struct directory *parent, const char *filename)
{
    int isdirexist = 0;
    char buf[NAME_MAX];
    int len;
    zip_int64_t nentries, i;
    struct directory dir;

    if (strcmp(filename, "..") == 0) {
        sf_list_pop(&fs.directories);
        return SF_OK;
    }

    get_zip_cwd(buf, NAME_MAX);
    strcat(buf, filename);
    len = strlen(buf);
    buf[len++] = '/';
    buf[len] = '\0';

    nentries = zip_get_num_entries(parent->zip, 0);
    for (i = 0; i < nentries; ++i) {
        if (strncmp(zip_get_name(parent->zip, i, 0), buf, len) == 0) {
            isdirexist = 1;
            break;
        }
    }

    if (isdirexist) {
        strncpy(dir.name, filename, NAME_MAX);
        dir.iszip = 1;
        dir.isopened = 1;
        dir.zip = parent->zip;
        dir.nopens = parent->nopens + 1;
        sf_list_push(&fs.directories, &dir);
        return SF_OK;
    } else {
        sf_log(SF_LOG_ERR, "not a directory: %s", filename);
        return SF_ERR;
    }
}
Beispiel #3
0
int main()
{
	char* buffer = sf_malloc(1024);
	puts("Hello.");
	sf_free(buffer);

	sf_list_ptr my_list = sf_list_alloc();

	// Test single node list

	sf_list_node_ptr node1 = sf_list_node_alloc(NULL);
	sf_list_push(my_list, node1);
	assert(my_list->first == node1);
	assert(my_list->last == node1);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);

	sf_list_node_ptr popped_node = sf_list_pop(my_list);
	assert(popped_node == node1);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);
	assert(my_list->first == NULL);
	assert(my_list->last == NULL);

	// Test two node list: push 2 nodes

	sf_list_node_ptr node2 = sf_list_node_alloc(NULL);
	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	assert(my_list->first == node1);
	assert(my_list->last == node2);
	assert(node1->prev == NULL);
	assert(node1->next == node2);
	assert(node2->prev == node1);
	assert(node2->next == NULL);

	// Pop node 2

	popped_node = sf_list_pop(my_list);
	assert(popped_node == node2);
	assert(node2->next == NULL);
	assert(node2->prev == NULL);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);
	assert(my_list->first == node1);
	assert(my_list->last == node1);

	// Pop node 1

	popped_node = sf_list_pop(my_list);
	assert(popped_node == node1);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);
	assert(my_list->first == NULL);
	assert(my_list->last == NULL);

	// Test three node list: push 3 nodes

	sf_list_node_ptr node3 = sf_list_node_alloc(NULL);
	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	sf_list_push(my_list, node3);
	assert(my_list->first == node1);
	assert(my_list->last == node3);
	assert(node1->prev == NULL);
	assert(node1->next == node2);
	assert(node2->prev == node1);
	assert(node2->next == node3);
	assert(node3->prev == node2);
	assert(node3->next == NULL);

	// Pop node 3

	popped_node = sf_list_pop(my_list);
	assert(popped_node == node3);
	assert(node3->next == NULL);
	assert(node3->prev == NULL);
	assert(node2->next == NULL);
	assert(node2->prev == node1);
	assert(node1->next == node2);
	assert(node1->prev == NULL);
	assert(my_list->first == node1);
	assert(my_list->last == node2);

	// Pop node 2

	popped_node = sf_list_pop(my_list);
	assert(popped_node == node2);
	assert(node2->next == NULL);
	assert(node2->prev == NULL);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);
	assert(my_list->first == node1);
	assert(my_list->last == node1);

	// Pop node 1

	popped_node = sf_list_pop(my_list);
	assert(popped_node == node1);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);
	assert(my_list->first == NULL);
	assert(my_list->last == NULL);

	// Test insert_after

	sf_list_insert_after(my_list, node1, NULL);
	assert(my_list->first == node1);
	assert(my_list->last == node1);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);

	sf_list_insert_after(my_list, node2, node1);
	assert(my_list->first == node1);
	assert(my_list->last == node2);
	assert(node1->prev == NULL);
	assert(node1->next == node2);
	assert(node2->prev == node1);
	assert(node2->next == NULL);

	sf_list_insert_after(my_list, node3, node2);
	assert(my_list->first == node1);
	assert(my_list->last == node3);
	assert(node1->prev == NULL);
	assert(node1->next == node2);
	assert(node2->prev == node1);
	assert(node2->next == node3);
	assert(node3->prev == node2);
	assert(node3->next == NULL);

	sf_list_pop(my_list);
	sf_list_insert_after(my_list, node3, node1); // makes: 1, 3, 2
	assert(my_list->first == node1);
	assert(my_list->last == node2);
	assert(node1->prev == NULL);
	assert(node1->next == node3);
	assert(node3->prev == node1);
	assert(node3->next == node2);
	assert(node2->prev == node3);
	assert(node2->next == NULL);

	sf_list_pop(my_list);
	sf_list_pop(my_list);
	sf_list_pop(my_list);

	// Test remove

	sf_list_push(my_list, node1);
	sf_list_remove(my_list, node1);
	assert(my_list->first == NULL);
	assert(my_list->last == NULL);

	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	sf_list_remove(my_list, node2);
	assert(my_list->first == node1);
	assert(my_list->last == node1);
	assert(node1->next == NULL);
	assert(node1->prev == NULL);
	sf_list_pop(my_list);

	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	sf_list_remove(my_list, node1);
	assert(my_list->first == node2);
	assert(my_list->last == node2);
	assert(node2->next == NULL);
	assert(node2->prev == NULL);
	sf_list_pop(my_list);

	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	sf_list_push(my_list, node3);
	sf_list_remove(my_list, node1);
	assert(my_list->first == node2);
	assert(my_list->last == node3);
	assert(node2->next == node3);
	assert(node2->prev == NULL);
	assert(node3->next == NULL);
	assert(node3->prev == node2);
	sf_list_pop(my_list);
	sf_list_pop(my_list);

	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	sf_list_push(my_list, node3);
	sf_list_remove(my_list, node2);
	assert(my_list->first == node1);
	assert(my_list->last == node3);
	assert(node1->next == node3);
	assert(node1->prev == NULL);
	assert(node3->next == NULL);
	assert(node3->prev == node1);
	sf_list_pop(my_list);
	sf_list_pop(my_list);

	sf_list_push(my_list, node1);
	sf_list_push(my_list, node2);
	sf_list_push(my_list, node3);
	sf_list_remove(my_list, node3);
	assert(my_list->first == node1);
	assert(my_list->last == node2);
	assert(node1->next == node2);
	assert(node1->prev == NULL);
	assert(node2->next == NULL);
	assert(node2->prev == node1);
	sf_list_pop(my_list);
	sf_list_pop(my_list);

	// Clean up

	sf_list_node_free(node1);
	sf_list_node_free(node2);
	sf_list_node_free(node3);
	sf_list_free(my_list);

	sf_malloc_check();

	return 0;
}