/* gccPj001.c */ /* Generating a Batch.txt file. Internal messages are revised slightly in 2008. */ /* 1Bat - executable filename for posting */ /* History: PC "2Batch" => Classic Macintosh CodeWarriors 3 => MacOSX Apple's version of GCC-3.3 or similar. */ /* Instead of MPW, "1Bat" use 'Terminal'. Read 'Header.Txt', Write 'Batch.txt'. * Path difference easer is not necessary at MacOSX Dual. */ /* (2005-01-11) I decided to modify to normally terminate when "Header" * file is missing by telling that "Please put the Header file and do it again". * This is much better than a sudden Type 1 error closure. */ /* (2005-01-22) Double Quote is good. * On occasion of "Header" Picture Posting in the general * introduction (PURCHASE:ByVender), I tested Blank Space " " and Apostrophy * " ' " (Fry's Electronics). It turned out that I'd better to Double-Quote * All filenames in MPW. So I did. Then MPW errors are greatly reduced. * This is a minor change, but has a great effect. * Notice introduction (2005-01-11) and Double Quote (2005- * 01-22) are new to version "10B.c" */ /* (2005-02-25) GCC: I STARTED PORTING TO GCC OF MacOSX ================ * Luckily, I can get started Direct Porting of CodeWarrior Pro 3 C-codes * into Mac_OSX GCC (/user/bin/gcc). This "3MPWBatch.c" is compiled with * Object "spacedwd.o", and runs well. At Mac_OSX, I use Terminal interface * to make catalogs instead of MPW. * * [Programming note] At Mac_OSX GCC-3.3, C-compiler takes directly the regular * slash ("/") in 'printf()', and it is no longer Escape Character, so be * aware of this change. I don't know this is general to All GCC-3.3 OR * Mac_OSX adopted GCC-3.3, though. */ /* (2005-03-01) MacOSX all filenames (both reading and writing) would have * .txt * This makes them clear what they are: "Text files". * Also, OSX Catalogs don't need a Eraser of Path Difference, so I deleted * "outfp2" for "Path.txt" file. */ #include <stdio.h> #include <stdlib.h> #include <string.h> 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]; extern char *spacedwd (char *to, char *from); /* = spaced words, to capture blank-containing foldername */ main() { // char str[64], strPause[16]; char str1[64], str2[64], str3[64]; FILE *infpSDW, *infpZIP, *outfp1; /* These Pointers read fileNames list */ outfp1=fopen("Batch.txt", "w"); /* outfp1 is for generic output Batch file. */ /* ========== This Block is out of place But COPY CAME UP HERE, for early notice === */ /* ========== of MISSING "Header OR Header.txt" file. ======================== */ /* ================================================================================== */ /* The folllowing ";" are meant to continue, not for the end of sentence. * I use this, because I saw Five Time of opening, so I like the compact space. * Maybe I replace to continue for clearness. */ 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\n"); exit (0); } // infpSDW=fopen("Header", "r"); /* ================================================================================== */ printf("\n\nThis MacOSX DUAL is updated recently in March 2008. \n"); printf("Please read explanatory PDF document(s) to get an idea of mechanism. \n"); printf("Customization of 1Bat, 2Er, 3Diff at source codes is also easy. \n"); printf("With MacOSX purchase, Xcode Tools for development comes together. \n"); printf("Install it. That't it. Apple version of GCC (Compiler) works \n"); printf("almost the same as the other GCC in Linux_Unix. \n"); printf("This is for PowerPC-CPU. For Intel-CPU, please compile by yourself. \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, \n"); printf(" For example, if you use this in \"1dual\" folder at your home, \n\n"); printf(" /Users/YourUserName/1dual/ --- (absolute PATH). \n"); printf(" ~/1dual/ --- (shortcut PATH). \n\n"); printf(" In this example case, just type \"1dual\". \n"); printf(" Type now, the Working Folder Name : "); scanf("%s", &str1); printf(" Your Working Folder is set to : %s\n\n\n\n", str1); printf("Type Your ZIP_FLASH disk/drive name, \n"); printf(" For example, if your FLASH drive is mounted onto your MacOSX machine as, \n\n"); printf(" /Volumes/MyDessins/ ----- (absolute PATH). \n"); printf(" (here \"MyDessins\" is the volume name of FLASH drive.) \n\n"); printf(" Then type : MyDessins \n"); printf(" If you want to scan deeper subfolder of a FLASH drive, you can set the \n"); printf(" PATH there. \n"); printf(" Type now, ZIP_FLASH disk/drive\'s name : "); scanf("%s", &str3); printf(" Your ZIP_FLASH disk\'s scanning is set to : %s\n\n\n\n", str3); printf("Type Your Shadow (or Mirror) location of DUAL Copy on your hard disk. \n"); printf(" For example your shadow's absolute PATH is, \n\n"); printf(" /Users/YourUserName/sdw/MyDessins/ \n\n"); printf(" Then type : sdw/MyDessins \n"); printf(" Type now, Shadow location and ZIP_FLASH corresponding subfoldername : "); scanf("%s", &str2); printf(" Your Scanning Shadow on the hard disk is set to : %s\n\n", str2); fprintf (outfp1, "#! /bin/bash\n"); fprintf (outfp1, "#! /bin/tcsh\n\n"); fprintf (outfp1, "mkdir SDW\n"); fprintf (outfp1, "mkdir SDW/Erased\n"); fprintf (outfp1, "mkdir ZIP_FLASH\n"); fprintf (outfp1, "mkdir ZIP_FLASH/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_FLASH */ if ( (infpZIP=fopen("Header", "r"))!= NULL) ; else if ( (infpZIP=fopen("Header.Txt", "r"))!= NULL) ; else exit (0); /*===== ZIP-Catalog =====*/ while( (fgets(lineZIP, 64, infpZIP))!=NULL ) { spacedwd (folderName, &lineZIP[0]); /* Opening foldername, one-by-one */ fprintf (outfp1, "cd /Volumes/%s/\"%s\"\n", str3, folderName); fprintf (outfp1, "ls -lFR > ~/%s/ZIP_FLASH/\"%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/bash \n"); printf("#! /bin/tcsh \n\n"); printf("mkdir SDW\n"); printf("mkdir SDW/Erased \n\n"); printf("cd ~/sdw/MyDessins/\"Hippo_Owen_at_Wildlife_Park_Kenya\" \n"); printf("ls -lFR > ~/SDW/\"Hippo_Owen_at_Wildlife_Park_Kenya.txt\" \n"); printf("cd ~/sdw/MyDessins/\"Owen_s_friend_Tortoise_Mzee\" \n"); printf("ls -lFR > ~/SDW/\"Owen_s_friend_Tortoise_Mzee.txt\" \n"); printf("cd ~/sdw/MyDessins/\"Please_find_them_LATimes_Feb_20_2005_A3\" \n"); printf("ls -lFR > ~/SDW/\"Please_find_them_LATimes_Feb_20_2005_A3.txt\" \n\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 \"MacOSX-Unix-Linux.PDF\". -> \"How to set \'Batch.Txt\' \n"); printf("as an executable file.\" \n\n\n"); printf("Type any key then [return] to read through this note : "); scanf( "%s", &uType); /* ===Message=== If you didn't get the Batch file, a likely problem is that * the current working folder has not set in executable Path. =====END Message === * This message must go in .PDF trouble shooting file, not in a running Program. * Because, if Path is not set, no Program runs, including this Program. */ /* ===Another Message=== I should cautiously * mention a couple of times that whenever I make a new EXE & Batch files, I needed to * Re-new the Executable Path, according to my experience. Tedious though. * Well, for an user, only twice: before running OSX_DualWay and before running Batch.txt. * so, may not be so bad. For me, many times, because I compile many EXEs. */ printf("\n\n\nIf your Batch file is messy, a likely problem is that \"Header.(txt)\" \n" ); printf("file, so read carefully about trouble shooting about \"Header.(txt)\" \n" ); printf("file at the trouble shooting in \"MacOSX-Unix-Linux.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("SimpleText -> Edit -> Replace... -> and use \"Replace ALL\" conveniently \n"); printf("to fix the Paths. Bas error usually points to Path error. \n\n"); printf("By a brief test, under sophisticated network setting of your MacOSX \n"); printf("machine, sometimes you may need to Re-new the Executable Path before \n"); printf("running the Batch file. \n"); printf("Don\'t forget to change the Batch file permission from Read-only mode \n"); printf("to Read and Executable mode, such as \'chmod 777 Batch.txt\'. \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_FLASH\", \"DIFF\" folders in this working folder. \n"); printf("And those two folders (\"SDW\", \"ZIP_FLASH\") 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); }