2 Copyright © 1995-2008, The AROS Development Team. All rights reserved.
5 Desc: Filenote CLI command
9 /*****************************************************************************
17 FILE/A,COMMENT,ALL/S,QUIET/S
25 Add a comment to a file or directory.
27 Filenote allows a recursive scan of all directories adding comments
28 to each file/directory it finds that matches the file pattern
33 FILE - Always has to be specified. Can be either a filename with
34 a full path or a file pattern that is to be matched.
36 COMMENT - The string that is to be added as a comment to the
37 file(s)/dir(s) specified. If no comment is specified, any
38 existing comment is deleted.
40 To provide a comment that has embedded quotation marks,
41 precede each quote with an asterisk.
43 i.e. Filenote FILE=RAM:test.txt COMMENT=*"hello*"
45 ALL - Boolean switch. If specified, Filenote scans the directories
46 that match the pattern specified, recursively.
48 QUIET - Boolean switch. If specified, no diagnostic text will be
53 Standard DOS return codes.
57 Output from AROS' Filenote is more neat and structured than the
58 standard Filenote command.
60 Does not yet support multi-assigns.
64 Filenote ram: hello all
66 Recurses through each directory in RAM: adding "hello" as a
67 filenote to each file/directory.
73 dos.library/SetComment()
77 ******************************************************************************/
79 #include <proto/arossupport.h>
80 #include <proto/dos.h>
81 #include <proto/exec.h>
84 #include <dos/dosasl.h>
85 #include <dos/dosextens.h>
86 #include <dos/rdargs.h>
87 #include <exec/memory.h>
88 #include <utility/utility.h>
94 #define ERROR_HEADER "Filenote"
96 #define ARG_TEMPLATE "FILE/A,COMMENT,ALL/S,QUIET/S"
103 /* To define whether a command line switch was set or not.
107 #define MAX_PATH_LEN 512
109 const TEXT version
[] = "$VER: Filenote 41.1 (29.8.1998)\n";
111 int Do_Filenote(struct AnchorPath
*, STRPTR
, STRPTR
, LONG
, LONG
);
118 struct AnchorPath
* apath
;
119 IPTR args
[TOTAL_ARGS
] = { NULL
, (IPTR
)"", NULL
, NULL
};
124 Return_Value
= RETURN_OK
;
126 apath
= AllocVec(sizeof(struct AnchorPath
) + MAX_PATH_LEN
,
127 MEMF_ANY
| MEMF_CLEAR
);
130 /* Make sure DOS knows the buffer size.
132 apath
->ap_Flags
= APF_DOWILD
| APF_FollowHLinks
;
133 apath
->ap_Strlen
= MAX_PATH_LEN
;
134 apath
->ap_BreakBits
= 0;
135 apath
->ap_FoundBreak
= 0;
137 rda
= ReadArgs(ARG_TEMPLATE
, args
, NULL
);
140 Return_Value
= Do_Filenote(apath
,
141 (STRPTR
)args
[ARG_FILE
],
142 (STRPTR
)args
[ARG_COMMENT
],
144 (LONG
)args
[ARG_QUIET
]
150 PrintFault(IoErr(), ERROR_HEADER
);
152 Return_Value
= RETURN_ERROR
;
157 Return_Value
= RETURN_FAIL
;
164 return (Return_Value
);
169 /* Defines whether MatchFirst(), etc has matched a file.
171 #define MATCHED_FILE 0
173 void PrintFileName(struct AnchorPath
*, LONG
);
174 int SafeSetFileComment(struct AnchorPath
*, char *);
176 int Do_Filenote(struct AnchorPath
*a
,
186 Return_Value
= RETURN_OK
;
189 /* Looks to see if the user has given a volume name as a pattern
190 * without the all switch set. If so, we fail.
195 IsDosEntryA((char *)File
, LDF_VOLUMES
| LDF_DEVICES
) == TRUE
200 PrintFault(ERROR_OBJECT_WRONG_TYPE
, ERROR_HEADER
);
201 Return_Value
= RETURN_FAIL
;
205 if (Return_Value
!= RETURN_FAIL
)
207 Result
= MatchFirst(File
, a
);
209 if (Result
== MATCHED_FILE
)
215 Return_Value
= SafeSetFileComment(a
, Comment
);
217 if (Quiet
== NOT_SET
)
219 PrintFileName(a
, TabValue
);
224 /* Allow a recursive scan.
227 if (a
->ap_Info
.fib_DirEntryType
> 0)
231 if (!(a
->ap_Flags
& APF_DIDDIR
))
233 a
->ap_Flags
|= APF_DODIR
;
235 Return_Value
= SafeSetFileComment(a
, Comment
);
237 if (Quiet
== NOT_SET
)
239 PrintFileName(a
, TabValue
);
247 a
->ap_Flags
&= ~APF_DIDDIR
;
253 Return_Value
= SafeSetFileComment(a
, Comment
);
255 if (Quiet
== NOT_SET
)
257 PrintFileName(a
, TabValue
);
264 ((Result
= MatchNext(a
)) == MATCHED_FILE
)
266 Return_Value
!= RETURN_FAIL
271 PrintFault(IoErr(), ERROR_HEADER
);
272 Return_Value
= RETURN_FAIL
;
279 return (Return_Value
);
284 void PrintFileName(struct AnchorPath
*a
, LONG t
)
289 args
[0] = (IPTR
)FilePart(&a
->ap_Buf
[0]);
290 args
[1] = (IPTR
)NULL
;
294 for (i
= 0; i
!= t
; i
++)
301 if (a
->ap_Info
.fib_DirEntryType
> 0)
303 VPrintf(" (dir)", NULL
);
306 VPrintf("...Done\n", NULL
);
308 } /* PrintFileName */
311 int SafeSetFileComment(struct AnchorPath
*a
, char *c
)
315 Return_Value
= RETURN_OK
;
317 if (!SetComment(a
->ap_Buf
, c
))
319 Return_Value
= RETURN_WARN
;
322 return(Return_Value
);
324 } /* SafeSetFileComment */