I strongly recommend to avoid using system() in any project. And I think Salem is right saying this is better suited to a script/batch file. Just as an exercise here's my implementation using execv(), instead:
Code:
/* cutpdf.c */
#ifndef _WIN32
# error This is for Windows only.
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <io.h>
#include <process.h>
// Windows don't have asprintf() function. Emulate one.
static int asprintf ( char **, char *, ... );
int main ( int argc, char *argv[] )
{
unsigned long first, last;
char *p;
if ( argc != 5 )
{
fputs ( "Usage: cutpdf <first page> <last page> <inpdffile> <outpdffile>\n",
stderr );
return EXIT_FAILURE;
}
char *argv_[8] = { "\"C:\\Program Files\\gs\\gs9.53.3\\bin\\gswin64.exe\"",
"-dBATCH", "-dNOPAUSE", "-sDEVICE=pdfwrite"
};
// Converts and verify validity of arguments.
first = strtoul ( argv[1], &p, 10 );
if ( *p || errno == ERANGE )
{
fputs ( "Error: First page invalid.\n", stderr );
return EXIT_FAILURE;
}
last = strtoul ( argv[2], &p, 10 );
if ( *p || errno == ERANGE )
{
fputs ( "Error: First page invalid.\n", stderr );
return EXIT_FAILURE;
}
// last page must be >= first page.
if ( first > last )
{
fputs ( "Error: First page cannot be greater than the last page.\n", stderr );
return EXIT_FAILURE;
}
// Checks if input file is readable.
if ( _access ( argv[3], 4 ) )
{
fprintf ( stderr, "Error: Cannot read '%s'.\n", argv[3] );
return EXIT_FAILURE;
}
asprintf ( &argv_[4], "-dFirstPage=%lu", first );
asprintf ( &argv_[5], "-dLastPage=%lu", last );
asprintf ( &argv_[6], "-sOutputFile=\"%s\"", argv[3] );
argv_[7] = argv[4];
// Or change to:
// asprintf( &argv_[7], "\"%s\"", argv[4] );
_execv ( argv_[0], ( const char *const * ) argv_ );
// We'll get here only if _execv() fails.
// Free the allocated strings.
free ( argv_[4] );
free ( argv_[5] );
free ( argv_[6] );
// add 'free( argv_[7] );' if you use asprintf above.
fputs ( "ERROR: Process not executed.\n", stderr );
return EXIT_FAILURE;
}
int asprintf ( char **p, char *fmt, ... )
{
char c;
int size;
va_list args;
va_start ( args, fmt );
if ( ( size = vsnprintf ( &c, sizeof c, fmt, args ) ) >= 0 )
{
*p = malloc ( size + 1 );
vsprintf ( *p, fmt, args );
}
va_end ( args );
return size;
}