home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 9
/
FreshFishVol9-CD2.bin
/
bbs
/
util
/
browserii-3.0.lha
/
BrowserII
/
Sources
/
AddIcon.c
next >
Wrap
C/C++ Source or Header
|
1994-12-18
|
7KB
|
243 lines
/*
* AddIcon.c - Copyright © 1994 by S.R. & P.C.
*
* Created: 23 May 1992 12:00:40
* Modified: 18 Dec 1994 16:59:33
*
* Make>> rx BumpRev AddIcon 1 3
* Make>> sc <file>.c
* Make>> slink LIB:cs.o <file>.o SC SD ND BATCH NOICONS TO <file> LIB LIB:c.lib
*/
#include <libraries/WhatIsBase.h>
#include <proto/WhatIs.h>
#include <clib.h>
#include "AddIcon_rev.h"
// Startup Modules...
CliArgs;
struct Library *WhatIsBase;
struct Library *IconBase;
#define MAXFULLNAMELEN 255
char *Template = "FileName/A,ONLYTYPE/K,FILESONLY/S,DIRSONLY/S,QUIET/S,FLOAT/S,OVERWRITE/S,ALL/S";
char *CliHelp = "AddIcon V"VERSIONREVISION" © 1992-94
S.R. & P.C.
";
static char Version[] = VERSTAG;
#define ARG_FileName 0
#define ARG_ONLY 1
#define ARG_FILES 2
#define ARG_DIRS 3
#define ARG_QUIET 4
#define ARG_FLOAT 5
#define ARG_OVERWRITE 6
#define ARG_ALL 7
#define ARG_ENDARG 8
static void GetDefIconsDir(char *Buf)
{
#define DOSLISTFLAGS (LDF_READ|LDF_VOLUMES|LDF_ASSIGNS)
struct DosList *dl;
BOOL Done = FALSE;
if (dl = LockDosList(DOSLISTFLAGS)) {
if (FindDosEntry(dl, "ICONS", DOSLISTFLAGS)) {
strcpy(Buf, "ICONS:");
Done = TRUE;
}
UnLockDosList(DOSLISTFLAGS);
}
if (!Done)
strcpy(Buf, "ENV:Sys");
}
/* FIB can be null but give it if you alredy have it. */
BOOL AddIcon(char *FileName, FileType OnlyType, BOOL Quiet, BOOL Float, BOOL Overwrite, struct DiskObject ** LastDOb, FileType * LastType, struct FileInfoBlock * FIB)
{
char *IconName = NULL;
char Buf[255];
FileType Type;
LONG WBType = 0;
BOOL Idem;
BOOL Ok = FALSE; /* assume the worst */
struct DiskObject *dob = NULL;
BPTR L;
if (!Quiet) {
Printf("%-32s ", FileName);
Flush(Output());
}
SPrintf(Buf, "%s.info", FileName);
if (!Overwrite && (L = Lock(Buf, ACCESS_READ))) {
UnLock(L);
if (!Quiet)
PutStr("Icon already exist.\n");
return TRUE;
}
Type = WhatIsTags(FileName, WI_Deep, DEEPTYPE, (FIB) ? WI_FIB : TAG_IGNORE, FIB, TAG_DONE);
if (!Quiet) {
Printf("%-12s ", GetIDString(Type));
Flush(Output());
}
if ((OnlyType != TYPE_UNSCANNED) && CmpFileType(Type, OnlyType)) {
if (!Quiet)
PutStr("Type not desired\n");
return TRUE;
}
Idem = !CmpFileType(Type, *LastType);
if (CmpFileType(Type, TYPE_UNKNOWNFILETYPE)) {
if (!CmpFileType(Type, GetIDType("Volume"))) {
IconName = "def_Disk";
FileName = "Disk";
WBType = WBDISK; /* To use ROM resident icon if no def_Tool defined in ENV:Sys */
}
else if (!CmpFileType(Type, GetIDType("Dir"))) {
IconName = "def_Drawer";
WBType = WBDRAWER; /* To use ROM resident icon if no def_Tool defined in ENV:Sys */
}
else if (IconName = GetIconName(Type)) {
if (!Stricmp(IconName, "def_Tool"))
WBType = WBTOOL; /* To use ROM resident icon if no def_Tool defined in ENV:Sys */
else if (!Stricmp(IconName, "def_Project"))
WBType = WBPROJECT; /* To use ROM resident icon if no def_Project defined in ENV:Sys */
}
if (!Quiet) {
if (IconName) {
Printf("%s...", IconName);
Flush(Output());
}
else
Printf("No icon defined!\n");
}
GetDefIconsDir(Buf);
AddPart(Buf, IconName, 50); // Use AddPart() so that user can configure DEFICONS:def_Mumble is S:FileTypes
if ((dob = (Idem) ? *LastDOb : ((WBType) ? GetDefDiskObject(WBType) : GetDiskObject(Buf)))) {
if (Float) {
dob->do_CurrentX = NO_ICON_POSITION;
dob->do_CurrentY = NO_ICON_POSITION;
}
if (PutDiskObject(FileName, dob)) {
if (!Quiet)
PutStr("Ok\n");
if (!Idem) {
if (*LastDOb)
FreeDiskObject(*LastDOb);
*LastDOb = dob; /* memorise the current icon */
*LastType = Type; /* memorise the current type */
}
Ok = TRUE;
}
else
PutStr("Can't write icon !\n");
}
else if (IconName)
PutStr("Can't read icon.\n");
}
else
PutStr("Unknown file type.\n");
return Ok;
}
long Main(char *argv[], struct WBStartup *WBenchMsg)
{
long rc = 0, NumSub = 0;
char *FileName;
BOOL Files, Dirs, Quiet, Float, OverWrite, All;
struct AnchorPath *AP;
FileName = argv[ARG_FileName];
Files = (BOOL) argv[ARG_FILES];
Dirs = (BOOL) argv[ARG_DIRS];
Quiet = (BOOL) argv[ARG_QUIET];
Float = (BOOL) argv[ARG_FLOAT];
OverWrite = (BOOL) argv[ARG_OVERWRITE];
All = (BOOL) argv[ARG_ALL];
if (!(IconBase = OpenLibrary("icon.library", 37L)))
return 20;
if (WhatIsBase = OpenLibrary("whatis.library", 0)) {
if (AP = AllocVec(sizeof(struct AnchorPath) + 256, MEMF_PUBLIC|MEMF_CLEAR)) {
struct DiskObject *LastDOb = NULL;
FileType LastType = TYPE_UNKNOWNFILETYPE, OnlyType = TYPE_UNSCANNED;
LONG MatchErr;
BPTR StartDir;
if (argv[ARG_ONLY])
OnlyType = GetIDType(argv[ARG_ONLY]);
AP->ap_BreakBits = SIGBREAKF_CTRL_C; /* Break on these bits */
AP->ap_Strlen = 255;
AP->ap_Flags = (All) ? APF_DODOT : APF_DODOT|APF_DOWILD; /* allow convertion of '.' to CurrentDir */
switch (ParsePatternNoCase(FileName, AP->ap_Buf, 256)) {
case 1: // Pattern
StartDir = CurrentDir(((struct Process *) SysBase->ThisTask)->pr_CurrentDir);
for (MatchErr = MatchFirst(FileName, AP); MatchErr == 0; MatchErr = MatchNext(AP)) {
if (AP->ap_Flags & APF_DirChanged) {
CurrentDir(AP->ap_Current->an_Lock);
}
if (AP->fib_DirEntryType > 0) {
if (AP->ap_Flags & APF_DIDDIR) {
if (!Files)
AddIcon(AP->fib_FileName, OnlyType, Quiet, Float, OverWrite, &LastDOb, &LastType, &AP->ap_Info);
/* clear the completed directory flag */
AP->ap_Flags &= ~APF_DIDDIR;
NumSub--;
}
else {
if (All) {
long i;
if (!Quiet) {
for (i=0; i<NumSub; i++)
Printf(" ");
Printf("
%s (dir)
\n", AP->fib_FileName);
}
/* make it enter the directory */
AP->ap_Flags |= APF_DODIR;
NumSub++;
}
else
AddIcon(AP->fib_FileName, OnlyType, Quiet, Float, OverWrite, &LastDOb, &LastType, &AP->ap_Info);
}
}
else { // File
if (!Dirs && !MatchPatternNoCase("\X80.INFO", AP->fib_FileName))
AddIcon(AP->fib_FileName, OnlyType, Quiet, Float, OverWrite, &LastDOb, &LastType, &AP->ap_Info);
}
}
MatchEnd(AP); /* This absolutely, positively must be called, all of the time. */
CurrentDir(StartDir);
if (MatchErr != ERROR_NO_MORE_ENTRIES) {
PrintFault(MatchErr, "AddIcon");
rc = RETURN_ERROR;
}
break;
case 0:
// Normal file or dir, no pattern.
if (!MatchPatternNoCase("\X80.INFO", AP->fib_FileName))
AddIcon(FileName, OnlyType, Quiet, Float, OverWrite, &LastDOb, &LastType, NULL);
break;
default:
PrintFault(IoErr(), "AddIcon");
rc = RETURN_ERROR;
}
if (LastDOb)
FreeDiskObject(LastDOb);
FreeVec(AP);
}
CloseLibrary(WhatIsBase);
}
else
Printf("Requires whatis.library\n");
CloseLibrary(IconBase);
return rc;
}