TPCCLIB
Loading...
Searching...
No Matches
parrenp.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <math.h>
14/*****************************************************************************/
15#include "tpcextensions.h"
16#include "tpcpar.h"
17/*****************************************************************************/
18
19/*****************************************************************************/
20static char *info[] = {
21 "Rename the specified parameter inside a parameter file.",
22 " ",
23 "Usage: @P [options] file [oldname newname]",
24 " ",
25 "Enter either the number or name of the parameter to be renamed, and",
26 "the new parameter name. Only the first matching parameter name is renamed.",
27 "If neither is given, then program lists current parameter names.",
28 "Note that not all parameter file formats can store parameter names.",
29 " ",
30 "Options:",
31 " -dry",
32 " Nothing is actually renamed, application only lists what it would do.",
33 " -stdoptions", // List standard options like --help, -v, etc
34 " ",
35 "See also: paradd, parcoll, iftedit, parformat, tacren",
36 " ",
37 "Keywords: parameter, tool, rename, simulation",
38 0};
39/*****************************************************************************/
40
41/*****************************************************************************/
42/* Turn on the globbing of the command line, since it is disabled by default in
43 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
44 In Unix&Linux wildcard command line processing is enabled by default. */
45/*
46#undef _CRT_glob
47#define _CRT_glob -1
48*/
49int _dowildcard = -1;
50/*****************************************************************************/
51
52/*****************************************************************************/
56int main(int argc, char **argv)
57{
58 int ai, help=0, version=0, verbose=1;
59 int dryMode=0;
60 char parfile[FILENAME_MAX], oldname[MAX_PARNAME_LEN], newname[MAX_PARNAME_LEN];
61
62
63 /*
64 * Get arguments
65 */
66 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
67 parfile[0]=oldname[0]=newname[0]=(char)0;
68 /* Options */
69 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
70 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
71 char *cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
72 if(strcasecmp(cptr, "DRY")==0) {
73 dryMode=1; continue;
74 }
75 fprintf(stderr, "Error: invalid option '%s'\n", argv[ai]);
76 return(1);
77 } else break; // tac name argument may start with '-'
78
79 TPCSTATUS status; statusInit(&status);
80 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
81 status.verbose=verbose-5;
82
83 /* Print help or version? */
84 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
85 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
86 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
87
88 /* Process other arguments, starting from the first non-option */
89 if(ai<argc) strlcpy(parfile, argv[ai++], FILENAME_MAX);
90 if(ai<argc) strlcpy(oldname, argv[ai++], MAX_PARNAME_LEN);
91 if(ai<argc) strlcpy(newname, argv[ai++], MAX_PARNAME_LEN);
92 if(ai<argc) {fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]); return(1);}
93
94 /* In verbose mode print arguments and options */
95 if(verbose>1) {
96 printf("parfile := %s\n", parfile);
97 printf("dryMode := %d\n", dryMode);
98 if(oldname[0]) printf("oldname := %s\n", oldname);
99 if(newname[0]) printf("newname := %s\n", newname);
100 fflush(stdout);
101 }
102
103 /* Is something missing? */
104 if(!parfile[0]) {tpcPrintUsage(argv[0], info, stderr); return(1);}
105 if(oldname[0] && !newname[0]) {
106 fprintf(stderr, "Error: new parameter name missed.\n");
107 return(1);
108 }
109
110
111 /*
112 * Read the file
113 */
114 if(verbose>1) printf("reading %s\n", parfile);
115 PAR par; parInit(&par);
116 if(parRead(&par, parfile, &status)!=TPCERROR_OK) {
117 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
118 parFree(&par); return(2);
119 }
120 if(verbose>2) {
121 printf("fileformat := %s\n", parFormattxt(par.format));
122 printf("parNr := %d\n", par.parNr);
123 printf("tacNr := %d\n", par.tacNr);
124 }
125
126 /*
127 * List the parameter names and quit, if parameter names were not given
128 */
129 if(!oldname[0]) {
130 fflush(stdout);
131 for(int i=0; i<par.parNr; i++)
132 printf("%s\n", par.n[i].name);
133 fflush(stdout);
134 parFree(&par);
135 return(0);
136 }
137
138
139 /*
140 * Select the parameter to be renamed
141 */
142 int parNr=parSelectParameters(&par, oldname, 1, &status);
143 if(verbose>1) printf("%d parameter(s) match '%s'\n", parNr, oldname);
144 if(parNr==0) {
145 fprintf(stderr, "Error: no parameter matches '%s'.\n", oldname);
146 parFree(&par); return(3);
147 }
148
149
150
151 /*
152 * Rename the first selected parameter
153 */
154 for(int i=0; i<par.parNr; i++) if(par.n[i].sw) {
155 if(verbose>0 || dryMode) {
156 fprintf(stdout, "%s -> %s\n", par.n[i].name, newname);
157 fflush(stdout);
158 }
159 strlcpy(par.n[i].name, newname, MAX_PARNAME_LEN);
160 break; // only rename the first match
161 }
162
163 if(dryMode) {parFree(&par); return(0);}
164
165 /*
166 * Save modified data
167 */
168 if(verbose>1) printf("writing %s\n", parfile);
169 {
170 FILE *fp=fopen(parfile, "w");
171 if(fp==NULL) {
172 fprintf(stderr, "Error: cannot open file for writing.\n");
173 parFree(&par); return(11);
174 }
175 int ret=parWrite(&par, fp, PAR_FORMAT_UNKNOWN, 1, &status);
176 fclose(fp); parFree(&par);
177 if(ret!=TPCERROR_OK) {
178 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
179 return(12);
180 }
181 if(verbose>0) printf("modified file written.\n");
182 }
183
184 return(0);
185}
186/*****************************************************************************/
187
188/*****************************************************************************/
void parFree(PAR *par)
Definition par.c:75
void parInit(PAR *par)
Definition par.c:25
char * parFormattxt(parformat c)
Definition pario.c:59
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
Definition pario.c:148
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
Definition pario.c:232
int parSelectParameters(PAR *d, const char *par_name, int reset, TPCSTATUS *status)
Definition parselect.c:120
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
void statusInit(TPCSTATUS *s)
Definition statusmsg.c:104
char * errorMsg(tpcerror e)
Definition statusmsg.c:68
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition stringext.c:632
Definition tpcpar.h:100
int format
Definition tpcpar.h:102
int parNr
Definition tpcpar.h:108
int tacNr
Definition tpcpar.h:104
PARN * n
Definition tpcpar.h:112
char sw
Definition tpcpar.h:94
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:82
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
#define MAX_PARNAME_LEN
Max string length for PAR name.
@ TPCERROR_OK
No error.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
Definition tpcpar.h:28