home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / useful / util / cli / whatis / 2.0 / for.c < prev    next >
C/C++ Source or Header  |  1993-03-30  |  20KB  |  710 lines

  1. /*
  2.  *    Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created:    23 May 1992     12:00:40
  5.  *    Modified:    18 Mar 1993  22:35:21
  6.  *
  7.  * Make>> sc <file>.c
  8.  * Make>> SLink LIB:cs.o <file>.o SC SD BATCH NOICONS LIB LIB:Startup.lib LIB:String.lib
  9.  */
  10.  
  11. #include <libraries/WhatIsBase.h>
  12. #include <proto/WhatIs.h>
  13.  
  14.  
  15. struct Library *WhatIsBase = NULL;
  16.  
  17. /* have problem whith stack size so I reduce string len */
  18. #define MAXSTRINGLEN 255/2
  19. #define MAXCMDLEN 512/2
  20.  
  21. #define MAX_PATHLEN 512
  22. /*ULONG const MaxStringLen = MAXSTRINGLEN;*/
  23.  
  24. #define MAXNUMARGS 64
  25. #define MAXDEFAULTLEN 512/2
  26.  
  27. /* char used in the filetype spec string */
  28. #define NOTFileType '!'
  29. #define ONLYFileType '%'
  30. #define WHITHSubSub '#'
  31.  
  32. STRPTR Template = "Pattern/M,Files/K,Dirs/K,Since/K,Before/K,MinSize/K/N,MaxSize/K/N,PosProtect/K,NegProtect/K,Type/K,ALL/K/S,ASYNC/K/S,READSIZE/N,SHOWBYTE/N,D=DEEP/K/N,SFT=SHOWFILETYPE/K/S,DO/K/F";
  33.  
  34. #define ARG_NameA    0
  35. #define ARG_Files        1
  36. #define ARG_Dirs        2
  37. #define ARG_Since        3
  38. #define ARG_Before    4
  39. #define ARG_MinSize    5
  40. #define ARG_MaxSize    6
  41. #define ARG_PosProtect    7
  42. #define ARG_NegProtect    8
  43. #define ARG_Type        9
  44. #define ARG_ALL        10
  45. #define ARG_ASYNC        11
  46. #define ARG_READSIZE    12
  47. #define ARG_SHOWBYTE    13
  48. #define ARG_DEEPWHATIS    14
  49. #define ARG_SHOWFILETYPE    15
  50. #define ARG_CMD        16
  51. #define ARG_ENDARG    17
  52.  
  53. STRPTR CliHelp = "For V2.0 © 1992 S.R. & P.C.\n\
  54. Usage: For <Pattern> [FILES <MATCH|YES|NO>]  [DIRS <MATCH|YES|NO>] [Since <Date>] [Before <Date>] [MinSize <Number>] [MaxSize <Number>] [PosProtect <L|C|H|S|P|A|R|W|E|D>] [NegProtect <L|C|H|S|P|A|R|W|E|D>] [Type <FileType0...FileType9|%=ONLY|*=SUB|!=EXLC>] [ALL] [ASYNC] [READSIZE] [SHOWBYTE] [DEEPWHATIS] [SHOWFILETYPE] [DO <Command [args] [,Command [args] [,...]]>]\n";
  55.  
  56. /*******************************************************/
  57. /* not in dos.h !! */
  58. #define    FIBB_HIDDEN        7
  59. #define    FIBF_HIDDEN        (1<<FIBB_HIDDEN)
  60.  
  61. /* it is my own definition: not standard */
  62. #define    FIBB_COMMENT    8
  63. #define    FIBF_COMMENT    (1<<FIBB_COMMENT)
  64. #define    FIBB_LINK        9
  65. #define    FIBF_LINK        (1<<FIBB_LINK)
  66.  
  67.  
  68. #define PATTERN_BUF_SIZE    32
  69. #define MAX_FTS                10    /* Max FileTypeSpec in SelectInfo */
  70.  
  71. struct FileTypeSpec {
  72.     FileType fs_FileType;
  73.     UWORD fs_Flags;
  74. };
  75.  
  76. /* FileTypeSpec flags */
  77. #define FTSF_EXCLUDETYPE    0x0001    /* Exclude this type (otherwise include) */
  78. #define FTSF_WITHSUBTYPES    0x0002    /* Affect Include/Exclude to subtypes */
  79.  
  80.  
  81. struct SelectInfo {
  82.     UBYTE si_Pattern[PATTERN_BUF_SIZE];    /* Pattern                        */
  83.     UBYTE si_PatTok[PATTERN_BUF_SIZE];    /* PreParsed pattern            */
  84.     LONG si_MinSize;    /* Show files bigger than that    */
  85.     LONG si_MaxSize;    /*   and smaller than that        */
  86.     struct DateStamp si_SinceDate;    /* Show files newer than that    */
  87.     struct DateStamp si_BeforeDate;    /*   and older than that        */
  88.     LONG si_SinceSecs;    /* date in seconds                */
  89.     LONG si_BeforeSecs;    /* date in seconds                */
  90.     UWORD si_PosProtect;    /* Show files that have these bits set   */
  91.     UWORD si_NegProtect;    /* Show files that have these bits clear */
  92.     struct FileTypeSpec si_FileTypes[MAX_FTS];    /* Include and Exclude file types */
  93.     UWORD si_NumFts;    /* Number of FileTypeSpec in previous array */
  94.     UWORD si_Flags;        /* Flags. See below                */
  95. };
  96.  
  97. /* SelectInfo flags */
  98.  
  99. #define SI_ALL_FILES        0x0001
  100. #define SI_MATCH_FILES        0x0002
  101. #define SI_ALL_DIRS            0x0004
  102. #define SI_MATCH_DIRS        0x0008
  103. #define SI_AFFECT_SUBDIRS    0x0010
  104. #define SI_NAME                0x0020
  105. #define SI_SIZE                0x0040
  106. #define SI_SINCEDATE        0x0080
  107. #define SI_BEFOREDATE        0x0100
  108. #define SI_POSPROTECTION    0x0200
  109. #define SI_NEGPROTECTION    0x0400
  110. //
  111. #define SI_INVERT            0x0800    /* Invert filters */
  112. //
  113. #define SI_AFFECT_INFO        0x1000    /* do actions on .info files too (WARNING: also defined as an option (for menu)) */
  114. #define SI_POSFILETYPE        0x2000
  115. #define SI_NEGFILETYPE        0x4000
  116.  
  117. #define SI_FILETYPE            (SI_POSFILETYPE|SI_NEGFILETYPE)
  118. #define SI_MATCHBITS        (SI_NAME|SI_SIZE|SI_SINCEDATE|SI_BEFOREDATE|SI_POSPROTECTION|SI_NEGPROTECTION|SI_FILETYPE)
  119. /*************************************************/
  120.  
  121. /*#pragma tagcall WhatIsBase WhatIs 1E 9802*/
  122. FileType _WhatIsTags(char *Name, Tag FirstTag,...)
  123. {
  124.     return (WhatIsBase) ? WhatIs(Name, (struct TagItem *) & FirstTag) : TYPE_UNSCANNED;
  125. }
  126.  
  127.  
  128. /*************************************************/
  129. /*
  130.  *    return pointer to the first non blank char in a string, or to the '\0' if
  131.  *    the string is empty
  132.  */
  133.  
  134. static char *FirstNonBlank(char *buf)
  135. {
  136.     while (*buf && *buf == ' ')
  137.         buf++;
  138.     return buf;
  139. }
  140.  
  141.  
  142. /* check if buffer is empty or not */
  143.  
  144. static BOOL IsEmpty(char *buf)
  145. {
  146.     return (BOOL) ((*FirstNonBlank(buf)) ? FALSE : TRUE);
  147. }
  148.  
  149.  
  150. static BOOL String2Date(char *src, struct DateStamp * ds)
  151. {
  152.     struct DateTime *dt;
  153.     BOOL Ok = TRUE;
  154.     char *s1, *s2;
  155.     char buf[PATTERN_BUF_SIZE];
  156.  
  157.     if (!(dt = AllocMem(sizeof(struct DateTime), MEMF_PUBLIC | MEMF_CLEAR)))
  158.         return FALSE;
  159.     strcpy(buf, src);
  160.     s1 = s2 = FirstNonBlank(buf);
  161.     if (*s1) {
  162.         dt->dat_StrDate = s1;
  163.         while (*s2 && *s2 != ' ')
  164.             s2++;
  165.         if (*s2) {
  166.             *s2++ = '\0';
  167.             s2 = FirstNonBlank(s2);
  168.         }
  169.         if (*s2) {
  170.             dt->dat_StrTime = s2;
  171.             if (!StrToDate(dt))
  172.                 Ok = FALSE;
  173.         }
  174.         else if (!StrToDate(dt)) {
  175.             dt->dat_StrDate = NULL;
  176.             dt->dat_StrTime = s1;
  177.             if (!StrToDate(dt))
  178.                 Ok = FALSE;
  179.         }
  180.         if (Ok)
  181.             *ds = dt->dat_Stamp;
  182.     }
  183.     FreeMem(dt, sizeof(struct DateTime));
  184.     return Ok;
  185. }
  186.  
  187. /* Convert DateStamp into a number of seconds since 1-Jan-78 */
  188.  
  189. long Date2Secs(struct DateStamp * ds)
  190. {
  191.     return ds->ds_Days * 86400 + ds->ds_Minute * 60 + ds->ds_Tick / 50;
  192. }
  193.  
  194. /*************************************************/
  195.  
  196. long __regargs _Main(void)
  197. {
  198.     char *ArgV[MAXNUMARGS];
  199.     struct RDArgs *RA;
  200.     struct RDArgs *DefaultRDArgs;
  201.     LONG RC = 20;        /* assumle the worst */
  202.  
  203.     if (DOSBase->dl_lib.lib_Version < 37)
  204.         return 20;
  205.  
  206.  
  207.     if (RA = AllocDosObject(DOS_RDARGS, NULL)) {
  208.         memset(ArgV, 0, MAXNUMARGS * sizeof(APTR));
  209.         RA->RDA_ExtHelp = CliHelp;
  210.         /* first read default */
  211.         /* getting the default string */
  212.         if (DefaultRDArgs = AllocDosObject(DOS_RDARGS, NULL)) {
  213.             UBYTE Default[MAXDEFAULTLEN];
  214.  
  215.             if ((DefaultRDArgs->RDA_Source.CS_Length = GetVar("For.DefOpts", Default, MAXDEFAULTLEN - 1, 0L)) > 0) {
  216.                 /* let ReadArgs() allocate neccesary buffer sinc I use diferrent RDArgs for Default and CLI opts */
  217.  
  218.                 /* Ok I succefuly read a Default Option string now parse it */
  219.                 Default[DefaultRDArgs->RDA_Source.CS_Length++] = '\n';    /* this is need by ReadArgs() */
  220.                 Default[DefaultRDArgs->RDA_Source.CS_Length] = '\0';    /* this is need by ReadArgs() */
  221.                 DefaultRDArgs->RDA_Source.CS_Buffer = Default;
  222.                 DefaultRDArgs->RDA_Source.CS_CurChr = 0;
  223.                 DefaultRDArgs->RDA_Flags = RDAF_NOPROMPT;
  224.                 if (!ReadArgs(Template, (long *) ArgV, DefaultRDArgs)) {
  225.                     PutStr("Error in Default:");
  226.                     PrintFault(IoErr(), NULL);
  227.                     memset(ArgV, 0, MAXNUMARGS * sizeof(APTR));
  228.                 }
  229.                 DefaultRDArgs->RDA_Source.CS_Buffer = NULL;    /* Now ReadArgs() from Command line */
  230.                 /* the ArgV is leaving unchanged: the second ReadArgs() take actual value as default */
  231.             }
  232.         }
  233.         /* Let ReadArgs() allocate necessay buffer rather using stack space */
  234.         if (ReadArgs(Template, (long *) ArgV, RA))
  235.             RC = Main(ArgV, NULL);
  236.         else
  237.             PrintFault(IoErr(), NULL);
  238.         FreeDosObject(DOS_RDARGS, RA);
  239.         /* Free RDargs now I don't need the option value */
  240.         if (DefaultRDArgs)
  241.             FreeDosObject(DOS_RDARGS, DefaultRDArgs);
  242.     }
  243.     return RC;
  244. }
  245.  
  246. /**** ****/
  247.  
  248. void RemoveDir(char FullDir[])
  249. {
  250.     char *s;
  251.  
  252.     if (s = PathPart(FullDir))
  253.         *s = '\0';
  254. }
  255.  
  256. void PrintByte(UBYTE Buffer[], long BufLen, UBYTE Num)
  257. {
  258.     register short i;
  259.  
  260.     for (i = 0; i < Num && i < BufLen; i++)
  261.         Printf("%02lx", (long) Buffer[i]);
  262. }
  263.  
  264. /*
  265.  *    Parse a line that may contain comas. Backslash ('\') is the override char.
  266.  */
  267. void ParseCmdLine(char *cmd)
  268. {
  269.     char *s, *d, c;
  270.  
  271.     s = d = cmd;
  272.     while (c = *d++ = *s++) {
  273.         if (c == '\\')
  274.             *(d - 1) = *s++;
  275.         else if (c == ',')
  276.             *(d - 1) = '\n';
  277.     }
  278. }
  279.  
  280. void MakeFmt(char Cmd[], char CmdFmt[])
  281. {
  282.     char *s;
  283.     BOOL Found = FALSE;
  284.  
  285.     strcpy(CmdFmt, Cmd);
  286.     ParseCmdLine(CmdFmt);    /* Replace , by \n to separate commands */
  287.     s = CmdFmt;
  288.     while (*s) {
  289.         if (*s == '%' && *(s + 1) == '%') {
  290.             *(s + 1) = 's';
  291.             Found = TRUE;
  292.         }
  293.         s++;
  294.     }
  295.     if (!Found)
  296.         StrnCat(CmdFmt, " %s", MAXCMDLEN - 1);
  297. }
  298.  
  299. UWORD ProtectBit(char P[])
  300. {
  301.     UWORD PB = 0;
  302.  
  303.     while (*P) {
  304.         switch (*P) {
  305.         case 'L'