8#include "tpcclibConfig.h"
21static char *info[] = {
22 "Add version number to the file name, if file name does not already include",
23 "version number. Version is given in format 'n.n.n' as the first command-line",
24 "argument either directly or inside a file with keyword 'version'.",
25 "Version is added to the file name in format '_n_n_n' before any extension.",
27 "Usage: @P [Options] version file",
33 " @P 2.13.4 patlak.exe",
36 " patlak --version > patlak.txt",
37 " iftren patlak.txt \"tpcclib version\" \"version\"",
38 " @P patlak.txt patlak.exe",
40 "See also: pdoc2htm, iftadd, iftren",
59int main(
int argc,
char **argv)
61 int ai, help=0, version=0, verbose=1;
63 char exefile[FILENAME_MAX], verfile[FILENAME_MAX], vers[FILENAME_MAX];
70 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
71 exefile[0]=verfile[0]=vers[0]=(char)0;
73 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
76 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
85 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
90 if(ai<argc) {
strlcpy(verfile, argv[ai++], FILENAME_MAX);}
91 if(ai<argc) {
strlcpy(exefile, argv[ai++], FILENAME_MAX);}
92 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
96 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
102 printf(
"exefile := %s\n", exefile);
107 if(verbose>2) printf(
"trying to read %s\n", verfile);
108 FILE *fp=fopen(verfile,
"r");
110 if(verbose>2) printf(
" ... could not open %s\n", verfile);
112 strncpyClean(vers, verfile, FILENAME_MAX); verfile[0]=(char)0;
114 printf(
"version := %s\n", vers);
119 printf(
"version_file := %s\n", verfile);
124 ret=
iftRead(&ift, fp, 1, 1, &status);
130 if(verbose>2) printf(
"list size: %d item(s)\n", ift.
keyNr);
134 fprintf(stderr,
"Error: file contains no key '%s'\n",
"version");
137 if(verbose>3) printf(
"key_index := %d\n", li);
140 printf(
"version := %s\n", vers);
152 if(vers[i]!=
'.' && isalnum(vers[i])==0) ret++;
153 if(isblank(vers[i])!=0) ret++;
157 if(ret>0 || strlen(vers)<1 || strlen(vers)>20) {
158 fprintf(stderr,
"Error: invalid version.\n");
165 printf(
"version := %s\n", vers);
175 char pathname[FILENAME_MAX];
176 strcpy(pathname, exefile);
178 if(verbose>1) printf(
"pathname := '%s'\n", pathname);
180 char extname[FILENAME_MAX];
182 if(cptr!=NULL) strcpy(extname, cptr);
else extname[0]=(char)0;
183 if(verbose>1) printf(
"extname := '%s'\n", extname);
185 char filename[FILENAME_MAX];
186 strcpy(filename, exefile);
189 if(verbose>1) printf(
"filename := '%s'\n", filename);
190 if(strlen(filename)<1) {
191 fprintf(stderr,
"Error: invalid file name.\n");
195 if(strstr(filename, vers)!=NULL) {
196 fprintf(stderr,
"Error: file name already contains version number.\n");
200 strcpy(verfile, pathname);
201 strcat(verfile,
"/");
202 strcat(verfile, filename);
203 if(strlen(verfile)+strlen(vers)+strlen(extname)+2 > FILENAME_MAX) {
204 fprintf(stderr,
"Error: too long file name or version.\n");
207 strcat(verfile,
"_");
208 strcat(verfile, vers);
209 strcat(verfile, extname);
211 printf(
"newfile := %s\n", verfile);
219 if(rename(exefile, verfile)!=0) {
220 fprintf(stderr,
"Error: cannot rename '%s' to '%s'.\n", exefile, verfile);
223 if(verbose>0) printf(
"%s -> %s\n", exefile, verfile);
void filenameRmFile(char *s)
char * filenameGetExtensions(const char *s)
Get all extensions of a file name.
void filenameRmPath(char *s)
void filenameRmExtensions(char *s)
int iftFindKey(IFT *ift, const char *key, int start_index)
int iftRead(IFT *ift, FILE *fp, int is_key_required, int is_comment_accepted, TPCSTATUS *status)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
void strReplaceChar(char *s, char c1, char c2)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int strncpyClean(char *s1, const char *s2, int maxlen)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
Header file for library libtpcift.