/***************************************************************************** * * TmpNam() * *****************************************************************************/ NLM_EXTERN Nlm_CharPtr LIBCALL Nlm_TmpNam (Nlm_CharPtr s) { #ifdef TEMPNAM_AVAIL char *filename; static Nlm_Char save_filename[PATH_MAX]; /* emulate tmpnam(), except get the benefits of tempnam()'s ability to */ /* place the files in another directory specified by the environment */ /* variable TMPDIR */ #ifdef OS_UNIX_DARWIN filename = tempnam("/tmp", "ncbi."); #else filename = tempnam(NULL, NULL); #endif if (s == NULL) { /* return pointer to static string */ if (filename != NULL) { strcpy ((char *) save_filename, (char *) filename); free ((void *) filename); } else { save_filename [0] = '\0'; } return save_filename; } else { if (filename != NULL) { strcpy ((char *) save_filename, (char *) filename); Nlm_StrCpy (s, save_filename); free ((void *) filename); } else { *s = '\0'; } return s; } #else #ifdef OS_MAC static Nlm_Char directory [PATH_MAX]; OSErr err; long gesResponse; long newDirID; short newVRefNum; CInfoPBRec params; Nlm_Char temp [PATH_MAX]; Nlm_CharPtr tmp; Nlm_Boolean useTempFolder; char * filename; useTempFolder = FALSE; if (! Gestalt (gestaltFindFolderAttr, &gesResponse) && (gesResponse & (1 << gestaltFindFolderPresent))) { err = FindFolder(kOnSystemDisk, kTemporaryFolderType, kCreateFolder, &newVRefNum, &newDirID); if (err == noErr) { useTempFolder = TRUE; } } filename = tmpnam (NULL); if (useTempFolder) { temp [0] = '\0'; params.dirInfo.ioNamePtr = (StringPtr) directory; params.dirInfo.ioDrParID = newDirID; do { params.dirInfo.ioVRefNum = newVRefNum; params.dirInfo.ioFDirIndex = -1; params.dirInfo.ioDrDirID = params.dirInfo.ioDrParID; err = PBGetCatInfo (¶ms, FALSE); Nlm_PtoCstr ((Nlm_CharPtr) directory); Nlm_StringCat (directory, DIRDELIMSTR); Nlm_StringCat (directory, temp); Nlm_StringCpy (temp, directory); } while (params.dirInfo.ioDrDirID != fsRtDirID); tmp = Nlm_StringMove (directory, temp); tmp = Nlm_StringMove (tmp, (Nlm_CharPtr) filename); if (s == NULL) { return (Nlm_CharPtr) directory; } else { s [0] = '\0'; Nlm_StringCpy (s, directory); return s; } } else { if (s == NULL) { return (Nlm_CharPtr) filename; } else { s [0] = '\0'; Nlm_StringCpy (s, filename); return s; } } #else char * filename; filename = tmpnam (NULL); if (s == NULL) { return (Nlm_CharPtr) filename; } else { s [0] = '\0'; Nlm_StringCpy (s, filename); return s; } #endif #endif }
NLM_EXTERN Nlm_Boolean LIBCALL StringSubString(char FAR *theString, char FAR *Find, char FAR *Replace, Nlm_Int4 MaxLength) /* replaces all non-overlapping instances of the string Find in the string theString with the string Replace. The strings do not have to be the same size. The new string is truncated at MaxLength characters Including the final NULL). If MaxLength is zero, the string's current length is presumed to be the maximum. It returns TRUE if any strings were replaced, else FALSE. */ { Nlm_CharPtr FindPtr,ComparePtr,StringPtr,NewString, NewStringPtr; Nlm_Int4 SpaceNeeded,Len; Nlm_Boolean Replaced = FALSE; if (*Find == NULLB) return(FALSE); Len = Nlm_StringLen(theString); SpaceNeeded = MAX( (Nlm_Int4)((Len * Nlm_StringLen(Replace) * sizeof(Nlm_Char) ) / Nlm_StringLen(Find) + 1),Len) + 1; NewStringPtr = NewString = (Nlm_CharPtr) Nlm_MemGet((size_t)SpaceNeeded, MGET_ERRPOST); StringPtr = theString; while (*StringPtr != NULLB) { FindPtr = Find; ComparePtr = StringPtr; while ( (*FindPtr != NULLB) && (*FindPtr == *ComparePtr) ) { FindPtr++; ComparePtr++; } /* if we found the entire string, replace it. */ if (*FindPtr == NULLB) { NewStringPtr = StringMove(NewStringPtr,Replace); StringPtr = ComparePtr; Replaced = TRUE; } else /* otherwise, move on to the next character. */ *NewStringPtr++ = *StringPtr++; } *NewStringPtr = NULLB; if (MaxLength <= 0) MaxLength = strlen(theString) + 1; /* Truncate the string, if necessary.*/ if ((Nlm_Int4)strlen(NewString) >= MaxLength - 1) { NewString[MaxLength-1] = NULLB; } Nlm_StringCpy(theString,NewString); Nlm_MemFree(NewString); return(Replaced); }