/***************************************************************************** * * FileLengthEx() * *****************************************************************************/ NLM_EXTERN Nlm_Int8 LIBCALL Nlm_FileLengthEx(const Nlm_Char* fileName) { if (!fileName || !*fileName) return -1; #ifdef OS_MAC {{ OSErr err; HParamBlockRec params; Nlm_Char path[256]; Nlm_MemSet ((Nlm_VoidPtr) ¶ms, 0, sizeof (HParamBlockRec)); Nlm_StringNCpy_0(path, fileName, sizeof(path)); Nlm_CtoPstr((Nlm_CharPtr) path); params.fileParam.ioNamePtr = (StringPtr)path; params.fileParam.ioVRefNum = 0; params.fileParam.ioFDirIndex = 0; err = PBHGetFInfo(¶ms, FALSE); return (err == noErr) ? params.fileParam.ioFlLgLen : -1; }} #else {{ struct stat sbuf; return (stat(fileName, &sbuf) == 0) ? sbuf.st_size : -1; }} #endif }
/* ClearDestString clears the destination string if the source is NULL. */ static Nlm_CharPtr NEAR Nlm_ClearDestString (Nlm_CharPtr to, size_t max) { if (to != NULL && max > 0) { Nlm_MemSet (to, 0, max); *to = '\0'; } return to; }
NLM_EXTERN ValNodePtr LIBCALL Nlm_DirCatalog (Nlm_CharPtr pathname) { #ifdef OS_MAC long dirID; OSErr err; short index; unsigned short num; Nlm_Char path[PATH_MAX]; CInfoPBRec pbc; HParamBlockRec pbh; short vRefNum; #endif #ifdef OS_UNIX Nlm_Uint1 choice; #ifdef OS_UNIX_DARWIN DIR *dirp; struct dirent *dep; #else Nlm_Char buf [256]; Nlm_Char ch; Nlm_Char cmmd [PATH_MAX + 20]; FILE *fp; Nlm_CharPtr ptr; #endif #endif ValNodePtr vnp = NULL; if (pathname != NULL && pathname [0] != '\0') { #ifdef OS_MAC Nlm_StringNCpy_0 (path, pathname, sizeof (path)); Nlm_CtoPstr ((Nlm_CharPtr) path); Nlm_MemSet ((Nlm_VoidPtr) (&pbh), 0, sizeof (HParamBlockRec)); pbh.volumeParam.ioNamePtr = (StringPtr) path; pbh.volumeParam.ioVolIndex = -1; err = PBHGetVInfo (&pbh, FALSE); if (err != noErr) return NULL; vRefNum = pbh.volumeParam.ioVRefNum; Nlm_StringNCpy_0 (path, pathname, sizeof (path)); Nlm_CtoPstr ((Nlm_CharPtr) path); Nlm_MemSet ((Nlm_VoidPtr) (&pbc), 0, sizeof (CInfoPBRec)); pbc.dirInfo.ioNamePtr = (StringPtr) path; pbc.dirInfo.ioVRefNum = vRefNum; err = PBGetCatInfo (&pbc, FALSE); if (err != noErr) return NULL; if (pbc.dirInfo.ioFlAttrib & 16) { num = pbc.dirInfo.ioDrNmFls; dirID = pbc.dirInfo.ioDrDirID; for (index = 1; index <= num; index++) { Nlm_MemSet ((Nlm_VoidPtr) (&pbc), 0, sizeof (CInfoPBRec)); pbc.dirInfo.ioNamePtr = (StringPtr) path; pbc.dirInfo.ioVRefNum = vRefNum; pbc.dirInfo.ioFDirIndex = index; pbc.dirInfo.ioDrDirID = dirID; pbc.dirInfo.ioACUser = 0; err = PBGetCatInfo (&pbc, FALSE); if (err == noErr) { Nlm_PtoCstr ((Nlm_CharPtr) path); if (pbc.dirInfo.ioFlAttrib & 16) { ValNodeCopyStr (&vnp, 1, path); } else { ValNodeCopyStr (&vnp, 0, path); } } } } #endif #if defined(WIN32) {{ Nlm_Char x_path[PATH_MAX]; WIN32_FIND_DATA fData; HANDLE hFindFile; Nlm_StringNCpy_0(x_path, pathname, sizeof(x_path) - 5); Nlm_StringCat(x_path, "\\*.*"); hFindFile = FindFirstFile(x_path, &fData); if (hFindFile == INVALID_HANDLE_VALUE) return 0; do { if (fData.cFileName[0] != '.' || (fData.cFileName[1] != '.' && fData.cFileName[1] != '\0')) ValNodeCopyStr (&vnp, (fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0, fData.cFileName); } while ( FindNextFile(hFindFile, &fData) ); FindClose(hFindFile); }} #endif #ifdef OS_UNIX #ifdef OS_UNIX_DARWIN dirp = opendir(pathname); if (dirp == NULL) return NULL; while ((dep = readdir(dirp)) != NULL) { /* ignore 'invisible' files. */ if (dep->d_namlen < 1 || dep->d_name[0] == '.') continue; if (dep->d_type == DT_DIR) /* directory */ choice = 1; else /* all other file types. */ choice = 0; ValNodeCopyStr (&vnp, choice, dep->d_name); } closedir(dirp); #else sprintf (cmmd, "ls -1p %s 2>/dev/null", pathname); fp = popen (cmmd, "r"); if (fp == NULL) return NULL; while (Nlm_FileGets (buf, sizeof (buf), fp) != NULL) { ptr = buf; ch = *ptr; while (ch != '\0' && ch != '\n' && ch != '\r') { ptr++; ch = *ptr; } *ptr = '\0'; choice = 0; ptr = Nlm_StringChr (buf, '/'); if (ptr != NULL) { *ptr = '\0'; choice = 1; } ValNodeCopyStr (&vnp, choice, buf); } pclose (fp); #endif #endif #ifdef OS_VMS #endif } return vnp; }
NLM_EXTERN Nlm_CharPtr LIBCALL Nlm_rule_line(const Nlm_Char FAR PNTR str, size_t len, enumRuleLine method) { size_t str_len; size_t n_space; /* allocate and initialize the resulting string */ Nlm_CharPtr s = (Nlm_CharPtr) Nlm_MemNew(len + 1); Nlm_MemSet(s, SPACE, len); s[len] = '\0'; /* skip leading and trailing spaces */ while ( IS_WHITESP(*str) ) str++; if ( !*str ) return s; for (str_len = Nlm_StringLen( str ); IS_WHITESP(str[str_len-1]); str_len--) continue; /* truncate the original string if doesn't fit */ if (len <= str_len) { x_memcpy(s, str, len); return s; } n_space = len - str_len; switch ( method ) { case RL_Left: { x_memcpy(s, str, str_len); break; } case RL_Right: { x_memcpy(s + n_space, str, str_len); break; } case RL_Spread: { size_t n_gap = 0; int prev_space = 0; const Nlm_Char FAR PNTR _str = str; size_t i = str_len; for ( ; i--; _str++) { ASSERT ( *_str ); if ( IS_WHITESP(*_str) ) { if ( !prev_space ) { n_gap++; prev_space = 1; } n_space++; } else prev_space = 0; } ASSERT ( !prev_space ); if ( n_gap ) { size_t n_div = n_space / n_gap; size_t n_mod = n_space % n_gap; Nlm_CharPtr _s = s; for (_str = str; *_str; ) { if ( !IS_WHITESP( *_str ) ) *_s++ = *_str++; else if ( n_space ) { size_t n_add = n_div; if (n_mod > 0) { n_add++; n_mod--; } n_space -= n_add; while ( n_add-- ) *_s++ = SPACE; for (_str++; IS_WHITESP(*_str); _str++) continue; } else break; } ASSERT ( _s == s + len ); break; } /* else -- use RL_Center */ } case RL_Center: { x_memcpy(s + n_space/2, str, str_len); break; } default: ASSERT ( 0 ); Nlm_MemFree( s ); return 0; } return s; }