Document/RB_Document_Create_DocFilePaths [ Functions ]
FUNCTION
This function creates the whole document directory tree. It tests if the directories exist and if they do not the directory is created.
SYNOPSIS
void RB_Document_Create_DocFilePaths( struct RB_Document *document )
INPUTS
- document -- the document for which the tree is created.
SOURCE
{ struct RB_Path *path; for ( path = document->srctree->first_path; path; path = path->next ) { char *pathname = NULL; char *c2 = NULL; RB_Say( "Trying to create directory %s\n", SAY_INFO, path->docname ); /* Don't want to modify the docname in the path structure. So we make a copy that we later destroy. */ pathname = RB_StrDup( path->docname ); for ( c2 = pathname + 1; /* We skip the leading '/' */ *c2; ++c2 ) { if ( *c2 == '/' ) { struct stat dirstat; *c2 = '\0'; /* Replace the '/' with a '\0'. */ /* We now have one of the paths leading up to the total path. Test if it exists. */ if ( stat( pathname, &dirstat ) == 0 ) { /* Path exists. */ } else if ( ( strlen( pathname ) == 2 ) && ( utf8_isalpha( pathname[0] ) ) && ( pathname[1] == ':' ) ) { /* Is is a drive indicator, ( A: B: C: etc ) * stat fails on this, but we should not * create either, so we do nothing. */ } else { int result; #if defined(__MINGW32__) result = mkdir( pathname ); #else result = mkdir( pathname, 0770 ); #endif if ( result == 0 ) { /* Path was created. */ } else { perror( NULL ); RB_Panic( "Can't create directory %s\n", pathname ); } } /* Put the '/' back in it's place. */ *c2 = '/'; } } free( pathname ); } }