/* xmd - molecular dynamics for metals and ceramics By Jonathan Rifkin Copyright 1995-2004 Jonathan Rifkin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* ************************************************************************ Include Files ************************************************************************ */ #include #include #include #include "cdhouse.h" #include "iomngr.h" #include "strsub.h" #include "cdsubs.h" #include "plotc.h" /* ************************************************************************ Compile Switches ************************************************************************ */ #define USE_COMMAND_PARSER_FUNCTION #undef USE_COMMAND_PARSER_FUNCTION /* ************************************************************************ Global Variables ************************************************************************ */ extern Particle_t *a; extern Simulation_t *s; extern FILE *out; extern LIST *inlist; /* ************************************************************************ Module-wide Variables ************************************************************************ */ static int NumberOfCommandErrors_m = 0; static int NumberOfWarnings_m = 0; /* Local Command Buffer */ #ifdef USE_COMMAND_PARSER_FUNCTION static char CharBuffer_m[2048]; #endif /* ************************************************************************ Exported Functions ************************************************************************ */ void read_command (char *instr, int *qflag) { char *lpnt, *cpnt, *cmdstr, *tailstr; char copystr[256]; strcpy (copystr, instr); ReplaceMacro (copystr, 256); /* PARSE STRING INTO COMMAND LINES */ lpnt = copystr; while (*(cpnt=strlin(&lpnt))) { /* Skip comments (preceded by * or #) */ if (IsComment (cpnt, "*#") ) continue; tailstr = cpnt; /* PARSE COMMAND */ cmdstr = strhed (&tailstr); /* Match Command */ if ( cmdstr[0] == '\'' ) fprintf (out, "%s\n", instr); else if (!strcmpi(cmdstr,"" )); else if (!strcmpi(cmdstr,"QUIT" )) *qflag = TRUE; else if (!strcmpi(cmdstr,"ALLOCATE" )) read_allocate (tailstr); else if (!strcmpi(cmdstr,"BOX" )) read_box (tailstr); else if (!strcmpi(cmdstr,"BSAVE" )) read_bsave (tailstr); else if (!strcmpi(cmdstr,"CALC" )) read_calc (tailstr); else if (!strcmpi(cmdstr,"CLAMP" )) read_clamp (tailstr); else if (!strcmpi(cmdstr,"COMPARE" )) read_compare (tailstr); else if (!strcmpi(cmdstr,"CONSTRAIN")) read_constrain(tailstr); else if (!strcmpi(cmdstr,"COR" )) read_cor (tailstr); else if (!strcmpi(cmdstr,"CMD" )) read_cmd (tailstr); else if (!strcmpi(cmdstr,"DAMP" )) read_damp (tailstr); else if (!strcmpi(cmdstr,"DEBUG" )) read_debug (tailstr); else if (!strcmpi(cmdstr,"DISP" )) read_disp (tailstr); else if (!strcmpi(cmdstr,"DTIME" )) read_dtime (tailstr); else if (!strcmpi(cmdstr,"DUP" )) read_dup (tailstr); else if (!strcmpi(cmdstr,"ECHO" )) read_echo (tailstr); else if (!strcmpi(cmdstr,"ERASE" )) read_erase (tailstr); else if (!strcmpi(cmdstr,"ESAVE" )) read_esave (tailstr); else if (!strcmpi(cmdstr,"EUNIT" )) read_eunit (tailstr); else if (!strcmpi(cmdstr,"EXTFORCE" )) read_extforce (tailstr); else if (!strcmpi(cmdstr,"EXTSPRING")) read_extspring(tailstr); else if (!strcmpi(cmdstr,"FIX" )) read_fix (tailstr); else if (!strcmpi(cmdstr,"FILL" )) read_fill (tailstr); else if (!strcmpi(cmdstr,"ITEMP" )) read_itemp (tailstr); else if (!strcmpi(cmdstr,"LABEL" )) read_label (tailstr); else if (!strcmpi(cmdstr,"MACRO" )) read_macro (tailstr); else if (!strcmpi(cmdstr,"MACROF" )) read_macrof (tailstr); else if (!strcmpi(cmdstr,"MASS" )) read_mass (tailstr); else if (!strcmpi(cmdstr,"MC" )) read_mc (tailstr); else if (!strcmpi(cmdstr,"MOVE" )) read_move (tailstr); else if (!strcmpi(cmdstr,"NRANGE" )) read_nrange (tailstr); else if (!strcmpi(cmdstr,"NSEARCH" )) read_nsearch (tailstr); else if (!strcmpi(cmdstr,"PARTICLE" )) read_particle (tailstr); else if (!strcmpi(cmdstr,"PLOT" )) read_plot (tailstr); else if (!strcmpi(cmdstr,"POSITION" )) read_particle (tailstr); else if (!strcmpi(cmdstr,"POSVEL" )) read_posvel (tailstr); else if (!strcmpi(cmdstr,"POTENTIAL")) read_potential(tailstr); else if (!strcmpi(cmdstr,"PRESSURE" )) read_pressure (tailstr); else if (!strcmpi(cmdstr,"PSTRAIN" )) read_pstrain (tailstr); else if (!strcmpi(cmdstr,"QUENCH" )) read_quench (tailstr); else if (!strcmpi(cmdstr,"RCV" )) read_rcv (tailstr); else if (!strcmpi(cmdstr,"READ" )) read_read (tailstr); else if (!strcmpi(cmdstr,"REFSTEP" )) read_refstep (tailstr); else if (!strcmpi(cmdstr,"REMOVE" )) read_remove (tailstr); else if (!strcmpi(cmdstr,"REPEAT" )) read_repeat (tailstr); else if (!strcmpi(cmdstr,"ROTATE" )) read_rotate (tailstr); else if (!strcmpi(cmdstr,"RUN" )) read_run (tailstr); else if (!strcmpi(cmdstr,"SCALE" )) read_scale (tailstr); else if (!strcmpi(cmdstr,"SCREW" )) read_screw (tailstr); else if (!strcmpi(cmdstr,"SEED" )) read_seed (tailstr); else if (!strcmpi(cmdstr,"SELECT" )) read_select (tailstr); else if (!strcmpi(cmdstr,"SET" )) read_set (tailstr); else if (!strcmpi(cmdstr,"SIZE" )) read_size (tailstr); else if (!strcmpi(cmdstr,"SSAVE" )) read_ssave (tailstr); else if (!strcmpi(cmdstr,"STATE" )) read_state (tailstr); else if (!strcmpi(cmdstr,"STEP" )) read_step (tailstr); else if (!strcmpi(cmdstr,"STRESS" )) read_stress (tailstr); else if (!strcmpi(cmdstr,"SURFACE" )) read_surface (tailstr); else if (!strcmpi(cmdstr,"TAG" )) read_tag (tailstr); else if (!strcmpi(cmdstr,"TYPE" )) read_type (tailstr); else if (!strcmpi(cmdstr,"TYPELIST" )) read_typelist (tailstr); else if (!strcmpi(cmdstr,"TYPENAME" )) read_typename (tailstr); else if (!strcmpi(cmdstr,"VELOCITY" )) read_velocity (tailstr); else if (!strcmpi(cmdstr,"VERBOSE" )) read_verbose (tailstr); /* Maintain compatability with old name for PRESSURE command */ else if (!strcmpi(cmdstr,"VOLUME" )) read_pressure (tailstr); else if (!strcmpi(cmdstr,"WAVE" )) read_wave (tailstr); else if (!strcmpi(cmdstr,"WRITE" )) read_write (tailstr); else { puts ("*** ERROR: PREVIOUS COMMAND NOT RECOGNIZED."); NumberOfCommandErrors_m++; } } } int GetNumberOfCommandErrors (void) { return NumberOfCommandErrors_m; } int GetNumberOfWarnings (void) { return NumberOfWarnings_m; } void IncrementNumberOfWarnings (void) { NumberOfWarnings_m++; } #ifdef USE_COMMAND_PARSER_FUNCTION void x (char *format, ...) { va_list argptr; int qflag = 0; char *cp = (char *) CharBuffer_m; /* CONVERT ARGUMENTS TO STRING */ va_start (argptr, format); vsprintf (CharBuffer_m, format, argptr); va_end (argptr); /* CALL COMMAND PROCESSOR */ read_command (cp, &qflag); } #endif