示例#1
0
struct lineFile* gzLineFileOpen(char *fileName)
/* Open a line file, checking the file name to determine if the file is
 * compressed.  If it ends in .gz, .Z, or .bz2 it will be piped through the
 * approriate decompression program. Must use gzLineFileClose() to close the
 * file. */
{
char **compressor = gbGetCompressor(fileName, "r");
if (compressor != NULL)
    {
    char *argv[4], **cmds[2];
    struct gbPipeline *pipeline;
    argv[0] = compressor[0];
    argv[1] = compressor[1];
    argv[2] = fileName;
    argv[3] = NULL;
    cmds[0] = argv;
    cmds[1] = NULL;
    
    pipeline = gbPipelineCreate(cmds, PIPELINE_READ, NULL, NULL);
    return lineFileAttach(gbPipelineDesc(pipeline),
                          TRUE, gbPipelineFd(pipeline));
    }
else
    return lineFileOpen(fileName, TRUE);
}
示例#2
0
FILE *openSortOutput(char *fileName, char **sortSpec)
/* Open a pipeline to sort and compress output.  SortSpec is null-terminated
 * list of fields options to pass to sort.  gSortTmpDir maybe null.
 * gbOutputRename is used to install and close.
 */
{
struct gbPipeline *pipeline;
char tmpPath[PATH_LEN];
char **compressor;
char **sortCmd, **cmds[3];
int nSort, iSort = 0, i;

/* sort cmd, nSort includes cmd and NULL */
for (nSort = 0; sortSpec[nSort] != NULL; nSort++)
    continue;
if (gSortTmp != NULL)
    nSort += 2;
nSort += 2; /* for "sort" and  NULL */
sortCmd = alloca(nSort*sizeof(char*));
sortCmd[iSort++] = "sort";
if (gSortTmp != NULL)
    {
    sortCmd[iSort++] = "-T";
    sortCmd[iSort++] = gSortTmp;
    }
for (i = 0; sortSpec[i] != NULL; i++)
    sortCmd[iSort++] = sortSpec[i];
sortCmd[iSort] = NULL;
assert(iSort < nSort);
cmds[0] = sortCmd;
cmds[1] = NULL;

/* compress process, if needed */
compressor = gbGetCompressor(fileName, "w");
if (compressor != NULL)
    {
    cmds[1] = compressor;
    cmds[2] = NULL;
    }

/* tmp name to output to */
gbGetOutputTmp(fileName, tmpPath);
gbMakeFileDirs(tmpPath);

pipeline = gbPipelineCreate(cmds, PIPELINE_WRITE|PIPELINE_FDOPEN, NULL,
                            tmpPath);
return gbPipelineFile(pipeline);
}
示例#3
0
FILE* gzMustOpen(char* fileName, char *mode)
/* Open a file for read or write access.  If it ends in .gz, .Z, or .bz2 it
 * will be piped through the approriate decompression program. Must use
 * gzClose() to close the file. */
{
char  **compressor = gbGetCompressor(fileName, mode);
if (compressor != NULL)
    {
    char *argv[4], *outFile, **cmds[2];
    unsigned options = PIPELINE_FDOPEN;
    struct gbPipeline *pipeline;
    argv[0] = compressor[0];
    argv[1] = compressor[1];

    /* compress options */
    if (sameString(mode, "r"))
        {
        argv[2] = fileName;
        argv[3] = NULL;
        outFile = NULL;
        options |= PIPELINE_READ;
        }
    else
        {
        argv[2] = NULL;
        outFile = fileName;
        if (sameString(mode, "w"))
            options |= PIPELINE_WRITE;
        else if (sameString(mode, "a"))
            errAbort("gzMustOpen append mode does not work for compressed output");
        else
            errAbort("invalid mode for gzMustOpen \"%s\"", mode);
        }
    cmds[0] = argv;
    cmds[1] = NULL;

    pipeline = gbPipelineCreate(cmds, options, NULL, outFile);
    return gbPipelineFile(pipeline);
    }
else
    return mustOpen(fileName, mode);
}
示例#4
0
void gbGetOutputTmp(char *path, char *tmpPath)
/* generate the tmp path name, moving the compress extension if needed */
{
char savedExt[32];
int len;
savedExt[0] = '\0';
strcpy(tmpPath, path);
/* don't add extension for special names */
if (!isSpecialName(path))
    {
    if (gbGetCompressor(tmpPath, "r") != NULL)
        {
        char *last = strrchr(tmpPath, '.');
        strcpy(savedExt, last);
        *last = '\0';
        }
    len = strlen(tmpPath);
    safef(tmpPath+len, PATH_LEN-len, ".%d.%s.tmp%s", getpid(), getHost(),
          savedExt);
    }
}