TPCCLIB
Loading...
Searching...
No Matches
tacdel.c
Go to the documentation of this file.
1
8/*****************************************************************************/
9#include "tpcclibConfig.h"
10/*****************************************************************************/
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <math.h>
15/*****************************************************************************/
16#include "tpcextensions.h"
17#include "tpcift.h"
18#include "tpctac.h"
19/*****************************************************************************/
20
21/*****************************************************************************/
22static char *info[] = {
23 "Delete specified TAC(s) inside a TAC file.",
24 " ",
25 "Usage: @P [options] file [tacname(s) or tacnumber(s)]",
26 " ",
27 "Options:",
28 " -dry",
29 " Nothing is actually deleted, application only lists which TAC(s) would",
30 " be deleted.",
31 " -stdoptions", // List standard options like --help, -v, etc
32 " ",
33 "Example 1: Delete TACs with name 'striatum' from file a123_12.dat",
34 " @P a123_06.dat striatum",
35 " ",
36 "Example 2: Delete TAC numbers 3 and 4 from file a234.dat",
37 " @P a234.dat 3 4",
38 " ",
39 "See also: taclist, tacadd, tacdelna, tacsort, tacunit, taccut, tacsplit",
40 " ",
41 "Keywords: TAC, tool",
42 0};
43/*****************************************************************************/
44
45/*****************************************************************************/
46/* Turn on the globbing of the command line, since it is disabled by default in
47 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
48 In Unix&Linux wildcard command line processing is enabled by default. */
49/*
50#undef _CRT_glob
51#define _CRT_glob -1
52*/
53int _dowildcard = -1;
54/*****************************************************************************/
55
56/*****************************************************************************/
60int main(int argc, char **argv)
61{
62 int ai, help=0, version=0, verbose=1;
63 int ret, i, n, dryMode=0;
64 char *cptr, tacfile[FILENAME_MAX];
65 TAC tac;
66
67
68 /*
69 * Get arguments
70 */
71 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
72 tacInit(&tac);
73 tacfile[0]=(char)0;
74 /* Options */
75 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
76 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
77 cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
78 if(strcasecmp(cptr, "DRY")==0) {
79 dryMode=1; continue;
80 }
81 fprintf(stderr, "Error: invalid option '%s'\n", argv[ai]);
82 return(1);
83 } else break; // tac name argument may start with '-'
84
85 TPCSTATUS status; statusInit(&status);
86 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
87 status.verbose=verbose-3;
88
89 /* Print help or version? */
90 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
91 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
92 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
93
94 /* The first argument (non-option) is the filename */
95 if(ai<argc) {
96 strlcpy(tacfile, argv[ai], FILENAME_MAX); ai++;
97 } else {
98 fprintf(stderr, "Error: missing filename.\n");
99 return(1);
100 }
101 if(ai>=argc) {
102 fprintf(stderr, "Error: missing TAC name or number.\n");
103 return(1);
104 }
105
106 /* In verbose mode print arguments and options */
107 if(verbose>1) {
108 printf("tacfile := %s\n", tacfile);
109 printf("dryMode := %d\n", dryMode);
110 }
111
112 /* Read the file */
113 if(verbose>1) printf("reading %s\n", tacfile);
114 ret=tacRead(&tac, tacfile, &status);
115 if(ret!=TPCERROR_OK) {
116 fprintf(stderr, "Error (%d): %s\n", ret, errorMsg(status.error));
117 tacFree(&tac); return(2);
118 }
119 if(verbose>2) {
120 printf("fileformat := %s\n", tacFormattxt(tac.format));
121 printf("tacNr := %d\n", tac.tacNr);
122 printf("sampleNr := %d\n", tac.sampleNr);
123 }
124
125 /* Process the rest of the arguments: region names or numbers */
126 for(; ai<argc; ai++) {
127 n=tacSelectTACs(&tac, argv[ai], 0, &status);
128 if(n<=0 && verbose>0)
129 fprintf(stderr, "Warning: no match found for '%s'.\n", argv[ai]);
130 else if(verbose>1)
131 printf("%d tac(s) match name '%s'\n", n, argv[ai]);
132 }
133 n=tacSelectedTACs(&tac);
134 if(n<1) {
135 fprintf(stderr, "Error: specified TACs not found in %s.\n", tacfile);
136 tacFree(&tac); return(3);
137 }
138 if(verbose>1) printf("%d matching tac(s) found\n", n);
139 if(n==tac.tacNr) {
140 fprintf(stderr, "Warning: all TACs were selected for removal; aborted.\n");
141 tacFree(&tac); return(3);
142 }
143
144 /*
145 * Delete the selected TACs
146 */
147 i=tac.tacNr-1; n=0; ret=TPCERROR_OK;
148 while(i>=0) {
149 if(tac.c[i].sw) {
150 if(dryMode) {
151 printf("marked for deletion: %s\n", tac.c[i].name); n++;
152 } else {
153 if(verbose>=0) printf("%s deleted\n", tac.c[i].name);
154 ret=tacDeleteTACC(&tac, i); if(ret!=TPCERROR_OK) break; else n++;
155 }
156 }
157 i--;
158 }
159 if(ret!=TPCERROR_OK) {
160 fprintf(stderr, "Error: cannot delete TAC.\n");
161 tacFree(&tac); return(5);
162 }
163 if(dryMode) {
164 printf("%d TAC(s) were marked to be deleted.\n", n);
165 tacFree(&tac); return(0);
166 }
167
168 /*
169 * Save data
170 */
171 if(verbose>1) printf("writing %s\n", tacfile);
172 FILE *fp; fp=fopen(tacfile, "w");
173 if(fp==NULL) {
174 fprintf(stderr, "Error: cannot open file for writing (%s)\n", tacfile);
175 tacFree(&tac); return(11);
176 }
177 ret=tacWrite(&tac, fp, TAC_FORMAT_UNKNOWN, 1, &status);
178 fclose(fp); tacFree(&tac);
179 if(ret!=TPCERROR_OK) {
180 fprintf(stderr, "Error (%d): %s\n", ret, errorMsg(status.error));
181 return(12);
182 }
183
184 if(verbose>=0) printf("%d TAC(s) are deleted.\n", n);
185 return(0);
186}
187/*****************************************************************************/
188
189/*****************************************************************************/
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
char sw
Definition tpctac.h:77
char name[MAX_TACNAME_LEN+1]
Definition tpctac.h:81
Definition tpctac.h:87
tacformat format
Definition tpctac.h:93
int sampleNr
Definition tpctac.h:89
TACC * c
Definition tpctac.h:117
int tacNr
Definition tpctac.h:91
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
void tacFree(TAC *tac)
Definition tac.c:106
void tacInit(TAC *tac)
Definition tac.c:24
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
Definition tacio.c:413
char * tacFormattxt(tacformat c)
Definition tacio.c:98
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
Definition tacio.c:332
int tacDeleteTACC(TAC *d, int i)
Definition tacorder.c:310
int tacSelectedTACs(TAC *d)
Definition tacselect.c:103
int tacSelectTACs(TAC *d, const char *region_name, int reset, TPCSTATUS *status)
Definition tacselect.c:24
Header file for library libtpcextensions.
@ TPCERROR_OK
No error.
Header file for library libtpcift.
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.
Definition tpctac.h:28