/* gccPj001_6.c */ /* = Kdo.c + gccPj001_5.c */ /* All messages on "gccPj001.c" are taken out, for import, after */ /* import, put them back, if it sounds better. */ /* (2005-03-29) Now, I am getting into Kdo_0[1-5].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-03-30) I finished the rearragement of Kdo codes, * main(), and two Subroutines OpenAnyFile() and strupr(), * so it is the time to import the whole gccpj001.c into the * main(). */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <dirent.h> char line [256]; char uType [16]; char lineSDW [256], lineZIP [256]; char lineSDWEr [256], lineZIPEr [256], lineDIFF [256]; /* Those above lines could be all 'line', but they are Global, so * I took an extra cautious step to avoid any mixed-up. */ char folderName [128]; FILE *OpenAnyFile (char *FileName); /* Kdo's Subroutine */ void *strupr (void *buffer); /* Kdo's supplemental Subroutine */ extern char *spacedwd (char *to, char *from); /* = spaced words, to capture blank-containing foldername */ /* Now is not OSX_Macintosh, so people won't type blank in a filename */ /* but I just leave as it was. */ main () { char str1[64], str2[64], str3[64]; // FILE *file; FILE *infpSDW, *infpZIP, *outfp1; /* These Pointers read fileNames list */ outfp1=fopen("Batch.txt", "w"); /* outfp1 is for generic output Batch file. */ // file = OpenAnyFile ("header.txt"); infpSDW = OpenAnyFile ("header.txt"); if (infpSDW) printf ("\nReading Header.txt...\n"); else{ // perror ("Open failed"); printf("!!!!! Please put a \"Header.txt\" file about your Folder\n"); printf("!!!!! information. Please refer to \"Intro.PDF\" about \n"); printf("!!!!! how to make it. And do this again.\n\n"); exit (0); } /***** This Block is out of place But COPY CAME UP HERE, ******/ /***** for early notice ******/ /***** of MISSING "Header.txt" file. ******/ /*****************************************************************/ /* ************ HERE COMES IMPORT << gccpj001.c *************** */ /* ***** main()'s codes' basic structure above is Kdo's ******* */ // main() // { printf("\n\nThis UNIX_Linux Dual_Way is assuming that you have your \n"); printf("home account, and you made a working folder for this \n"); printf("Dual_Way there, and are running from there.\n\n "); /* Read user's input from the standard input */ /* The following User's Magic Variable Inputs work pretty well */ printf("\nType Your Working Folder name of this Dual-Way, \n"); printf(" including any upper path (folder name), if exists. \n"); printf(" For example, suppose you made a working folder called \n"); printf(" \"DualWay\" directly under your home, then type, \n"); printf(" For example: DualWay : "); scanf("%s", &str1); printf("Your Working Folder is set to : %s\n\n\n\n", str1); printf("Type Your disk's mounting path (ZIP, Floppy, Jaz, CD, DVD),\n"); printf(" and any folder name(s) between mounting path and the \n"); printf(" scanning folders, if exists. The disk name \"ZIP\" is \n"); printf(" used just as a representative of removable disk all \n"); printf(" the way below, but you can apply other disks. \n"); printf("For example, if your scanning folders are directly under \n"); printf(" the floppy disk, and the disk's mounting place is \n"); printf(" \"/mnt/floppy\". Then, \n"); printf(" Type : /mnt/floppy \n"); printf("For example, at the same mounting place, if your floppy \n"); printf(" disk's scanning folders are, for example, 16 of Samba \n"); printf(" Schools names (Aguia_de_Ouro, Mocidade_Alegre, ..) \n"); printf(" and they are buried under Geographic partition folders \n"); printf(" such as, \n"); printf(" /Brasil/Rio_de_Janeiro/. \n"); printf(" Then type : /mnt/floppy/Brasil/Rio_de_Janeiro \n"); printf(" Type now, from mounting place : "); scanf("%s", &str3); printf("Your disk\'s scanning path is set to : %s\n\n", str3); printf("Type Your Shadow (or Mirror) location of Dual Copy \n"); printf(" on your hard disk, including any sub-folder, if \n"); printf(" exists, between your HOME and scanning folders, likewise \n"); printf(" the disk\'s Path typing. \n"); printf(" For example: SDW/Brasil/Rio_de_Janeiro : \n"); printf(" Type now, beginning below HOME : "); scanf("%s", &str2); printf("Your Shadow on the hard disk is set to : %s\n\n", str2); /* Finished user's input. Now, get started an output. */ fprintf (outfp1, "#! /bin/tcsh\n"); fprintf (outfp1, "#! /bin/bash\n\n"); fprintf (outfp1, "mkdir SDW\n"); fprintf (outfp1, "mkdir SDW/Erased\n"); fprintf (outfp1, "mkdir ZIP\n"); fprintf (outfp1, "mkdir ZIP/Erased\n"); fprintf (outfp1, "mkdir DIFF\n\n"); /* Read all foldernames listing in "HEADER" file */ /* First SDW */ /* infpSDW reads All Foldernames at 'HEADER'. */ /* I added, if( infp=fopen() != NULL ) in case an user forgets the "Header" * file. Since I myself forget it often, I am making sure that the file * is provided. I wanted to put this message all the way first, so * this went up. Also, in OSX File Association with application became * blur by mixing of Extention and Signature Stamp mechanisms. So I * added "Header" and "Header.txt" both works. */ /******** Here is the ORIGINAL LOCATION of the notice **********/ /******** about MISSING "Header OR Header.txt" file. *********/ // if ( (infpSDW=fopen("Header", "r"))!= NULL) ; // else if ( (infpSDW=fopen("Header.Txt", "r"))!= NULL) ; // else{ // printf("!!!!! Please put a \"Header\" file about your Folder information.\n"); // printf("!!!!! And do this again.\n"); // exit (0); // } // infpSDW=fopen("Header", "r"); /*===== SDW-Catalog =====*/ while( (fgets(lineSDW, 64, infpSDW))!=NULL ) { spacedwd (folderName, &lineSDW[0]); /* Opening foldername, one-by-one */ fprintf (outfp1, "cd ~/%s/\"%s\"\n", str2, folderName); fprintf (outfp1, "ls -lFR > ~/%s/SDW/\"%s.txt\"\n", str1, folderName); } /* closing While-loop */ fclose (infpSDW); *folderName=0; /* Reset, in case */ fprintf (outfp1, "\n"); /* One Spacer line to see SWD, ZIP command lines clearly */ /* Second ZIP */ // if ( (infpZIP=fopen("Header", "r"))!= NULL) ; // else if ( (infpZIP=fopen("Header.Txt", "r"))!= NULL) ; // else exit (0); /* Reading Header.txt, second time is silent. */ infpZIP = OpenAnyFile ("header.txt"); if (infpZIP) printf (" \n"); else exit (0); /*===== ZIP-Catalog =====*/ while( (fgets(lineZIP, 64, infpZIP))!=NULL ) { spacedwd (folderName, &lineZIP[0]); /* Opening foldername, one-by-one */ fprintf (outfp1, "cd %s/\"%s\"\n", str3, folderName); fprintf (outfp1, "ls -lFR > ~/%s/ZIP/\"%s.txt\"\n", str1, folderName); } /* closing While-loop */ fclose (infpZIP); *folderName=0; /* Reset, in case */ /* This message is moved down, because it prompts to look at Batch file which * is empty, if this message is up before while-loop. */ printf("\n\n\nPlease examine \"Batch.txt\" file in this working folder after you \n"); printf("will finish this \"1Bat\". You will see something like below. \n\n"); printf("#! /bin/tcsh \n"); printf("#! /bin/bash \n\n"); printf("mkdir SDW\n"); printf("mkdir SDW/Erased \n\n"); printf("cd ~/SDW/Escolas_de_Samba/\"Aguia_de_Ouro\" \n"); printf("ls -lFR > ~/Way/SDW/\"Aguia_de_Ouro\" \n"); printf("cd ~/SDW/Escolas_de_Samba/\"Mocidade_Alegre\" \n"); printf("ls -lFR > ~/Way/SDW/\"Mocidade_Alegre\" \n\n"); printf("If you see these lines, we are ready to run this Batch script file. \n"); printf("Please read carefully how to run this UNIX/Linux/MacOSX generic \n"); printf("Batch Shell scripts at \"Unix_Linux_MacOSX.PDF\". -> \"How to set \n"); printf("\'Batch.txt\' as an executable file.\" \n\n\n"); printf("Type any key then [return] to read through this note : "); scanf( "%s", &uType); printf("\n\n\nIf your Batch file is messy, a likely problem is that \n"); printf("\"Header.txt\" file, so read carefully about trouble shooting \n"); printf("about \"Header.txt\" file at the trouble shooting in \n"); printf("\"Unix_Linux_MacOSX.PDF\". \n"); printf("If your Batch file has the wrong Path, or missing \n"); printf("parental Path etc., you can run this \"1Bat\" again, OR \n"); printf("edit the \'Batch.txt\' by your favorite Unix_Linux Editor. \n"); printf("\"Replace ALL\" works conveniently to fix the Paths. \n\n"); printf("By a brief test, you may need to Re-new the Executable \n"); printf("Path before running the Batch file. \n"); printf("Don\'t forget to change the Batch file permission from \n"); printf("Read only mode to Read and Executable mode, such as \'chmod 777\'. \n\n"); /* This message is about right time, but until running the Batch file, * I can't say * "Please check whether folders are made". */ printf("When you will successfully run the Batch script, you should be able \n"); printf("to see \"SDW\", \"ZIP\", \"DIFF\" folders in this working folder. \n"); printf("And those two folders (\"SDW\", \"ZIP\") are filled with catalogs, \n"); printf("which have all content information of each scanning folder. \n"); printf("If you will see them, then we can go to the final easy two steps. \n\n\n"); printf("END of \"1Bat\" \n\n"); fclose (outfp1); } /* ************* HERE ENDS 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); }