char *FGetField (char *buffer,int fieldID,char *fieldBuffer,int *fbSize) { int i, b; if ((i = FGetFieldPos (buffer,fieldID)) == FFault) { fprintf (stderr,"Field [%d] not found in: FGetField ()",fieldID); free (fieldBuffer); *fbSize = 0; return ((char *) NULL); } if (i > (int) strlen (buffer)) { if (fieldBuffer != (char *) NULL) free (fieldBuffer); *fbSize = 0; return ((char *) NULL); } for (b = 0;(b < (int) strlen (buffer + i)) && (buffer [b + i] != '\t'); ++b); if ((b > 0 ? b : 1) > *fbSize) { if ((fieldBuffer = (char *) realloc (fieldBuffer,(b + 1) * sizeof (char))) == (char *) NULL) { CMmsgPrint (CMmsgSysError, "Memory Allocation Error in: %s %d",__FILE__,__LINE__); *fbSize = 0; return ((char *) NULL); } *fbSize = b + 1; } strncpy (fieldBuffer,buffer + i,b); fieldBuffer[b] = '\0'; return (fieldBuffer); }
int main(int argc, char *argv[]) { char *buffer = (char *) NULL, *optarg; char *fieldBuffer = (char *) NULL, *name = (char *) NULL; char *qname = (char *) NULL; int argPos, argNum = argc; int bSize = 0, fbSize = 0; int inverse = FFalse; int keep, fieldID; FieldDsc *firstDsc = (FieldDsc *) NULL, *lastDsc = (FieldDsc *) NULL; FieldDsc *revFirstDsc = (FieldDsc *) NULL, *revLastDsc = (FieldDsc *) NULL; FieldDsc *fDsc, *rfDsc; if ((buffer = FGetLine(buffer, &bSize, stdin)) == (char *) NULL) { perror("Empty File in: main ()"); return (CMfailed); } for (argPos = 1; argPos < argNum;) { if (CMargTest (argv[argPos], "-f", "--field")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) { CMmsgPrint(CMmsgUsrError, "Missing field!"); return (CMfailed); } optarg = argv[argPos]; if ((qname = (char *) realloc(qname, strlen(optarg) + 3)) == (char *) NULL) { perror("Memory Allocation Error in: main ()"); return (CMfailed); } sprintf (qname, "\"%s\"", optarg); name = (char *) NULL; if ((fieldID = FGetFieldID(buffer, qname)) == FFault) { if ((fieldID = FGetFieldID(buffer, optarg)) == FFault) { CMmsgPrint(CMmsgUsrError, "Invalid Field Name: %s", optarg); return (CMfailed); } else name = optarg; } else name = qname; qname = (char *) NULL; if ((fDsc = (FieldDsc *) malloc(sizeof(FieldDsc))) == (FieldDsc *) NULL) { perror("Memory Allocation Error in: main ()"); return (CMfailed); } fDsc->ID = fieldID; fDsc->Name = name; fDsc->Keep = keep; fDsc->Next = (FieldDsc *) NULL; if (firstDsc == (FieldDsc *) NULL) { firstDsc = lastDsc = fDsc; fDsc->Prev = (FieldDsc *) NULL; } else { lastDsc->Next = fDsc; fDsc->Prev = lastDsc; lastDsc = fDsc; } keep = FFalse; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest (argv[argPos], "-r", "--rename")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) { CMmsgPrint(CMmsgUsrError, "Missing New Name!"); return (CMfailed); } name = argv[argPos]; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest (argv[argPos], "-n", "--nfield")) { keep = FTrue; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest (argv[argPos], "-v", "--inverse")) { inverse = FTrue; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest (argv[argPos], "-h", "--help")) goto Usage; if (argv[argPos][0] == '-') { CMmsgPrint(CMmsgUsrError, "Unknown option: %s!", argv[argPos]); return (CMfailed); } argPos++; } if (inverse) { for (fieldID = 0; FGetFieldPos(buffer, fieldID) != FFault; ++fieldID) { for (fDsc = firstDsc; fDsc != (FieldDsc *) NULL; fDsc = fDsc->Next) if (fDsc->ID == fieldID) break; if ((fDsc == (FieldDsc *) NULL) || (fDsc->Keep == FTrue)) { if (fDsc != (FieldDsc *) NULL) { if ((name = (char *) malloc(strlen(fDsc->Name) + 1)) == (char *) NULL) { perror("Memory Allocation Error in: main ()"); return (CMfailed); } strcpy (name, fDsc->Name); } else { if ((fieldBuffer = FGetField(buffer, fieldID, fieldBuffer, &fbSize)) == (char *) NULL) { CMmsgPrint(CMmsgUsrError, "Total Gebasz in: main ()"); return (CMfailed); } if ((name = (char *) malloc(strlen(fieldBuffer) + 1)) == (char *) NULL) { perror("Memory Allocation Error in: main ()"); return (CMfailed); } strcpy (name, fieldBuffer); } if ((rfDsc = (FieldDsc *) malloc(sizeof(FieldDsc))) == (FieldDsc *) NULL) { perror("Memory Allocation Error in: main ()"); return (CMfailed); } rfDsc->ID = fieldID; rfDsc->Next = (FieldDsc *) NULL; rfDsc->Name = name; if (revFirstDsc == (FieldDsc *) NULL) { revFirstDsc = revLastDsc = rfDsc; rfDsc->Prev = (FieldDsc *) NULL; } else { revLastDsc->Next = rfDsc; rfDsc->Prev = revLastDsc; revLastDsc = rfDsc; } } if (fDsc != (FieldDsc *) NULL) { if (fDsc->Next == (FieldDsc *) NULL) lastDsc = fDsc->Prev; else { fDsc->Next->Prev = fDsc->Prev; } if (fDsc->Prev == (FieldDsc *) NULL) firstDsc = fDsc->Next; else fDsc->Prev->Next = fDsc->Next; free(fDsc); } } firstDsc = revFirstDsc; lastDsc = revLastDsc; } if (firstDsc->Name[0] == '"') { printf("%s", firstDsc->Name); } else { printf("\"%s\"", firstDsc->Name); } fDsc = firstDsc->Next; while (fDsc != (FieldDsc *) NULL) { if (fDsc->Name[0] == '"') { printf("\t%s", fDsc->Name); } else { printf("\t\"%s\"", fDsc->Name); } fDsc = fDsc->Next; } printf("\n"); while ((buffer = FGetLine(buffer, &bSize, stdin)) != (char *) NULL) { if (firstDsc != (FieldDsc *) NULL) { if ((fieldBuffer = FGetField(buffer, firstDsc->ID, fieldBuffer, &fbSize)) == (char *) NULL) { CMmsgPrint(CMmsgUsrError, "Total Gebasz"); return (CMfailed); } printf("%s", fieldBuffer); fDsc = firstDsc->Next; } while (fDsc != (FieldDsc *) NULL) { if ((fieldBuffer = FGetField(buffer, fDsc->ID, fieldBuffer, &fbSize)) == (char *) NULL) { CMmsgPrint(CMmsgUsrError, "Total Gebasz"); return (CMfailed); } printf("\t%s", fieldBuffer); fDsc = fDsc->Next; } printf("\n"); } fDsc = firstDsc->Next; free(firstDsc); while (fDsc != (FieldDsc *) NULL) { firstDsc = fDsc; fDsc = fDsc->Next; free(firstDsc); } return (FSuccess); Usage: printf("Usage: %s [-hvnrf [field | name] [name]] ... < [inputfile] ...", argv[0]); CMmsgPrint(CMmsgInfo, "where fieldnames must match fieldnames in first line of the datafile."); CMmsgPrint(CMmsgInfo, "-f, --field field\n\tSpecifies field (column) to display. Repeat for multiple fields."); CMmsgPrint(CMmsgInfo, "-h, --help\n\tPrint this usage information."); CMmsgPrint(CMmsgInfo, "-r, --rename name\n\tRename field. Sets the field name of the next `-f' or '-n' field.\n\tIf negated operation (`-v') is requested, '-n' or '--nfield' must be used."); CMmsgPrint(CMmsgInfo, "-v, --inverse\n\tNegated operation, suppressing given fields only. Ignored if\n\tno fields are given."); return (FSuccess); }