/* gccPj002_4.c */
/* = Kdo.c + gccPj002.c (MacOSX) */
/* 2Er - executable file posted */
/* (2005-03-29) Now, I am getting into Kdo_0[1-4].c codes.
* The file pointer "Stream" is local within OpenAnyFile
* subroutine, and it is renamed in main.c as the file pointer "file".
*
* It was originally,
* main (int argc, char **argv){
* file = OpenAnyFile (agrv[1]);
* }
* to take the argv[1] as the user's input file name. I only
* need to get the user's fixed filename "HEADER.TXT" or
* "header.txt" so on, thus, it becomes here,
* file = OpenAnyFile ("Header.Txt");
* And this works well.
*/
/* (2005-04-01) The whole "gccPj002.c" inserted into Kdo's main.c, and
* then "Header.Txt" is Case-Insensitive. File Pointer "file"
* is adjusted to "infpSDW", "infpZIP", that's all.
*/
/* (2005-04-05) Importing into the whole codes into "Kdo.c" is easy,
* but multiple switch about Different Field(s) Erasing needs a
* a careful writing in the ELSE-LOOP of Erasing Process.
* In that ELSE-LOOP, I need
* if (Opt 1) - Fld 1 : Objs fild_1up.o fild_1dw.o
* if (Opt 2) - Fld 1+4 : Objs fild_2up.o fild_2dw.o
* if (Opt 3) - Fld 1+3+4 : Objs fild_3up.o fild_3dw.o
* etcetra.
* Thus, the Erasing Process becomes multiple branching options.
* It goes to a bunch of Recycling Objects, so write the Makefile
* and do the compilation by "make".
*/
/* Let me test, OPTION NO 1, if works, fill the rest */
/* It's working, so go for the rest. */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
char line [256];
char upField [128], downField [128];
char FNToOpen [64]; /* = filenamesToOpen */
char openedFN [64]; /* = opendFilename */
char openedFNP [64]; /* = opendFilenameWithPath */
char writingFile [64];
int OPTION, ERASE_NO; /* ERASE_No is a MagicNumber */
/* Following Two(2) Subroutines from Kdo.c */
FILE *OpenAnyFile (char *FileName);
void *strupr (void *buffer);
extern char *spacedwd (char *to, char *from);
/* = spaced words, to capture blank-containing foldername */
/* In UNIX_Linux, an user prefers no blank file and folder names. */
/* But let me see for a little while. */
/* Following Two(2) Objects are in "gccPj002.c", then here modified. */
// extern char *fild_no1 (char *to, char *from); /* Recycling Object */
// extern char *fild_no2 (char *to, char *from); /* Recycling Object */
extern char *fild_1up (char *to, char *from); /* Target Feild_No 1 */
extern char *fild_1dw (char *to, char *from); /* " */
extern char *fild_4up (char *to, char *from); /* Target No. 4 */
extern char *fild_4dw (char *to, char *from); /* " */
extern char *fild_7up (char *to, char *from); /* Target No. 3+4 */
extern char *fild_7dw (char *to, char *from); /* " */
main ()
{
int JUMP_NO;
// FILE *file;
FILE *infpSDW, *infpZIP;
JUMP_NO=0;
infpSDW = OpenAnyFile ("header.txt");
if (infpSDW)
printf ("\nReading Header.txt...\n");
else{
// perror ("Open failed");
printf("\n!!!!! Please put a \"Header.txt\" file about your \n");
printf("!!!!! Folder information. And do this again.\n\n");
exit (0);
}
/* Reading Header.txt... 2nd time is silent. */
infpZIP = OpenAnyFile ("header.txt");
if (infpZIP){
printf (" \n");
}else{
exit (0);
}
/* Now, let's get started. */
printf("Since different UNIX_Linux OS makes slightly different \n");
printf("\"Catalog.txt\", please examine your catalogs at \"SDW\" \n");
printf("and \"ZIP\" folders, and find out which columns are \n");
printf("different among total nine(9) columns(fields), and come \n");
printf("back here to continue. \n\n");
printf("Please select which combination of column(s)(fields) you \n");
printf("want to erase for easy comparison. \n\n");
printf(" 1. Field No.1 Only \n");
printf(" 2. Field No.4 Only \n");
printf(" 3. Field No.3+4 \n");
printf(" 4. Field No.1+3+4 \n\n");
printf("Select Your Field_Erase_Combo by Number [1, 2, 3 or 4] : ");
scanf("%d", &OPTION);
printf(" \n\n\n");
if (OPTION==1) ERASE_NO=1;
if (OPTION==2) ERASE_NO=4;
if (OPTION==3) ERASE_NO=7;
if (OPTION==4) ERASE_NO=8;
/* ****** Here starts the body of "gccPj002.c" import ******** */
printf("\n\n\nOne moment. Then, go to see if a part of OWNER stamps erased \n");
printf("files are there at SDW/Erased/ and ZIP/Erased/. If there, we \n");
printf("can go to the last step \"3Diff\". \n\n\n");
/* Read all lines in each catalogs in the SDW folder, and apply Eraser ===== */
while( (fgets(FNToOpen, 64, infpSDW))!=NULL )
{
FILE *infp1, *outfp1; /* These fp1s are for SDW */
spacedwd (openedFN, &FNToOpen[0]);
/* Opening filename, one-by-one */
sprintf (openedFNP, "./SDW/%s.txt", openedFN);
sprintf (writingFile, "./SDW/Erased/%s.txt", openedFN);
infp1=fopen(openedFNP, "r");
outfp1=fopen(writingFile, "w");
fprintf (outfp1, "SDW\n");
while( fgets(line, 256, infp1)!=NULL ){
if ( strncmp(line, "total", 5)==0 )
fprintf (outfp1, "total\n");
else if ( strncmp(line, ".:", 2)==0 )
fprintf (outfp1, "%s", line);
else if ( strncmp(line, "./", 2)==0 )
fprintf (outfp1, "%s", line);
else if ( strncmp(line, "\n", 1)==0 )
fprintf (outfp1, "\n");
else{ /* At here, I need to apply OWNER Stamp Erasing */
/* ** For my Reading convenience, Indent was removed in this section */
/* ***************************************************************** */
/* All Field Sandwitch Eraser Objects starts from &line[0] */
/* The [0] is reminiscence of fixed column control prototype. */
if (ERASE_NO==1) {
fild_1up (upField, &line[0]); /* Field No.1 Only*/
fild_1dw (downField, &line[0]);
fprintf (outfp1, "%s %s", upField, downField);
/* 10 Blanks for " -rwxrwxr-x" */
}
if (ERASE_NO==4) {
fild_4up (upField, &line[0]); /* Field No.4 Only*/
fild_4dw (downField, &line[0]);
fprintf (outfp1, "%s %s", upField, downField);
/* 5 Blanks for "mkido" OR else */
}
if (ERASE_NO==7) {
fild_7up (upField, &line[0]); /* Field No.3+4 = 7 */
fild_7dw (downField, &line[0]);
fprintf (outfp1, "%s %s", upField, downField);
/* 14 + Blanks for "mkido mkido" OR else */
}
if (ERASE_NO==8) {
fild_8up (upField, &line[0]); /* Field No.1+3+4 = 8*/
fild_8dw (downField, &line[0]);
fprintf (outfp1, " %s %s", upField,
downField);
/* 10+14 Blanks for "-rwxrwxr-x mkido mkido" OR else */
}
/* ** End of Reading convenience, return to normal Indent ************ */
} /* closing Else-loop */
} /* closing While-loop of SDW catalog Reading*/
*openedFN=0; /* Reset, in case */
*openedFNP=0;
fclose (infp1);
fclose (outfp1);
} /* closing, one-by-one file opening While-loop */
fclose (infpSDW);
/* Read all lines in each catalogs in the ZIP folder, and apply Eraser */
while( (fgets(FNToOpen, 64, infpZIP))!=NULL )
{
FILE *infp2, *outfp2; /* These fp2s are for ZIP */
spacedwd (openedFN, &FNToOpen[0]);
/* Opening filename, one-by-one */
sprintf (openedFNP, "./ZIP/%s.txt", openedFN);
sprintf (writingFile, "./ZIP/Erased/%s.txt", openedFN);
infp2=fopen(openedFNP, "r");
outfp2=fopen(writingFile, "w");
fprintf (outfp2, "ZIP\n");
while( fgets(line, 256, infp2)!=NULL ){
if ( strncmp(line, "total", 5)==0 )
fprintf (outfp2, "total\n");
else if ( strncmp(line, ".:", 2)==0 )
fprintf (outfp2, "%s", line);
else if ( strncmp(line, "./", 2)==0 )
fprintf (outfp2, "%s", line);
else if ( strncmp(line, "\n", 1)==0 )
fprintf (outfp2, "\n");
else{ /* At here, I need to apply OWNER Stamp Erasing */
/* ** For my Reading convenience, Indent was removed in this section */
/* ***************************************************************** */
if (ERASE_NO==1) {
fild_1up (upField, &line[0]); /* Field No.1 Only*/
fild_1dw (downField, &line[0]);
fprintf (outfp2, "%s %s", upField, downField);
/* 10 Blanks for " -rwxrwxr-x" */
}
if (ERASE_NO==4) {
fild_4up (upField, &line[0]); /* Field No.4 Only*/
fild_4dw (downField, &line[0]);
fprintf (outfp2, "%s %s", upField, downField);
/* 5 Blanks for "root" (in case of CD) OR else */
}
if (ERASE_NO==7) {
fild_7up (upField, &line[0]); /* Field No.3+4 = 7 */
fild_7dw (downField, &line[0]);
fprintf (outfp2, "%s %s", upField, downField);
/* 14 Blanks for "root root" OR else */
}
if (ERASE_NO==8) {
fild_8up (upField, &line[0]); /* Field No.1+3+4 = 8*/
fild_8dw (downField, &line[0]);
fprintf (outfp2, " %s %s", upField, downField);
/* 10+14 Blanks for " -rwxrwxr-x root root" OR else */
}
/* ** End of Reading convenience, return to normal Indent ************ */
} /* closing Else-loop */
} /* closing While-loop of ZIP catalog Reading */
*openedFN=0; /* Reset, in case */
*openedFNP=0;
fclose (infp2);
fclose (outfp2);
} /* closing, one-by-one file opening While-loop */
fclose (infpZIP);
}
/* ******** END of "gccPj002.c" import ******************** */
/* Here are two SUBROUTINEs by Kdo. */
/* ******************************** */
// FILE *OpenAnyFile (char *FileName);
// void *strupr (void *buffer);
/* Find any file with same spelling regardless of capitalization */
/* Return a stream to the file, opened for read access */
FILE *OpenAnyFile (char *FileName)
{
DIR *Dir;
struct dirent *DirEnt;
char *Target;
char *Temp;
FILE *Stream = NULL;
Target = strdup (FileName); // make an upper case version of the name.
strupr (Target);
Dir = opendir ("."); /* any suitable directory name */
while (DirEnt = readdir (Dir))
{
Temp = strdup (DirEnt->d_name);
strupr (Temp); // convert the found name to upper case
if (strcmp (Temp, Target) == 0) // names match
{
Stream = fopen (DirEnt->d_name, "r"); // open the file for read
free (Temp);
break;
}
free (Temp);
}
free (Target);
closedir (Dir);
return (Stream);
}
/* strupr() isn't universal. You can make one very easily. */
/* Pass void so you can pass either char or unsigned char */
/* void *strupr (void *buffer); */
void *strupr (void *Buffer)
{
unsigned char *ptr;
ptr = (unsigned char *)Buffer;
while (*ptr)
{
if (*ptr >= 'a' && *ptr <= 'z')
*(ptr++) = (*ptr) - 'a' + 'A';
else
ptr++;
}
return (Buffer);
}