xi_file_re xi_pathname_absolute(xchar *pathbuf, xuint32 pblen, const xchar *pathname) { xchar ch; xchar *path_name = (char*) pathname; xchar *cp = pathbuf; xi_mem_set(pathbuf, 0, pblen); if (*path_name != '/' && *path_name != '\\' && *(path_name + 1) != ':') { xi_pathname_get(pathbuf, pblen); while (*cp) { cp++; } *(cp++) = XI_SEP_FILE_C; } while ((ch = *(path_name++))) { switch (ch) { /*case '~':{ char *p = getenv("HOME");; while (*p)*(cp++) = *(p++); break; }*/ case '\\': case '/': *(cp++) = XI_SEP_FILE_C; break; case '.': { switch (*path_name) { case '.': // we encounter '..' path_name += 2; //skip the following "./" if (*(cp - 1) == XI_SEP_FILE_C) //if cano_path now is "/xx/yy/" --cp; //skip backward the tail '/' *cp = '\0'; cp = xi_strrchr(pathbuf, XI_SEP_FILE_C); //up a level ++cp; break; case '\\': case '/': ++path_name; break; default: *(cp++) = ch; } break; } default: *(cp++) = ch; break; } } *cp = '\0'; return XI_FILE_RV_OK; }
int tc_xi_file_dop() { xint32 t = 1; xchar *tcname = "xi_file.h"; xint32 ret; xi_dir_t *tdir; xi_file_stat_t fs; xchar pathbuf[1024]; xchar pathtmp[1024]; xchar *pathptr = NULL; tc_info(); log_print(XDLOG, "[%s:%02d] Create a directory ##########\n", tcname, t++); ret = xi_dir_make("xx_test", 0755); if (ret < 0) { log_print(XDLOG, " - result : failed!!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.\n\n"); log_print(XDLOG, "[%s:%02d] Create same directory #######\n", tcname, t++); ret = xi_dir_make("xx_test", 0x755); if (ret != XI_FILE_RV_ERR_AE) { log_print(XDLOG, " - result : failed!! (must return -4 / ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass. (must return -4 / ret=%d)\n\n", ret); log_print(XDLOG, "[%s:%02d] Remove the directory ########\n", tcname, t++); ret = xi_dir_remove("xx_test"); if (ret < 0) { log_print(XDLOG, " - result : failed!!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.\n\n"); log_print(XDLOG, "[%s:%02d] Create a nested directory ###\n", tcname, t++); ret = xi_dir_make_force("xx_test/depth", 0755); if (ret < 0) { log_print(XDLOG, " - result : failed!!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.\n\n"); log_print(XDLOG, "[%s:%02d] Remove a top directory ######\n", tcname, t++); ret = xi_dir_remove("xx_test"); if (ret != XI_FILE_RV_ERR_NOTEMPT) { log_print(XDLOG, " - result : failed!! (must return -14 / ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass. (must return -14 / ret=%d)\n\n", ret); log_print(XDLOG, "[%s:%02d] Open the directory ##########\n", tcname, t++); tdir = xi_dir_open("xx_test"); if (tdir == NULL) { log_print(XDLOG, " - result : failed!! (dir=%p)\n\n", tdir); return -1; } log_print(XDLOG, " - result : pass. (dir=%p)\n\n", tdir); log_print(XDLOG, "[%s:%02d] Read the directory ##########\n", tcname, t++); log_print(XDLOG, "xx_test >\n"); while ((ret = xi_dir_read(tdir, &fs)) > 0) { log_print(XDLOG, "\t%s\n", fs.filename); } if (ret < 0) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.\n\n"); log_print(XDLOG, "[%s:%02d] Close the directory #########\n", tcname, t++); ret = xi_dir_close(tdir); if (ret < 0) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.\n\n"); log_print(XDLOG, "[%s:%02d] Delete test directories #####\n", tcname, t++); ret = xi_dir_remove("xx_test/depth"); if (ret < 0) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } ret = xi_dir_remove("xx_test"); if (ret < 0) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.\n\n"); log_print(XDLOG, "[%s:%02d] xi_pathname_absolute(..) ####\n", tcname, t++); ret = xi_pathname_absolute(pathbuf, sizeof(pathbuf), "../"); if (ret != XI_FILE_RV_OK) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass. (../ = %s)\n\n", pathbuf); log_print(XDLOG, "[%s:%02d] xi_pathname_basename(..) ####\n", tcname, t++); pathptr = xi_pathname_basename(pathbuf); log_print(XDLOG, " - result : pass. (basename ../ = %s)\n\n", pathptr); log_print(XDLOG, "[%s:%02d] xi_pathname_get #############\n", tcname, t++); ret = xi_pathname_get(pathbuf, sizeof(pathbuf)); if (ret != XI_FILE_RV_OK) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } log_print(XDLOG, " - result : pass.(current dir = %s)\n\n", pathbuf); log_print(XDLOG, "[%s:%02d] xi_pathname_set(..) #########\n", tcname, t++); ret = xi_pathname_set(".."); if (ret != XI_FILE_RV_OK) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } xi_pathname_get(pathtmp, sizeof(pathtmp)); log_print(XDLOG, " - result : pass.(current dir = %s)\n\n", pathtmp); log_print(XDLOG, "[%s:%02d] xi_pathname_set (old) #######\n", tcname, t++); ret = xi_pathname_set(pathbuf); if (ret != XI_FILE_RV_OK) { log_print(XDLOG, " - result : failed!! (ret=%d)\n\n", ret); return -1; } xi_pathname_get(pathtmp, sizeof(pathtmp)); log_print(XDLOG, " - result : pass.(current dir = %s)\n\n", pathtmp); log_print(XDLOG, "========= DONE [xi_file.h - dir/path OP] =========\n\n"); return 0; }