This is rleaddcom.c in view mode; [Download] [Up]
/* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * rle_addcom.c - Add comment[s] to an RLE file. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Sun Jan 25 1987 * Copyright (c) 1987, University of Utah */ #include <stdio.h> #include <rle.h> #include <sys/types.h> #include <sys/param.h> /* for MAXPATHLEN */ #include <sys/stat.h> #ifdef USE_STDLIB_H #include <stdlib.h> #else #ifdef USE_STRING_H #include <string.h> #define rindex strrchr #else #include <strings.h> #endif #endif /* USE_STDLIB_H */ #ifdef S_IFSOCK /* should work */ # define BSD42 #endif #ifndef MAXPATHLEN # define MAXPATHLEN BUFSIZ #endif static char temp[] = "intoXXXXXXXX"; static char buf[MAXPATHLEN+1]; /***************************************************************** * TAG( main ) * * Add one or more comments to an RLE file. * * Usage: * rle_addcom [-d] [-i] [-o outfile] infile comments ... * Inputs: * -d: Delete matching comments instead of adding any. * -i: Do it "in place" -- replace the input file. * outfile: Modified file with comments (defaults to stdout). * infile: File to add comments to. * comments: One or more strings. Each will be inserted as * a separate comment. They will usually be of the * form "name=value". * Outputs: * Writes modified RLE file to standard output. * Assumptions: * [None] * Algorithm: * [None] */ void main( argc, argv ) int argc; char **argv; { rle_hdr out_hdr; char * fname = NULL, * out_fname = NULL; char *i_fname = NULL; FILE *outfile = stdout; char ** comments = NULL; char *my_name; int oflag = 0, iflag = 0, delflag = 0, ncomment = 0; int is_pipe = 0; register int j; int rle_cnt, rle_err; my_name = cmd_name( argv ); if ( scanargs( argc, argv, "% d%- i%- o%-outfile!s infile!s comments!*s", &delflag, &iflag, &oflag, &out_fname, &fname, &ncomment, &comments ) == 0 ) exit( 1 ); if ( iflag ) { register char *cp; if ( oflag ) i_fname = out_fname; else i_fname = fname; /* Recognize rle_open_f special cases. */ if ( strcmp( i_fname, "-" ) == 0 ) { fprintf( stderr, "%s: Can't add comments \"in place\" to standard %s.\n", my_name, oflag ? "output" : "input" ); exit( 1 ); } #ifndef NO_OPEN_PIPES if ( *i_fname == '|' ) { fprintf( stderr, "%s: Can't add comments \"in place\" to piped %s.\n", my_name, oflag ? "output" : "input" ); exit( 1 ); } #endif strcpy( buf, i_fname ); if ( (cp = rindex( buf, '/' )) != NULL ) { *++cp = 0; strcat( buf, temp ); } else strcpy( buf, temp ); mktemp( buf ); #ifndef NO_OPEN_PIPES /* Compressed file special case. */ cp = i_fname + strlen( i_fname ) - 2; if ( cp > i_fname && *cp == '.' && *(cp + 1) == 'Z' ) { strcat( buf, ".Z" ); is_pipe = 1; } #endif out_fname = buf; } rle_dflt_hdr.rle_file = rle_open_f(my_name, fname, "r"); /* Read in header */ for ( rle_cnt = 0; (rle_err = rle_get_setup( &rle_dflt_hdr )) == RLE_SUCCESS; rle_cnt++ ) { out_hdr = rle_dflt_hdr; if ( rle_cnt == 0 ) outfile = rle_open_f( my_name, out_fname, "w" ); out_hdr.rle_file = outfile; /* Copy input to the_hdr struct */ for ( j = 0; j < ncomment; j++ ) { if ( ! delflag ) rle_putcom( comments[j], &out_hdr ); else rle_delcom( comments[j], &out_hdr ); } /* Start output file */ rle_put_setup( &out_hdr ); /* Copy rest of input to output */ rle_cp( &rle_dflt_hdr, &out_hdr ); } /* Check for an error. EOF or EMPTY is ok if at least one image * has been read. Otherwise, print an error message. */ if ( rle_cnt == 0 || (rle_err != RLE_EOF && rle_err != RLE_EMPTY) ) { rle_get_error( rle_err, my_name, fname ); rle_err = 1; } else rle_err = 0; if ( iflag ) { if ( rle_err ) fprintf( stderr, "%s: %s not replaced\n", my_name, i_fname ); else { #ifndef NO_OPEN_PIPES /* Have to call pclose, else file may not exist yet! */ if ( is_pipe ) pclose( outfile ); else #endif fclose( outfile ); if ( rename( buf, i_fname ) < 0 ) { fprintf( stderr, "%s: rename failed: ", my_name ); perror( "" ); unlink( buf ); /* Get rid of temp file. */ } } } exit( 0 ); } #ifndef BSD42 rename( file1, file2 ) char *file1, *file2; { struct stat st; if ( stat(file2, &st) >= 0 && unlink(file2) < 0 ) return -1; if ( link(file1, file2) < 0 ) return -1; return unlink( file1 ); } #endif /* !BSD42 */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.