void push(int data){ int parent = PARENT(size); int idx = size; arr[size] = data; while (!ISROOT(idx) && arr[parent] < arr[idx]){ swap(arr[parent], arr[idx]); idx = parent; parent = PARENT(parent); } size++; }
/************************************************************************ * iumfs_make_directory_with_name() * * 名前付で新しいディレクトリを作成する。 * 内部で、iumfs_make_directory() を呼び、かつ iumnode 構造体の pathname * に新しいディレクトリのパス名をセットする。 * * 引数: * * vfsp : vfs 構造体 * vpp : 呼び出し側から渡された vnode 構造体のポインタのアドレス * mvp : ディレクトリマウントポイントの vnode 構造体のポインタ * cr : システムコールを呼び出したユーザのクレデンシャル * dirname : 新しいディレクトリの名前 * nodeid : 新しいディレクトリがもつ node 番号(0だと自動割当) * * 戻り値: * * 成功時 : SUCCESS(=0) * エラー時 : エラー番号 * ************************************************************************/ int iumfs_make_directory_with_name(vfs_t *vfsp, vnode_t **vpp, vnode_t *parentvp, struct cred *cr, char *dirname, ino_t nodeid) { int err = SUCCESS; iumnode_t *newdirinp; // 新しいディレクトリの iumnode(ノード情報) vnode_t *newdirvp; // 新しいディレクトリの vnode iumnode_t *parentinp; // 親ディレクトリの iumnode(ノード情報) int namelen; DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name is called\n")); parentinp = VNODE2IUMNODE(parentvp); /* * まずは、渡されたディレクトリ名の長さをチェック */ namelen = strlen(dirname); if (namelen > MAXNAMLEN) { DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(ENAMETOOLONG)\n")); return (ENAMETOOLONG); } /* * つづいて、パス名の長さもチェック */ if (strlen(parentinp->pathname) + namelen > IUMFS_MAXPATHLEN) { DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(ENAMETOOLONG)\n")); return (ENAMETOOLONG); } /* * iumfs_make_directory() を呼び新規ディレクトリを作成する。 */ err = iumfs_make_directory(vfsp, vpp, parentvp, cr, nodeid); if (err) { DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(%d)\n", err)); return (err); } /* * 新しいディレクトリのパス名をセットする。 * パス名は「親ディレクトリのパス名 + 新しいディレクトリ名」 * もし親ディレクトリがファイルシステムルートだったら、余計な「/」はつけない。 */ newdirvp = *vpp; newdirinp = VNODE2IUMNODE(newdirvp); if (ISROOT(parentinp->pathname)) snprintf(newdirinp->pathname, IUMFS_MAXPATHLEN, "/%s", dirname); else snprintf(newdirinp->pathname, IUMFS_MAXPATHLEN, "%s/%s", parentinp->pathname, dirname); DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(0)\n")); return (0); }