AcePerl
view release on metacpan or search on metacpan
acelib/filsubs.c view on Meta::CPAN
bravo:
stackDestroy(s) ;
return fil ;
} /* filqueryopen */
/*********************************************/
static Associator mailFile = 0, mailAddress = 0 ;
UTIL_FUNC_DEF void filclose (FILE *fil)
{
char *address ;
char *filename ;
if (!fil || fil == stdin || fil == stdout || fil == stderr)
return ;
fclose (fil) ;
if (mailFile && assFind (mailFile, fil, &filename))
{ if (assFind (mailAddress, fil, &address))
callScript ("mail", messprintf ("%s %s", address, filename)) ;
else
messerror ("Have lost the address for mailfile %s", filename) ;
assRemove (mailFile, fil) ;
assRemove (mailAddress, fil) ;
unlink (filename) ;
free (filename) ;
}
} /* filclose */
/***********************************/
UTIL_FUNC_DEF FILE *filmail (char *address) /* requires filclose() */
{
char *filename ;
FILE *fil ;
if (!mailFile)
{ mailFile = assCreate () ;
mailAddress = assCreate () ;
}
if (!(fil = filtmpopen (&filename, "w")))
{ messout ("failed to open temporary mail file %s", filename) ;
return 0 ;
}
assInsert (mailFile, fil, filename) ;
assInsert (mailAddress, fil, address) ;
return fil ;
} /* filmail */
/******************* directory stuff *************************/
static int dirOrder(void *a, void *b)
{
char *cp1 = *(char **)a, *cp2 = *(char**)b;
return strcmp(cp1, cp2) ;
} /* dirOrder */
/* returns an Array of strings representing the filename in the
given directory according to the spec. "r" will list all files,
and "rd" will list all directories.
The behaviour of the "w" spec is undefined.
The array has to be destroyed using filDirectoryDestroy,
because the memory of the strings needs to be reclaimed as well. */
UTIL_FUNC_DEF Array filDirectoryCreate (char *dirName,
char *ending,
char *spec)
{
Array a ;
#if !defined(WIN32) && !defined(DARWIN)
DIR *dirp ;
char *dName, *dName_copy, entryPathName[MAXPATHLEN], *leaf ;
int dLen, endLen ;
MYDIRENT *dent ;
if (!dirName || !(dirp = opendir (dirName)))
return 0 ;
if (ending)
endLen = strlen (ending) ;
else
endLen = 0 ;
strcpy (entryPathName, dirName) ;
strcat (entryPathName, "/") ;
leaf = entryPathName + strlen(dirName) + 1 ;
a = arrayCreate (16, char*) ;
while ((dent = readdir (dirp)))
{ dName = dent->d_name ;
dLen = strlen (dName) ;
if (endLen && (dLen <= endLen ||
dName[dLen-endLen-1] != '.' ||
strcmp (&dName[dLen-endLen],ending)))
continue ;
strcpy (leaf, dName) ;
if (!filCheck (entryPathName, spec))
continue ;
if (ending && dName[dLen - endLen - 1] == '.') /* remove ending */
dName[dLen - endLen - 1] = 0 ;
/* the memory of these strings is freed my
the messfree()'s in filDirectoryDestroy() */
dName_copy = messalloc(strlen(dName)+1) ;
strcpy (dName_copy, dName);
array(a, arrayMax(a), char*) = dName_copy;
}
closedir (dirp) ;
/************* reorder ********************/
arraySort(a, dirOrder) ;
return a ;
#else /* defined(WIN32) */
return 0 ;
#endif /* defined(WIN32) */
} /* filDirectoryCreate */
( run in 0.875 second using v1.01-cache-2.11-cpan-d80b1682f3f )