\n\
Usage: timeplan [-u|--unsort] [-s|--stores] [-T|--timetot] [-t|--tree]\n\
[-c|--condition <cond>] [-f|--formtotal <fmtstring>]\n\
+ [-r|--rule <ruleL>:<ruleR>]\n\
[-v|--verbose] [-h|--help] [-V|--version]\n\
\n\
-u, --unsort\t\tDon't sort the result in any way\n\
-t, --tree\t\tOrganize data as hierarchy tree\n\
-c, --condition\tDefine condition variable\n\
-f, --formtotal\tFormat \"Total\" column (\"text *val/val:width text\")\n\
+ -r, --rule\t\tAdd to the end of .rc file this rule (':'->'\\t')\n\
-v, --verbose\t\tInform about phases of transfer\n\
-h, --help\t\tPrint a summary of the options\n\
-V, --version\t\tPrint the version number\n\
{"tree" ,0,0,'t'},
{"condition",1,0,'c'},
{"formtotal",1,0,'f'},
+{"rule" ,1,0,'r'},
{"verbose" ,0,0,'v'},
{"help" ,0,0,'h'},
{"version" ,0,0,'V'}};
*tail=&item->next;
}
-static struct textlist *modifies,**modifiestail=&modifies;
+static struct textlist *modifies,**modifiestail=&modifies,*modifiescmdl,**modifiescmdltail=&modifiescmdl;
static int modifies_tot;
static struct modistruct {
regex_t regex;
}
if (fclose(fi))
fprintf(ERRH1"fclose(3) \"%s\""ERRNO1,ERRH2,finame,ERRNO2);
+ *modifiestail=modifiescmdl; /* add all command-line arguments to the end */
if (!(modistructs=malloc(sizeof(*modistructs)*modifies_tot))) {
fprintf(ERRH1"malloc() of %d modistructs's"ERRNO1,ERRH2,modifies_tot,ERRNO2);
exit(EXIT_FAILURE);
exit(EXIT_FAILURE);
}
*s++='\0'; modistructs[m].dst=s;
- if (verbose) fprintf(stderr,"regcomp: %s -> %s\n",item->text,s);
+ if (verbose) printf("regcomp: %s -> %s\n",item->text,s);
if (regcomp(&modistructs[m].regex,item->text,REG_EXTENDED|REG_ICASE)) {
fprintf(ERRH1"regcomp() failed for \"%s\" (%s)"WHERE1,ERRH2,item->text,ERRNO2,WHERE2);
exit(EXIT_FAILURE);
int i,m;
static char modbuf1[sizeof(buf)],modbuf2[sizeof(modbuf1)];
char *src=what,*dstbase=modbuf1,*dst=dstbase;
-const char *start,*end,*patt;
+const char *start FAKEUSE,*end FAKEUSE,*patt;
const struct textlist *item;
if (verbose) printf("modify: %s\n",what);
modify_load();
for (m=0,item=modifies;item;m++,item=item->next) {
+enum { PATT_START,PATT_MID,PATT_END,PATT_TERM } pattpos;
+
i=regexec(&modistructs[m].regex,src,LENGTH(matches),matches,0);
if (i==REG_NOMATCH) continue;
if (i) {
fprintf(ERRH1"regexec() failed for \"%s\""ERRNO1,ERRH2,item->text,ERRNO2);
exit(EXIT_FAILURE);
}
- if (verbose) fprintf(stderr,"matched: %s -> %s\n",item->text,modistructs[m].dst);
- for (patt=modistructs[m].dst;*patt;patt++) {
- if (*patt=='@') {
- start=src; end=src+strlen(src);
- }
- else if (*patt>='0' && *patt<='9') {
+ if (verbose) printf("matched: %s -> %s\n",item->text,modistructs[m].dst);
+ pattpos=PATT_START; patt=NULL;
+ while (pattpos!=PATT_TERM) {
+ switch (pattpos) {
+ case PATT_START:
+ start=src;
+ end=src+matches->rm_so;
+ pattpos=PATT_MID; patt=modistructs[m].dst;
+ break;
+ case PATT_MID:
+ if (!*patt) {
+ pattpos=PATT_END; patt=NULL;
+ continue;
+ }
+ else if (*patt=='@') {
+ start=src; end=src+strlen(src);
+ }
+ else if (*patt>='0' && *patt<='9') {
regmatch_t *match=matches+(*patt-'0');
- if (match->rm_so==-1
- || match->rm_eo==-1) {
- fprintf(ERRH1"Trying to substitute '%c' but no \"matches\" entry not set for \"%s\""WHERE1,
- ERRH2,*patt,item->text,WHERE2);
- exit(EXIT_FAILURE);
- }
- if (match->rm_so>match->rm_eo) {
- fprintf(ERRH1"Trying to substitute '%c' start>end (%d>%d) for \"%s\""WHERE1,
- ERRH2,*patt,match->rm_so,match->rm_eo,item->text,WHERE2);
- exit(EXIT_FAILURE);
- }
- start=src+match->rm_so; end=src+match->rm_eo;
- }
- else {
- start=patt; end=patt+1;
+ if (match->rm_so==-1
+ || match->rm_eo==-1) {
+ fprintf(ERRH1"Trying to substitute '%c' but no \"matches\" entry not set for \"%s\""WHERE1,
+ ERRH2,*patt,item->text,WHERE2);
+ exit(EXIT_FAILURE);
+ }
+ if (match->rm_so>match->rm_eo) {
+ fprintf(ERRH1"Trying to substitute '%c' start>end (%d>%d) for \"%s\""WHERE1,
+ ERRH2,*patt,match->rm_so,match->rm_eo,item->text,WHERE2);
+ exit(EXIT_FAILURE);
+ }
+ start=src+match->rm_so; end=src+match->rm_eo;
+ }
+ else {
+ start=patt; end=patt+1;
+ }
+ patt++;
+ break;
+ case PATT_END:
+ start=src+matches->rm_eo;
+ end=src+strlen(src);
+ pattpos=PATT_TERM; /* assumed: patt=NULL; */
+ break;
+ default:
+ assert(0);
}
if ((dst-dstbase+(end-start))>=sizeof(modbuf1)) {
fprintf(ERRH1"Maximum buffer size exceeded during substition for \"%s\""WHERE1,
int hour,min;
pname=argv[0];
- while ((optc=getopt_long(argc,argv,"b:pw:qusTtc:f:vhV",longopts,NULL))!=EOF) switch (optc) {
+ while ((optc=getopt_long(argc,argv,"b:pw:qusTtc:f:r:vhV",longopts,NULL))!=EOF) switch (optc) {
case 'u':
sortby=SORT_NO;
case 'f':
formtotal=optarg;
break;
+ case 'r': {
+char *s,*dup;
+
+ if (!(s=strchr(optarg,':'))) {
+ fprintf(ERRH1"No delimiting ':'-character found in -r option \"%s\"!\n",ERRH2,optarg);
+ exit(EXIT_FAILURE);
+ }
+ if (!(dup=strdup(optarg))) {
+ fprintf(ERRH1"malloc() of \"%s\" string"ERRNO1,ERRH2,optarg,ERRNO2);
+ exit(EXIT_FAILURE);
+ }
+ dup[s-optarg]='\t';
+ addlist(&modifiescmdltail,dup,0);
+ modifies_tot++;
+ } break;
case 'v':
verbose=1;
break;