/****************************************************************************** * This file is Copyright 1992 by Philip G. Richards. All Rights Reserved. * See the file README that came with this distribution for permissions on * code usage, copying, and distribution. It comes with absolutely no warranty. ******************************************************************************/ #include "client.h" #include "main.h" #include "parse.h" #include <ctype.h> extern char **environ; #define ISMAGIC 0x80 #define ISPROT 0x40 void #ifndef ANSI_PROTOTYPES freemyargs(argc, argv) int argc; char *argv[]; #else /* ANSI_PROTOTYPES */ freemyargs(int argc, char **argv) #endif /* ANSI_PROTOTYPES */ { int i; if (argv == (char**)0) return; #ifdef MALLOCDEBUG { int oldlvl = malloc_debug(0); #endif for (i = 0; i < argc && argv[i]; i++) (void)free(argv[i]); #ifdef MALLOCDEBUG (void)malloc_debug(oldlvl); if (!malloc_verify()) { ffprintf(STDERR, "??freemyargs() has screwed up malloc()\n"); abort(); } } #endif }
/* NeXT specific efun for setting the debugging level of NeXT's built-in malloc. */ void f_malloc_debug (void) { int level; level = sp->u.number; if (level < 0) { int rc; rc = malloc_debug(0); malloc_singlethreaded(); sp->u.number = rc; } else { sp->u.number = malloc_debug(level); } }
int alder_smartall_test() { char *cp, *ra; #ifdef OLD_unix malloc_debug(2); #endif /* Allocate and chain together storage that's subject to the orphaned buffer check. */ ec(malloc(120)); ec(alloc(200)); ec(calloc(10, 4)); ra = alloc(60); strcpy(ra + 8, "Hello, there. This is data."); ra = realloc(ra, 100); ra = realloc(ra, 100); ra = realloc(ra, 2048); ec(realloc(ra, 55)); /* Allocate and chain some storage for which checking is disabled by the sm_static mechanism. */ sm_static(1); ra = malloc(10); ra = alloc(20); ra = calloc(30, sizeof(short)); ra = realloc(ra, 40); sm_static(0); /* Test the "actually" variants. */ ra = actuallymalloc(100); ra = actuallycalloc(10, sizeof(double)); ra = actuallyrealloc(ra, 15 * sizeof(double)); actuallyfree(ra); /* Produce orphan buffer listing. */ sm_dump(0); // sm_dump(Dumparam); /* Release chained buffers. */ while (bchain != NULL) { dc(); } /* Now verify that all have been released. */ #ifdef SMARTALLOC fprintf(stderr, "No orphaned buffer messages should follow this line.\n"); #endif sm_dump(1); return 0; }
int main () { char * pChar; printf ("Testing Debug malloc!!\n"); pChar = (char *)malloc_debug (sizeof(char)*5); pChar[0] = 'a'; pChar[1] = 'b'; pChar[2] = 'a'; pChar[3] = 'b'; pChar[4] = 'a'; //pChar[5] = 'b'; free_debug (pChar); printf ("Tests completed.\n"); return 0; }
void* setnetpath() { struct netpath_vars* np_sessionp; /* this session's variables */ char* npp; /* NETPATH env variable */ #ifdef MEM_CHK malloc_debug(1); #endif if ((np_sessionp = (struct netpath_vars*)malloc(sizeof(struct netpath_vars))) == NULL) { return (NULL); } if ((np_sessionp->nc_handlep = setnetconfig()) == NULL) { free(np_sessionp); syslog(LOG_ERR, "rpc: failed to open " NETCONFIG); goto failed; } np_sessionp->valid = NP_VALID; np_sessionp->ncp_list = NULL; if ((npp = getenv(NETPATH)) == NULL) { np_sessionp->netpath = NULL; } else { (void) endnetconfig(np_sessionp->nc_handlep);/* won't need nc session*/ np_sessionp->nc_handlep = NULL; if ((np_sessionp->netpath = malloc(strlen(npp) + 1)) == NULL) { goto failed; } else { (void) strcpy(np_sessionp->netpath, npp); } } np_sessionp->netpath_start = np_sessionp->netpath; return ((void*)np_sessionp); failed: free(np_sessionp); return (NULL); }
int main(int argc, char **argv) #endif { int i; #ifdef LINUXVGA LINUX_setup(); /* setup VGA before dropping privilege DBT 4/5/99 */ drop_privilege(); #endif /* make sure that we really have revoked root access, this might happen if gnuplot is compiled without vga support but is installed suid by mistake */ #ifdef __linux__ setuid(getuid()); #endif #if defined(MSDOS) && !defined(_Windows) && !defined(__GNUC__) PC_setup(); #endif /* MSDOS !Windows */ /* HBB: Seems this isn't needed any more for DJGPP V2? */ /* HBB: disable all floating point exceptions, just keep running... */ #if defined(DJGPP) && (DJGPP!=2) _control87(MCW_EM, MCW_EM); #endif #if defined(OS2) int rc; #ifdef OS2_IPC char semInputReadyName[40]; sprintf( semInputReadyName, "\\SEM32\\GP%i_Input_Ready", getpid() ); rc = DosCreateEventSem(semInputReadyName,&semInputReady,0,0); if (rc != 0) fputs("DosCreateEventSem error\n",stderr); #endif rc = RexxRegisterSubcomExe("GNUPLOT", (PFN) RexxInterface, NULL); #endif /* malloc large blocks, otherwise problems with fragmented mem */ #ifdef MALLOCDEBUG malloc_debug(7); #endif /* get helpfile from home directory */ #ifdef __DJGPP__ { char *s; strcpy(HelpFile, argv[0]); for (s = HelpFile; *s; s++) if (*s == DIRSEP1) *s = DIRSEP2; /* '\\' to '/' */ strcpy(strrchr(HelpFile, DIRSEP2), "/gnuplot.gih"); } /* Add also some "paranoid" tests for '\\': AP */ #endif /* DJGPP */ #ifdef VMS unsigned int status[2] = { 1, 0 }; #endif #if defined(HAVE_LIBEDITLINE) rl_getc_function = getc_wrapper; #endif #if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDITLINE) /* T.Walter 1999-06-24: 'rl_readline_name' must be this fix name. * It is used to parse a 'gnuplot' specific section in '~/.inputrc' * or gnuplot specific commands in '.editrc' (when using editline * instead of readline) */ rl_readline_name = "Gnuplot"; rl_terminal_name = getenv("TERM"); using_history(); #endif #if defined(HAVE_LIBREADLINE) && !defined(MISSING_RL_TILDE_EXPANSION) rl_complete_with_tilde_expansion = 1; #endif for (i = 1; i < argc; i++) { if (!argv[i]) continue; if (!strcmp(argv[i], "-V") || !strcmp(argv[i], "--version")) { printf("gnuplot %s patchlevel %s\n", gnuplot_version, gnuplot_patchlevel); return 0; } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { printf( "Usage: gnuplot [OPTION]... [FILE]\n" #ifdef X11 "for X11 options see 'help X11->command-line-options'\n" #endif " -V, --version\n" " -h, --help\n" " -p --persist\n" " -e \"command1; command2; ...\"\n" "gnuplot %s patchlevel %s\n" #ifdef DIST_CONTACT "Report bugs to "DIST_CONTACT"\n" " or %s\n", #else "Report bugs to %s\n", #endif gnuplot_version, gnuplot_patchlevel, bug_email); return 0; } else if (!strncmp(argv[i], "-persist", 2) || !strcmp(argv[i], "--persist")) { persist_cl = TRUE; } } #ifdef X11 /* the X11 terminal removes tokens that it recognizes from argv. */ { int n = X11_args(argc, argv); argv += n; argc -= n; } #endif setbuf(stderr, (char *) NULL); #ifdef HAVE_SETVBUF /* this was once setlinebuf(). Docs say this is * identical to setvbuf(,NULL,_IOLBF,0), but MS C * faults this (size out of range), so we try with * size of 1024 instead. [SAS/C does that, too. -lh] * Failing this, I propose we just make the call and * ignore the return : its probably not a big deal */ if (setvbuf(stdout, (char *) NULL, _IOLBF, (size_t) 1024) != 0) (void) fputs("Could not linebuffer stdout\n", stderr); #ifdef X11 /* This call used to be in x11.trm, with the following comment: * Multi-character inputs like escape sequences but also mouse-pasted * text got buffered and therefore didn't trigger the select() function * in X11_waitforinput(). Switching to unbuffered input solved this. * 23 Jan 2002 (joze) * But switching to unbuffered mode causes all characters in the input * buffer to be lost. So the only safe time to do it is on program entry. * The #ifdef X11 is probably unnecessary, but makes the change minimal. * Do any non-X platforms suffer from the same problem? * EAM - Jan 2004. */ setvbuf(stdin, (char *) NULL, _IONBF, 0); #endif #endif gpoutfile = stdout; /* Initialize pre-loaded user variables */ (void) Gcomplex(&udv_pi.udv_value, M_PI, 0.0); udv_NaN = add_udv_by_name("NaN"); (void) Gcomplex(&(udv_NaN->udv_value), not_a_number(), 0.0); udv_NaN->udv_undef = FALSE; init_memory(); interactive = FALSE; init_terminal(); /* can set term type if it likes */ push_terminal(0); /* remember the default terminal */ /* reset the terminal when exiting */ /* this is done through gp_atexit so that other terminal functions * can be registered to be executed before the terminal is reset. */ GP_ATEXIT(term_reset); # if defined(_Windows) && ! defined(WGP_CONSOLE) interactive = TRUE; # else interactive = isatty(fileno(stdin)); # endif if (argc > 1) interactive = noinputfiles = FALSE; else noinputfiles = TRUE; /* Need this before show_version is called for the first time */ #ifdef HAVE_SYS_UTSNAME_H { struct utsname uts; /* something is fundamentally wrong if this fails ... */ if (uname(&uts) > -1) { # ifdef _AIX strcpy(os_name, uts.sysname); sprintf(os_name, "%s.%s", uts.version, uts.release); # elif defined(SCO) strcpy(os_name, "SCO"); strcpy(os_rel, uts.release); # elif defined(DJGPP) if (!strncmp(uts.sysname, "??Un", 4)) /* don't print ??Unknow" */ strcpy(os_name, "Unknown"); else { strcpy(os_name, uts.sysname); strcpy(os_rel, uts.release); } # else strcpy(os_name, uts.sysname); strcpy(os_rel, uts.release); # ifdef OS2 if (!strchr(os_rel,'.')) /* write either "2.40" or "4.0", or empty -- don't print "OS/2 1" */ strcpy(os_rel, ""); # endif # endif } } #else /* ! HAVE_SYS_UTSNAME_H */ strcpy(os_name, OS); strcpy(os_rel, ""); #endif /* HAVE_SYS_UTSNAME_H */ if (interactive) show_version(stderr); else show_version(NULL); /* Only load GPVAL_COMPILE_OPTIONS */ #ifdef WGP_CONSOLE #ifdef CONSOLE_SWITCH_CP if (cp_changed && interactive) { fprintf(stderr, "\ngnuplot changed the codepage of this console from %i to %i to\n" \ "match the graph window. Some characters might only display correctly\n" \ "if you change the font to a non-raster type.\n", cp_input, GetConsoleCP()); } #else if ((GetConsoleCP() != GetACP()) && interactive) { fprintf(stderr, "\nWarning: The codepage of the graph window (%i) and that of the\n" \ "console (%i) differ. Use `set encoding` or `!chcp` if extended\n" \ "characters don't display correctly.\n", GetACP(), GetConsoleCP()); } #endif #endif update_gpval_variables(3); /* update GPVAL_ variables available to user */ #ifdef VMS /* initialise screen management routines for command recall */ if (status[1] = smg$create_virtual_keyboard(&vms_vkid) != SS$_NORMAL) done(status[1]); if (status[1] = smg$create_key_table(&vms_ktid) != SS$_NORMAL) done(status[1]); #endif /* VMS */ if (!SETJMP(command_line_env, 1)) { /* first time */ interrupt_setup(); /* should move this stuff another initialisation routine, * something like init_set() maybe */ get_user_env(); init_loadpath(); init_locale(); /* HBB: make sure all variables start in the same mode 'reset' * would set them to. Since the axis variables aren't in * initialized arrays any more, this is now necessary... */ reset_command(); init_color(); /* Initialization of color */ load_rcfile(); init_fit(); /* Initialization of fitting module */ if (interactive && term != 0) { /* not unknown */ #ifdef GNUPLOT_HISTORY FPRINTF((stderr, "Before read_history\n")); #if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDITLINE) expanded_history_filename = tilde_expand(GNUPLOT_HISTORY_FILE); #else expanded_history_filename = gp_strdup(GNUPLOT_HISTORY_FILE); gp_expand_tilde(&expanded_history_filename); #endif FPRINTF((stderr, "expanded_history_filename = %s\n", expanded_history_filename)); read_history(expanded_history_filename); { /* BEGIN: Go local to get environment variable */ const char *temp_env = getenv ("GNUPLOT_HISTORY_SIZE"); if (temp_env) gnuplot_history_size = strtol (temp_env, (char **) NULL, 10); } /* END: Go local to get environment variable */ /* * It is safe to ignore the return values of 'atexit()' and * 'on_exit()'. In the worst case, there is no history of your * currrent session and you have to type all again in your next * session. * This is the default behaviour (traditional reasons), too. * In case you don't have one of these functions, or you don't * want to use them, 'write_history()' is called directly. */ GP_ATEXIT(wrapper_for_write_history); #endif /* GNUPLOT_HISTORY */ fprintf(stderr, "\nTerminal type set to '%s'\n", term->name); } /* if (interactive && term != 0) */ } else { /* come back here from int_error() */ if (interactive == FALSE) exit_status = EXIT_FAILURE; #ifdef HAVE_READLINE_RESET else { /* reset properly readline after a SIGINT+longjmp */ rl_reset_after_signal (); } #endif load_file_error(); /* if we were in load_file(), cleanup */ SET_CURSOR_ARROW; #ifdef VMS /* after catching interrupt */ /* VAX stuffs up stdout on SIGINT while writing to stdout, so reopen stdout. */ if (gpoutfile == stdout) { if ((stdout = freopen("SYS$OUTPUT", "w", stdout)) == NULL) { /* couldn't reopen it so try opening it instead */ if ((stdout = fopen("SYS$OUTPUT", "w")) == NULL) { /* don't use int_error here - causes infinite loop! */ fputs("Error opening SYS$OUTPUT as stdout\n", stderr); } } gpoutfile = stdout; } #endif /* VMS */ if (!interactive && !noinputfiles) { term_reset(); exit(EXIT_FAILURE); /* exit on non-interactive error */ } } if (argc > 1) { #ifdef _Windows TBOOLEAN noend = persist_cl; #endif /* load filenames given as arguments */ while (--argc > 0) { ++argv; c_token = 0; #ifdef _Windows if (stricmp(*argv, "-noend") == 0 || stricmp(*argv, "/noend") == 0 || stricmp(*argv, "-persist") == 0) noend = TRUE; else #endif if (!strncmp(*argv, "-persist", 2) || !strcmp(*argv, "--persist")) { FPRINTF((stderr,"'persist' command line option recognized\n")); } else if (strcmp(*argv, "-") == 0) { interactive = TRUE; while (!com_line()); interactive = FALSE; } else if (strcmp(*argv, "-e") == 0) { --argc; ++argv; if (argc <= 0) { fprintf(stderr, "syntax: gnuplot -e \"commands\"\n"); return 0; } do_string(*argv); } else { load_file(loadpath_fopen(*argv, "r"), gp_strdup(*argv), FALSE); } } #ifdef _Windows if (noend) { interactive = TRUE; while (!com_line()); } #endif } else { /* take commands from stdin */ while (!com_line()); } #if (defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDITLINE)) && defined(GNUPLOT_HISTORY) #if !defined(HAVE_ATEXIT) && !defined(HAVE_ON_EXIT) /* You should be here if you neither have 'atexit()' nor 'on_exit()' */ wrapper_for_write_history(); #endif /* !HAVE_ATEXIT && !HAVE_ON_EXIT */ #endif /* (HAVE_LIBREADLINE || HAVE_LIBEDITLINE) && GNUPLOT_HISTORY */ #ifdef OS2 RexxDeregisterSubcom("GNUPLOT", NULL); #endif /* HBB 20040223: Not all compilers like exit() to end main() */ /* exit(exit_status); */ return exit_status; }
int main( int argc, char ** argv ) { int c; int rc; char * cp; int no_warnings = 1; int resolve = 1; int result; bool buffer_messages = false; Express model; EXPRESSprogram_name = argv[0]; ERRORusage_function = 0; EXPRESSinit_init(); EXPRESSinitialize(); if( EXPRESSinit_args ) { ( *EXPRESSinit_args )( argc, argv ); } sc_optind = 1; while( ( c = sc_getopt( argc, argv, EXPRESSgetopt_options ) ) != -1 ) { switch( c ) { case 'd': ERRORdebugging = 1; switch( atoi( sc_optarg ) ) { case 0: fprintf( stderr, "\ndebug codes:\n" ); fprintf( stderr, " 0 - this help\n" ); fprintf( stderr, " 1 - basic debugging\n" ); #ifdef debugging fprintf( stderr, " 4 - light malloc debugging\n" ); fprintf( stderr, " 5 - heavy malloc debugging\n" ); fprintf( stderr, " 6 - heavy malloc debugging while resolving\n" ); #endif /* debugging*/ #ifdef YYDEBUG fprintf( stderr, " 8 - set YYDEBUG\n" ); #endif /*YYDEBUG*/ break; case 1: debug = 1; break; #ifdef debugging case 4: malloc_debug( 1 ); break; case 5: malloc_debug( 2 ); break; case 6: malloc_debug_resolve = 1; break; #endif /*debugging*/ #ifdef YYDEBUG case 8: exp_yydebug = 1; break; #endif /* YYDEBUG */ } break; case 'B': buffer_messages = true; break; case 'b': buffer_messages = false; break; case 'e': input_filename = sc_optarg; break; case 'r': resolve = 0; break; case 'i': case 'w': no_warnings = 0; ERRORset_warning( sc_optarg, c == 'w' ); break; case 'p': for( cp = sc_optarg; *cp; cp++ ) { if( *cp == '#' ) { print_objects_while_running |= OBJ_PASS_BITS; } else if( *cp == 'E' ) { print_objects_while_running = OBJ_ANYTHING_BITS; } else { print_objects_while_running |= OBJget_bits( *cp ); } } break; case 'v': print_fedex_version(); no_need_to_work = 1; break; default: rc = 1; if( EXPRESSgetopt ) { rc = ( *EXPRESSgetopt )( c, sc_optarg ); } if( rc == 1 ) { if( ERRORusage_function ) { ( *ERRORusage_function )(); } else { EXPRESSusage(1); } } break; } } if( !input_filename ) { input_filename = argv[sc_optind]; if( !input_filename ) { EXPRESScleanup(); if( no_need_to_work ) { return( 0 ); } else { ( *ERRORusage_function )(); } } } if( no_warnings ) { ERRORset_all_warnings( 1 ); } ERRORbuffer_messages( buffer_messages ); if( EXPRESSinit_parse ) { ( *EXPRESSinit_parse )(); } model = EXPRESScreate(); EXPRESSparse( model, ( FILE * )0, input_filename ); if( ERRORoccurred ) { result = EXPRESS_fail( model ); EXPRESScleanup(); EXPRESSdestroy( model ); return result; } #ifdef debugging if( malloc_debug_resolve ) { malloc_verify(); malloc_debug( 2 ); } #endif /*debugging*/ if( resolve ) { EXPRESSresolve( model ); if( ERRORoccurred ) { result = EXPRESS_fail( model ); EXPRESScleanup(); EXPRESSdestroy( model ); return result; } } if( EXPRESSbackend ) { ( *EXPRESSbackend )( model ); } if( ERRORoccurred ) { result = EXPRESS_fail( model ); EXPRESScleanup(); EXPRESSdestroy( model ); return result; } result = EXPRESS_succeed( model ); EXPRESScleanup(); EXPRESSdestroy( model ); return result; }
int main( int argc, char *argv[]) { /* MSC_EXTRA extern int optind; MSC_EXTRA extern int opterr; MSC_EXTRA extern char *optarg;*/ int any_error; int c; FILE *fp; #ifdef __hpux setlocale(LC_CTYPE,""); #endif #ifdef MDEBUG malloc_debug(2) ; /* helps find malloc/free errors on Sun */ #endif /* MDEBUG */ opterr = 1; /* print error message if bad option */ progname = ubasename(argv[0]); cdlname = "-"; c_flag = 0; fortran_flag = 0; netcdf_flag = 0; cmode_modifier = 0; nofill_flag = 0; #if _CRAYMPP && 0 /* initialize CRAY MPP parallel-I/O library */ (void) par_io_init(32, 32); #endif while ((c = getopt(argc, argv, "bcfk:l:no:v:x")) != EOF) switch(c) { case 'c': /* for c output, old version of "-lc" */ c_flag = 1; break; case 'f': /* for fortran output, old version of "-lf" */ fortran_flag = 1; break; case 'b': /* for binary netcdf output, ".nc" extension */ netcdf_flag = 1; break; case 'l': /* specify language, instead of using -c or -f */ { char *lang_name = (char *) emalloc(strlen(optarg)+1); if (! lang_name) { derror ("%s: out of memory", progname); return(1); } (void)strcpy(lang_name, optarg); if (strcmp(lang_name, "c") == 0 || strcmp(lang_name, "C") == 0) { c_flag = 1; } else if (strcmp(lang_name, "f77") == 0 || strcmp(lang_name, "fortran77") == 0 || strcmp(lang_name, "Fortran77") == 0) { fortran_flag = 1; } else { /* Fortran90, Java, C++, Perl, Python, Ruby, ... */ derror("%s: output language %s not implemented", progname, lang_name); return(1); } } break; case 'n': /* old version of -b, uses ".cdf" extension */ netcdf_flag = -1; break; case 'o': /* to explicitly specify output name */ netcdf_flag = 1; netcdf_name = (char *) emalloc(strlen(optarg)+1); if (! netcdf_name) { derror ("%s: out of memory", progname); return(1); } (void)strcpy(netcdf_name,optarg); break; case 'x': /* set nofill mode to speed up creation of large files */ nofill_flag = 1; break; case 'v': /* a deprecated alias for "kind" option */ /*FALLTHRU*/ case 'k': /* for specifying variant of netCDF format to be generated */ { char *kind_name = (char *) emalloc(strlen(optarg)+1); if (! kind_name) { derror ("%s: out of memory", progname); return(1); } (void)strcpy(kind_name, optarg); /* The default kind is kind 1 (classic), with 32-bit offsets */ if (strcmp(kind_name, "1") == 0 || strcmp(kind_name, "classic") == 0) { cmode_modifier |= NC_CLASSIC_MODEL; } /* The 64-bit offset kind (2) should only be used if actually needed */ else if (strcmp(kind_name, "2") == 0 || strcmp(kind_name, "64-bit-offset") == 0 || strcmp(kind_name, "64-bit offset") == 0) { cmode_modifier |= NC_64BIT_OFFSET; } #ifdef USE_NETCDF4 /* NetCDF-4 HDF5 format*/ else if (strcmp(kind_name, "3") == 0 || strcmp(kind_name, "hdf5") == 0 || strcmp(kind_name, "netCDF-4") == 0) { cmode_modifier |= NC_NETCDF4; } /* NetCDF-4 HDF5 format, but using only nc3 data model */ else if (strcmp(kind_name, "4") == 0 || strcmp(kind_name, "hdf5-nc3") == 0 || strcmp(kind_name, "netCDF-4 classic model") == 0) { cmode_modifier |= NC_NETCDF4 | NC_CLASSIC_MODEL; } #endif else { derror("Invalid format, try classic, 64-bit offset, netCDF-4, or netCDF-4 classic model"); return 2; } free(kind_name); } break; case '?': usage(); return(8); } if (fortran_flag && c_flag) { derror("Only one of -c or -f may be specified"); return(8); } argc -= optind; argv += optind; if (argc > 1) { derror ("%s: only one input file argument permitted",progname); return(6); } fp = stdin; if (argc > 0 && strcmp(argv[0], "-") != 0) { if ((fp = fopen(argv[0], "r")) == NULL) { derror ("can't open file %s for reading: ", argv[0]); perror(""); return(7); } cdlname = argv[0]; } ncgin = fp; any_error = ncgparse(); if (any_error || derror_count > 0) return 1; return 0; }
main(int argc, char **argv) { int i = 1, not_emit = 0, mem_debug = 0; char *vid, filename[256], *name, *oz_root, class_sc, *cpath = NULL; #if 0 int shared = 0; #endif Mode = NORMAL; while (i < argc && *argv[i] == '-') { if (!strcmp(argv[i], "-d")) { Debug = 1; } else if (!strcmp(argv[i], "-d2")) { Debug = 2; } else if (!strcmp (argv[i], "-n")) { not_emit = 1; } else if (!strcmp (argv[i], "-g")) { int j, num = atoi(argv[++i]); for (j = 0; j < num; j++) SetTypeParameter (argv[++i]); Generic = 1; } #if 0 else if (!strcmp (argv[i], "-s")) { shared = 1; } #endif else if (!strcmp (argv[i], "-c")) { ClassPath = argv[++i]; } else if (!strcmp (argv[i], "-p0")) { Mode = THIS_CLASS; } else if (!strcmp (argv[i], "-p1")) { Mode = USED_CLASSES; } else if (!strcmp (argv[i], "-p2")) { Mode = INHERITED_CLASSES; } else if (!strcmp (argv[i], "-p3")) { Mode = ALL_CLASSES; } else if (!strcmp (argv[i], "-pg")) { Generic = 1; Mode = GENERIC_PARAMS; } else if (!strcmp (argv[i], "-object")) { Object = 1; } #ifdef NONISHIOKA else if (!strcmp (argv[i], "-md")) { mem_debug = atoi (argv[++i]); } #else #ifdef MALLOC_DEBUG else if (!strcmp (argv[i], "-md")) { mem_debug = atoi (argv[++i]); } #endif #endif i++; } #ifdef NONISHIOKA malloc_debug (mem_debug); #else #ifdef MALLOC_DEBUG malloc_debug (mem_debug); #endif #endif if (!(oz_root = getenv ("OZROOT"))) { fprintf (stderr, "You must set OZROOT\n"); exit (1); } if (!ClassPath) { cpath = "lib/boot-class"; ClassPath = (char *) malloc (strlen (oz_root) + strlen (cpath) + 1); sprintf (ClassPath, "%s/%s", oz_root, cpath); } Pass = 0; Part = NOT_PART; if (Mode != NORMAL) { #if 0 if (shared) { if (Mode == INHERITED_CLASSES) { print_usage (); exit (1); } yyfile = argv[i]; Part = PUBLIC_PART; } else if (Mode == GENERIC_PARAMS) #endif if (Mode == GENERIC_PARAMS) { yyfile = argv[i]; } else if (Mode == USED_CLASSES || Mode == ALL_CLASSES) { if (i + 1 == argc) { print_usage (); exit (1); } if (!strchr (argv[i], '.')) { Part = atoi (argv[i++]); yyfile = argv[i]; } else { yyfile = argv[i++]; LoadSchool (argv[i++]); Part = PRIVATE_PART; } } else yyfile = argv[i]; if (!(yyin = fopen (yyfile, "r"))) { fprintf(stderr, "cannot open file: %s\n", argv[i]); exit(1); } /* octal escaping */ yyin = EucToOctalEscape (yyin, oz_root); yyparse (); if (Part == PRIVATE_PART) { Pass = 1; yylineno = 1; rewind (yyin); yyparse (); } fclose (yyin); return Error; } #if 0 if ((shared && i + 2 >= argc) || (!shared && i + 3 >= argc)) #endif if (i + 3 >= argc) { print_usage (); exit(1); } #if 0 if (shared) { Part = PUBLIC_PART; name = argv[i++]; } else { #endif Part = atoi (argv [i++]); name = argv[i++]; if (Object && strcmp (name, "Object")) { fprintf (stderr, "this class not `Object'\n"); exit (1); } #if 0 } #endif yyfile = argv[i++]; LoadSchool (argv[i]); vid = GetVID (name, Part); if (Debug) PrintSchool (-1, 0); if (!not_emit) switch (Part) { case PUBLIC_PART: sprintf (filename, "%s/%s/public.z", ClassPath, vid); PublicOutputFileZ = file_open (filename); sprintf (filename, "%s/%s/public.h", ClassPath, vid); PublicOutputFileH = file_open (filename); class_sc = GetClassSC (name); if (class_sc == SC_RECORD || class_sc == SC_STATIC) { if (class_sc == SC_STATIC) { sprintf (filename, "%s/%s/private.i", ClassPath, vid); PrivateOutputFileI = file_open (filename); } sprintf (filename, "%s/%s/private.l", ClassPath, vid); PrivateOutputFileL = file_open (filename); #if 0 vid = GetVID (name, 2); #endif sprintf (filename, "%s/%s/private.c", ClassPath, vid); PrivateOutputFileC = file_open (filename); } if (class_sc && class_sc != SC_ABSTRACT) { sprintf (filename, "%s/%s/private.d", ClassPath, vid); PrivateOutputFileD = file_open (filename); } break; case PROTECTED_PART: sprintf (filename, "%s/%s/protected.z", ClassPath, vid); ProtectedOutputFileZ = file_open (filename); sprintf (filename, "%s/%s/protected.h", ClassPath, vid); ProtectedOutputFileH = file_open (filename); break; case PRIVATE_PART: sprintf (filename, "%s/%s/private.l", ClassPath, vid); PrivateOutputFileL = file_open (filename); sprintf (filename, "%s/%s/private.i", ClassPath, vid); PrivateOutputFileI = file_open (filename); sprintf (filename, "%s/%s/private.d", ClassPath, vid); PrivateOutputFileD = file_open (filename); sprintf (filename, "%s/%s/private.h", ClassPath, vid); PrivateOutputFileH = file_open (filename); sprintf (filename, "%s/%s/private.c", ClassPath, vid); PrivateOutputFileC = file_open (filename); break; } CreateObjectClass (); LoadClass (yyfile, name, oz_root); if (!not_emit) switch (Part) { case PUBLIC_PART: if (!Error) { EmitClassFileZ (ThisClass, Part); EmitHeader (ThisClass); if (ThisClass->cl == TC_StaticObject) { EmitClassFileI (ThisClass); fclose (PrivateOutputFileI); } } if (ThisClass->cl == TC_Record || ThisClass->cl == TC_StaticObject) { fclose (PrivateOutputFileL); fclose (PrivateOutputFileC); } if (ThisClass->cl != TC_Object) fclose (PrivateOutputFileD); fclose (PublicOutputFileZ); fclose (PublicOutputFileH); break; case PROTECTED_PART: if (!Error) { EmitClassFileZ (ThisClass, Part); EmitHeader (ThisClass); } fclose (ProtectedOutputFileZ); fclose (ProtectedOutputFileH); break; case PRIVATE_PART: if (!Error) { EmitClassFileI (ThisClass); EmitHeader (ThisClass); } fclose (PrivateOutputFileL); fclose (PrivateOutputFileI); fclose (PrivateOutputFileD); fclose (PrivateOutputFileH); fclose (PrivateOutputFileC); break; } return Error; }
int main( int argc, char ** argv ) { int c; int rc; char * cp; int no_warnings = 1; int resolve = 1; bool buffer_messages = false; char * filename = 0; Express model; EXPRESSprogram_name = argv[0]; ERRORusage_function = usage; #ifdef YYDEBUG yydebug = 0; #endif EXPRESSinit_init(); EXPRESSinitialize(); if( EXPRESSinit_args ) { ( *EXPRESSinit_args )( argc, argv ); } optind = 1; while( ( c = getopt( argc, argv, EXPRESSgetopt_options ) ) != -1 ) switch( c ) { case 'd': ERRORdebugging = 1; switch( atoi( optarg ) ) { case 0: fprintf( stderr, "\ndebug codes:\n" ); fprintf( stderr, " 0 - this help\n" ); fprintf( stderr, " 1 - basic debugging\n" ); #ifdef debugging fprintf( stderr, " 4 - light malloc debugging\n" ); fprintf( stderr, " 5 - heavy malloc debugging\n" ); fprintf( stderr, " 6 - heavy malloc debugging while resolving\n" ); #endif /* debugging*/ #ifdef YYDEBUG fprintf( stderr, " 8 - set yydebug\n" ); fprintf( stderr, " 9 - set yydebug selectively, must use -u and/or -l. Also increases verbosity for some errors\n" ); fprintf( stderr, "-u nnn: upper line limit\n" ); fprintf( stderr, "-l nnn: lower line limit\n" ); #endif /*YYDEBUG*/ break; case 1: debug = 1; break; #ifdef debugging case 4: malloc_debug( 1 ); break; case 5: malloc_debug( 2 ); break; case 6: malloc_debug_resolve = 1; break; #endif /*debugging*/ #ifdef YYDEBUG case 8: yydebug = 1; break; case 9: yydbg_verbose = true; //yydebug gets set in expscan.l when in the line range set by -l and -u break; #endif /* YYDEBUG */ } break; #ifdef YYDEBUG case 'u': yydbg_upper_limit = atoi( optarg ); break; case 'l': yydbg_lower_limit = atoi( optarg ); break; #endif /* YYDEBUG */ case 'B': buffer_messages = true; break; case 'b': buffer_messages = false; break; case 'e': filename = optarg; break; case 'n': skip_exp_pause = true; break; case 'r': resolve = 0; break; case 'i': case 'w': no_warnings = 0; ERRORset_warning( optarg, c == 'w' ); break; case 'p': for( cp = optarg; *cp; cp++ ) { if( *cp == '#' ) { print_objects_while_running |= OBJ_PASS_BITS; } else if( *cp == 'E' ) { print_objects_while_running = OBJ_ANYTHING_BITS; } else { print_objects_while_running |= OBJget_bits( *cp ); } } break; case 'v': print_fedex_version(); break; case 'z': /* to allow user to attach debugger and continue */ printf( "pid = %d\n", getpid() ); #ifndef __WIN32__ pause(); #else //windows getchar(); abort(); #endif break; default: rc = 1; if( EXPRESSgetopt ) { rc = ( *EXPRESSgetopt )( c, optarg ); } if( rc == 1 ) { ( *ERRORusage_function )(); } break; } if( !filename ) { filename = argv[optind]; if( !filename ) { if( no_need_to_work ) { return( 0 ); } else { ( *ERRORusage_function )(); } } } if( no_warnings ) { ERRORset_all_warnings( 1 ); } ERRORbuffer_messages( buffer_messages ); if( EXPRESSinit_parse ) { ( *EXPRESSinit_parse )(); } model = EXPRESScreate(); EXPRESSparse( model, ( FILE * )0, filename ); if( ERRORoccurred ) { return( EXPRESS_fail( model ) ); } #ifdef debugging if( malloc_debug_resolve ) { malloc_verify(); malloc_debug( 2 ); } #endif /*debugging*/ if( resolve ) { EXPRESSresolve( model ); if( ERRORoccurred ) { return( EXPRESS_fail( model ) ); } } if( EXPRESSbackend ) { ( *EXPRESSbackend )( model ); } if( ERRORoccurred ) { return( EXPRESS_fail( model ) ); } return( EXPRESS_succeed( model ) ); }
int main(int argc_orig, char **argv) #endif { int i; /* We want the current value of argc to persist across a LONGJMP from int_error(). * Without this the compiler may put it on the stack, which LONGJMP clobbers. * Here we try make it a volatile variable that optimization will not affect. * Why do we not have to do the same for argv? I don't know. * But the test cases that broke with generic argc seem fine with generic argv. */ static volatile int argc; argc = argc_orig; #ifdef LINUXVGA LINUX_setup(); /* setup VGA before dropping privilege DBT 4/5/99 */ drop_privilege(); #endif /* make sure that we really have revoked root access, this might happen if gnuplot is compiled without vga support but is installed suid by mistake */ #ifdef __linux__ if (setuid(getuid()) != 0) { fprintf(stderr,"gnuplot: refusing to run at elevated privilege\n"); exit(EXIT_FAILURE); } #endif /* HBB: Seems this isn't needed any more for DJGPP V2? */ /* HBB: disable all floating point exceptions, just keep running... */ #if defined(DJGPP) && (DJGPP!=2) _control87(MCW_EM, MCW_EM); #endif #if defined(OS2) { int rc; #ifdef OS2_IPC char semInputReadyName[40]; sprintf(semInputReadyName, "\\SEM32\\GP%i_Input_Ready", getpid()); rc = DosCreateEventSem(semInputReadyName, &semInputReady, 0, 0); if (rc != 0) fputs("DosCreateEventSem error\n", stderr); #endif rc = RexxRegisterSubcomExe("GNUPLOT", (PFN) RexxInterface, NULL); } #endif /* malloc large blocks, otherwise problems with fragmented mem */ #ifdef MALLOCDEBUG malloc_debug(7); #endif /* init progpath and get helpfile from executable directory */ #if defined(MSDOS) || defined(OS2) { char *s; #ifdef __EMX__ _execname(progpath, sizeof(progpath)); #else safe_strncpy(progpath, argv[0], sizeof(progpath)); #endif /* convert '/' to '\\' */ for (s = progpath; *s != NUL; s++) if (*s == DIRSEP2) *s = DIRSEP1; /* cut program name */ s = strrchr(progpath, DIRSEP1); if (s != NULL) s++; else s = progpath; *s = NUL; /* init HelpFile */ strcpy(HelpFile, progpath); strcat(HelpFile, "gnuplot.gih"); /* remove trailing "bin/" from progpath */ if ((s != NULL) && (s - progpath >= 4)) { s -= 4; if (strncasecmp(s, "bin", 3) == 0) *s = NUL; } } #endif /* DJGPP */ #if (defined(PIPE_IPC) || defined(_WIN32)) && (defined(HAVE_LIBREADLINE) || (defined(HAVE_LIBEDITLINE) && defined(X11))) /* Editline needs this to be set before the very first call to readline(). */ /* Support for rl_getc_function is broken for utf-8 in editline. Since it is only really required for X11, disable this section when building without X11. */ rl_getc_function = getc_wrapper; #endif #if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDITLINE) /* T.Walter 1999-06-24: 'rl_readline_name' must be this fix name. * It is used to parse a 'gnuplot' specific section in '~/.inputrc' * or gnuplot specific commands in '.editrc' (when using editline * instead of readline) */ rl_readline_name = "Gnuplot"; rl_terminal_name = getenv("TERM"); #if defined(HAVE_LIBREADLINE) using_history(); #else history_init(); #endif #endif #if defined(HAVE_LIBREADLINE) && !defined(MISSING_RL_TILDE_EXPANSION) rl_complete_with_tilde_expansion = 1; #endif for (i = 1; i < argc; i++) { if (!argv[i]) continue; if (!strcmp(argv[i], "-V") || !strcmp(argv[i], "--version")) { printf("gnuplot %s patchlevel %s\n", gnuplot_version, gnuplot_patchlevel); return 0; } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) { printf( "Usage: gnuplot [OPTION] ... [FILE]\n" #ifdef X11 "for X11 options see 'help X11->command-line-options'\n" #endif " -V, --version\n" " -h, --help\n" " -p --persist\n" " -s --slow\n" " -d --default-settings\n" " -c scriptfile ARG1 ARG2 ... \n" " -e \"command1; command2; ...\"\n" "gnuplot %s patchlevel %s\n", gnuplot_version, gnuplot_patchlevel); #ifdef DEVELOPMENT_VERSION printf( #ifdef DIST_CONTACT "Report bugs to "DIST_CONTACT"\n" " or %s\n", #else "Report bugs to %s\n", #endif bug_email); #endif return 0; } else if (!strncmp(argv[i], "-persist", 2) || !strcmp(argv[i], "--persist") #ifdef _WIN32 || !stricmp(argv[i], "-noend") || !stricmp(argv[i], "/noend") #endif ) { persist_cl = TRUE; } else if (!strncmp(argv[i], "-slow", 2) || !strcmp(argv[i], "--slow")) { slow_font_startup = TRUE; } else if (!strncmp(argv[i], "-d", 2) || !strcmp(argv[i], "--default-settings")) { /* Skip local customization read from ~/.gnuplot */ skip_gnuplotrc = TRUE; } } #ifdef X11 /* the X11 terminal removes tokens that it recognizes from argv. */ { int n = X11_args(argc, argv); argv += n; argc -= n; } #endif setbuf(stderr, (char *) NULL); #ifdef HAVE_SETVBUF /* This was once setlinebuf(). Docs say this is * identical to setvbuf(,NULL,_IOLBF,0), but MS C * faults this (size out of range), so we try with * size of 1024 instead. [SAS/C does that, too. -lh] */ if (setvbuf(stdout, (char *) NULL, _IOLBF, (size_t) 1024) != 0) (void) fputs("Could not linebuffer stdout\n", stderr); /* Switching to unbuffered mode causes all characters in the input * buffer to be lost. So the only safe time to do it is on program entry. * Do any non-X platforms suffer from this problem? * EAM - Jan 2013 YES. */ setvbuf(stdin, (char *) NULL, _IONBF, 0); #endif gpoutfile = stdout; /* Initialize pre-loaded user variables */ /* "pi" is hard-wired as the first variable */ (void) add_udv_by_name("GNUTERM"); (void) add_udv_by_name("NaN"); init_constants(); udv_user_head = &(udv_NaN->next_udv); init_memory(); interactive = FALSE; /* April 2017: We used to call init_terminal() here, but now */ /* We defer initialization until error handling has been set up. */ # if defined(_WIN32) && !defined(WGP_CONSOLE) interactive = TRUE; # else interactive = isatty(fileno(stdin)); # endif /* Note: we want to know whether this is an interactive session so that we can * decide whether or not to write status information to stderr. The old test * for this was to see if (argc > 1) but the addition of optional command line * switches broke this. What we really wanted to know was whether any of the * command line arguments are file names or an explicit in-line "-e command". */ for (i = 1; i < argc; i++) { # ifdef _WIN32 if (!stricmp(argv[i], "/noend")) continue; # endif if ((argv[i][0] != '-') || (argv[i][1] == 'e') || (argv[i][1] == 'c') ) { interactive = FALSE; break; } } /* Need this before show_version is called for the first time */ if (interactive) show_version(stderr); else show_version(NULL); /* Only load GPVAL_COMPILE_OPTIONS */ update_gpval_variables(3); /* update GPVAL_ variables available to user */ #ifdef VMS /* initialise screen management routines for command recall */ { unsigned int ierror; if (ierror = smg$create_virtual_keyboard(&vms_vkid) != SS$_NORMAL) done(ierror); if (ierror = smg$create_key_table(&vms_ktid) != SS$_NORMAL) done(ierror); } #endif /* VMS */ if (!SETJMP(command_line_env, 1)) { /* first time */ interrupt_setup(); get_user_env(); init_loadpath(); init_locale(); memset(&sm_palette, 0, sizeof(sm_palette)); init_fit(); /* Initialization of fitting module */ #ifdef READLINE /* When using the built-in readline, we set the initial encoding according to the locale as this is required to properly handle keyboard input. */ init_encoding(); #endif init_gadgets(); /* April 2017: Now that error handling is in place, it is safe parse * GNUTERM during terminal initialization. * atexit processing is done in reverse order. We want * the generic terminal shutdown in term_reset to be executed before * any terminal specific cleanup requested by individual terminals. */ init_terminal(); push_terminal(0); /* remember the initial terminal */ gp_atexit(term_reset); /* Execute commands in ~/.gnuplot */ init_session(); if (interactive && term != 0) { /* not unknown */ #ifdef GNUPLOT_HISTORY #if (defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDITLINE)) && !defined(_WIN32) expanded_history_filename = tilde_expand(GNUPLOT_HISTORY_FILE); #else expanded_history_filename = gp_strdup(GNUPLOT_HISTORY_FILE); gp_expand_tilde(&expanded_history_filename); #endif read_history(expanded_history_filename); /* * It is safe to ignore the return values of 'atexit()' and * 'on_exit()'. In the worst case, there is no history of your * currrent session and you have to type all again in your next * session. */ gp_atexit(wrapper_for_write_history); #endif /* GNUPLOT_HISTORY */ #if defined(READLINE) && defined(WGP_CONSOLE) fprintf(stderr, "Encoding set to '%s'.\n", encoding_names[encoding]); #endif } /* if (interactive && term != 0) */ } else { /* come back here from int_error() */ if (!successful_initialization) { /* Only print the warning once */ successful_initialization = TRUE; fprintf(stderr,"WARNING: Error during initialization\n\n"); } if (interactive == FALSE) exit_status = EXIT_FAILURE; #ifdef HAVE_READLINE_RESET else { /* reset properly readline after a SIGINT+longjmp */ rl_reset_after_signal (); } #endif load_file_error(); /* if we were in load_file(), cleanup */ SET_CURSOR_ARROW; #ifdef VMS /* after catching interrupt */ /* VAX stuffs up stdout on SIGINT while writing to stdout, so reopen stdout. */ if (gpoutfile == stdout) { if ((stdout = freopen("SYS$OUTPUT", "w", stdout)) == NULL) { /* couldn't reopen it so try opening it instead */ if ((stdout = fopen("SYS$OUTPUT", "w")) == NULL) { /* don't use int_error here - causes infinite loop! */ fputs("Error opening SYS$OUTPUT as stdout\n", stderr); } } gpoutfile = stdout; } #endif /* VMS */ /* Why a goto? Because we exited the loop below via int_error */ /* using LONGJMP. The compiler was not expecting this, and */ /* "optimized" the handling of argc and argv such that simply */ /* entering the loop again from the top finds them messed up. */ /* If we reenter the loop via a goto then there is some hope */ /* that code reordering does not hurt us. */ if (reading_from_dash && interactive) goto RECOVER_FROM_ERROR_IN_DASH; reading_from_dash = FALSE; if (!interactive && !noinputfiles) { term_reset(); gp_exit(EXIT_FAILURE); /* exit on non-interactive error */ } } /* load filenames given as arguments */ while (--argc > 0) { ++argv; c_token = 0; if (!strncmp(*argv, "-persist", 2) || !strcmp(*argv, "--persist") #ifdef _WIN32 || !stricmp(*argv, "-noend") || !stricmp(*argv, "/noend") #endif ) { FPRINTF((stderr,"'persist' command line option recognized\n")); } else if (strcmp(*argv, "-") == 0) { #if defined(_WIN32) && !defined(WGP_CONSOLE) TextShow(&textwin); interactive = TRUE; #else interactive = isatty(fileno(stdin)); #endif RECOVER_FROM_ERROR_IN_DASH: reading_from_dash = TRUE; while (!com_line()); reading_from_dash = FALSE; interactive = FALSE; noinputfiles = FALSE; } else if (strcmp(*argv, "-e") == 0) { int save_state = interactive; --argc; ++argv; if (argc <= 0) { fprintf(stderr, "syntax: gnuplot -e \"commands\"\n"); return 0; } interactive = FALSE; noinputfiles = FALSE; do_string(*argv); interactive = save_state; } else if (!strncmp(*argv, "-slow", 2) || !strcmp(*argv, "--slow")) { slow_font_startup = TRUE; } else if (!strncmp(*argv, "-d", 2) || !strcmp(*argv, "--default-settings")) { /* Ignore this; it already had its effect */ FPRINTF((stderr, "ignoring -d\n")); } else if (strcmp(*argv, "-c") == 0) { /* Pass command line arguments to the gnuplot script in the next * argument. This consumes the remainder of the command line */ interactive = FALSE; noinputfiles = FALSE; --argc; ++argv; if (argc <= 0) { fprintf(stderr, "syntax: gnuplot -c scriptname args\n"); gp_exit(EXIT_FAILURE); } call_argc = GPMIN(9, argc - 1); for (i=0; i<=call_argc; i++) { /* Need to stash argv[i] somewhere visible to load_file() */ call_args[i] = gp_strdup(argv[i+1]); } load_file(loadpath_fopen(*argv, "r"), gp_strdup(*argv), 5); gp_exit(EXIT_SUCCESS); } else if (*argv[0] == '-') { fprintf(stderr, "unrecognized option %s\n", *argv); } else { interactive = FALSE; noinputfiles = FALSE; load_file(loadpath_fopen(*argv, "r"), gp_strdup(*argv), 4); } } /* take commands from stdin */ if (noinputfiles) { while (!com_line()) ctrlc_flag = FALSE; /* reset asynchronous Ctrl-C flag */ } #ifdef _WIN32 /* On Windows, handle 'persist' by keeping the main input loop running (windows/wxt), */ /* but only if there are any windows open. Note that qt handles this properly. */ if (persist_cl) { if (WinAnyWindowOpen()) { #ifdef WGP_CONSOLE if (!interactive) { /* no further input from pipe */ while (WinAnyWindowOpen()) win_sleep(100); } else #endif { interactive = TRUE; while (!com_line()) ctrlc_flag = FALSE; /* reset asynchronous Ctrl-C flag */ interactive = FALSE; } } } #endif #if (defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDITLINE)) && defined(GNUPLOT_HISTORY) #if !defined(HAVE_ATEXIT) && !defined(HAVE_ON_EXIT) /* You should be here if you neither have 'atexit()' nor 'on_exit()' */ wrapper_for_write_history(); #endif /* !HAVE_ATEXIT && !HAVE_ON_EXIT */ #endif /* (HAVE_LIBREADLINE || HAVE_LIBEDITLINE) && GNUPLOT_HISTORY */ #ifdef OS2 RexxDeregisterSubcom("GNUPLOT", NULL); #endif /* HBB 20040223: Not all compilers like exit() to end main() */ /* exit(exit_status); */ #if ! defined(_WIN32) /* Windows does the cleanup later */ gp_exit_cleanup(); #endif return exit_status; }
int main(int argc, char *argv[]) { extern int optind; extern int opterr; extern char *optarg; int c; int ret; FILE *fp; MPI_Init(&argc, &argv); #ifdef __hpux setlocale(LC_CTYPE,""); #endif #ifdef MDEBUG malloc_debug(2) ; /* helps find malloc/free errors on Sun */ #endif /* MDEBUG */ opterr = 1; /* print error message if bad option */ progname = ubasename(argv[0]); cdlname = "-"; c_flag = 0; fortran_flag = 0; netcdf_flag = 0; giantfile_flag = 0; giantvar_flag = 0; nofill_flag = 0; #if 0 #if _CRAYMPP && 0 /* initialize CRAY MPP parallel-I/O library */ (void) par_io_init(32, 32); #endif #endif while ((c = getopt(argc, argv, "bcfl:no:v:x")) != EOF) switch(c) { case 'c': /* for c output. old version of '-lc' */ c_flag = 1; break; case 'f': /* for fortran output. old version of '-lf' */ fortran_flag = 1; break; case 'b': /* for binary netcdf output, ".nc" extension */ netcdf_flag = 1; break; case 'l': /* specify language, instead of -c or -f */ { char *lang_name = (char *) emalloc(strlen(optarg)+1); if (! lang_name) { derror ("%s: out of memory", progname); return(1); } (void)strcpy(lang_name, optarg); if (strcmp(lang_name, "c") == 0 || strcmp(lang_name, "C") == 0) { c_flag = 1; } else if (strcmp(lang_name, "f77") == 0 || strcmp(lang_name, "fortran77") == 0 || strcmp(lang_name, "Fortran77") == 0) { fortran_flag = 1; } else { /* Fortran90, Java, C++, Perl, Python, Ruby, ... */ derror("%s: output language %s not implemented", progname, lang_name); return(1); } } break; case 'n': /* old version of -b, uses ".cdf" extension */ netcdf_flag = -1; break; case 'o': /* to explicitly specify output name */ netcdf_flag = 1; netcdf_name = (char *) emalloc(strlen(optarg)+1); if (! netcdf_name) { derror ("%s: out of memory", progname); return(1); } (void)strcpy(netcdf_name,optarg); break; case 'x': /* set nofill mode to speed up creation fo large files */ nofill_flag = 1; break; case 'v': /* for creating 64-bit offet files, specify version 2 */ { char *version_name = (char *)emalloc(strlen(optarg)+1); if (! version_name) { derror ("%s: out of memory", progname); return (1); } (void)strcpy(version_name, optarg); /* the default version is version 1, with 32-bit offsets */ if (strcmp(version_name, "1") == 0 || strcmp(version_name, "classic") == 0) { giantfile_flag = 0; } /* the 64-bit offset version (2) should only be used if * actually needed */ else if (strcmp(version_name, "2") == 0 || strcmp(version_name, "64-bit-offset") == 0) { giantfile_flag = 1; } else if (strcmp(version_name, "5") == 0 || strcmp(version_name, "64-bit-variables") == 0) { giantvar_flag = 1; } } break; case '?': usage(); return(8); } if (fortran_flag && c_flag) { derror("Only one of -c or -f may be specified"); return(8); } if (fortran_flag) { derror("Generating Fortran interface currently not supported yet"); return(0); } argc -= optind; argv += optind; if (argc > 1) { derror ("%s: only one input file argument permitted",progname); return(6); } fp = stdin; if (argc > 0 && strcmp(argv[0], "-") != 0) { if ((fp = fopen(argv[0], "r")) == NULL) { derror ("can't open file %s for reading: ", argv[0]); perror(""); return(7); } cdlname = argv[0]; } ncmpiin = fp; ret = ncmpiparse(); MPI_Finalize(); return ret; }