Use getopts for argument parsing
This commit is contained in:
parent
4d4e6bad78
commit
52908aef68
1
Makefile
1
Makefile
|
@ -32,6 +32,7 @@ SRCS = \
|
||||||
src/Channel.cpp, \
|
src/Channel.cpp, \
|
||||||
src/Item.cpp, \
|
src/Item.cpp, \
|
||||||
src/ProtocolListener.cpp, \
|
src/ProtocolListener.cpp, \
|
||||||
|
src/Config.cpp, \
|
||||||
src/webfetch.cpp, \
|
src/webfetch.cpp, \
|
||||||
src/parsing.cpp, \
|
src/parsing.cpp, \
|
||||||
src/Rifen.cpp
|
src/Rifen.cpp
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <raptor2/raptor2.h>
|
#include <raptor2/raptor2.h>
|
||||||
#include "Channel.h"
|
#include "Channel.h"
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
|
#include "Config.h"
|
||||||
#include "parsing.h"
|
#include "parsing.h"
|
||||||
|
|
||||||
Channel::Channel ( BString path, BString outputPath )
|
Channel::Channel ( BString path, BString outputPath )
|
||||||
|
@ -17,7 +18,7 @@ Channel::Channel ( BString path, BString outputPath )
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Channel::Parse ( )
|
Channel::Parse ( Config* cfg )
|
||||||
{
|
{
|
||||||
int itemCount = countItemParser( filePath.String() );
|
int itemCount = countItemParser( filePath.String() );
|
||||||
items = BList(itemCount);
|
items = BList(itemCount);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
#include <List.h>
|
#include <List.h>
|
||||||
#include <Url.h>
|
#include <Url.h>
|
||||||
|
#include "Config.h"
|
||||||
|
|
||||||
class Channel {
|
class Channel {
|
||||||
public:
|
public:
|
||||||
|
@ -25,7 +26,7 @@ public:
|
||||||
Channel ( BString, BString );
|
Channel ( BString, BString );
|
||||||
// Channel ( BEntry );
|
// Channel ( BEntry );
|
||||||
// Channel ( BUrl );
|
// Channel ( BUrl );
|
||||||
void Parse ( void );
|
void Parse ( Config* );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#include <String.h>
|
||||||
|
#include "Config.h"
|
||||||
|
|
||||||
|
Config::Config () {
|
||||||
|
verbose = false;
|
||||||
|
daemon = true;
|
||||||
|
mimetype = BString("text/xml");
|
||||||
|
outDir = BString("/boot/home/feeds/");
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include <StorageKit.h>
|
||||||
|
|
||||||
|
class Config {
|
||||||
|
public:
|
||||||
|
bool verbose;
|
||||||
|
bool daemon;
|
||||||
|
BString mimetype;
|
||||||
|
BString outDir;
|
||||||
|
BString targetFeed; // file or url
|
||||||
|
|
||||||
|
Config ( );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,26 +1,93 @@
|
||||||
#include <raptor2/raptor2.h>
|
#include <raptor2/raptor2.h>
|
||||||
#include <StorageKit.h>
|
#include <StorageKit.h>
|
||||||
|
#include <String.h>
|
||||||
|
#include <getopt.h>
|
||||||
#include "Channel.h"
|
#include "Channel.h"
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
#include "parsing.h" //
|
#include "parsing.h"
|
||||||
|
#include "Config.h"
|
||||||
|
#include "Rifen.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
usage ()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s", usageMsg.String());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
create_item ( void* item )
|
create_item ( void* item )
|
||||||
{
|
{
|
||||||
|
printf("hi");
|
||||||
Item* itemPtr = (Item*)item;
|
Item* itemPtr = (Item*)item;
|
||||||
itemPtr->Filetize( false );
|
itemPtr->Filetize( false );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
invocation ( int argc, char** argv, Config** cfgPtr )
|
||||||
|
{
|
||||||
|
Config* cfg = *(cfgPtr);
|
||||||
|
bool suicide = false;
|
||||||
|
static struct option sLongOptions[] = {
|
||||||
|
{ "help", no_argument, 0, 'h' },
|
||||||
|
{ "verbose", no_argument, 0, 'v' },
|
||||||
|
{ "output", required_argument, 0, 'O' },
|
||||||
|
{ "mimetype", required_argument, 0, 'm' },
|
||||||
|
{ "foreground", no_argument, 0, 'D' },
|
||||||
|
{ 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
opterr = 0;
|
||||||
|
int c = getopt_long(argc, argv, "+hvDm:O:", sLongOptions, NULL);
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case -1:
|
||||||
|
if ( optind < argc )
|
||||||
|
cfg->targetFeed = BString(argv[optind]);
|
||||||
|
return 0;
|
||||||
|
case 'h':
|
||||||
|
return usage();
|
||||||
|
case 'm':
|
||||||
|
cfg->mimetype = BString(optarg);
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
cfg->outDir = BString(optarg);
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
cfg->verbose = true;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
cfg->daemon = false;
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
if ( optopt == 'O' || optopt == 'm' )
|
||||||
|
fprintf( stderr, "Option `-%c` requires an argument.\n\n", optopt );
|
||||||
|
else
|
||||||
|
fprintf( stderr, "Unknown option `-%c`.\n\n", optopt );
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main ( int argc, char** argv )
|
main ( int argc, char** argv )
|
||||||
{
|
{
|
||||||
BString outputDir("/boot/home/feeds/");
|
//
|
||||||
Channel* chan = (Channel*)malloc( sizeof(Channel) );
|
//
|
||||||
|
Config* cfg = new Config;
|
||||||
|
usageMsg.ReplaceAll("%app%", "Rifen");
|
||||||
|
|
||||||
chan = new Channel(argv[1], outputDir);
|
invocation( argc, argv, &cfg );
|
||||||
chan->Parse();
|
|
||||||
|
Channel* chan = (Channel*)malloc( sizeof(Channel) );
|
||||||
|
chan = new Channel(cfg->targetFeed, cfg->outDir);
|
||||||
|
chan->Parse(cfg);
|
||||||
|
|
||||||
BList items = chan->items;
|
BList items = chan->items;
|
||||||
items.DoForEach(&create_item);
|
items.DoForEach(&create_item);
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
#include <StorageKit.h>
|
||||||
|
|
||||||
|
int main ( int, char** );
|
||||||
|
int invocation ( int, char**, Config** );
|
||||||
|
int usage ( );
|
||||||
|
bool create_item ( void* );
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
BString usageMsg =
|
||||||
|
"Usage: %app% [-hvD] [-m mimetype] [-tT datetime] [-O directory] \n"
|
||||||
|
" %app% [-hv] [-mtTO] ( <text/xml file> | <META:url file> | <url> )\n"
|
||||||
|
"\n"
|
||||||
|
"%app%, a RSS and Atom feed parser/daemon.\n"
|
||||||
|
"\n"
|
||||||
|
"Options:\n"
|
||||||
|
" -h, --help - Print this usage info.\n"
|
||||||
|
" -v, --verbose - Print verbose (debug) info.\n"
|
||||||
|
" -m, --mimetype - Mimetype of new item files. (Default: text/xml)\n"
|
||||||
|
" -O, --output - Output dir for item files. (Default: ~/feeds/)\n"
|
||||||
|
" -t, --before - Only return items published before this datetime.\n"
|
||||||
|
" -T, --after - Only return items published after this datetime.\n"
|
||||||
|
" -D, --foreground - Run in the foreground, do not daemonize.\n"
|
||||||
|
" Only applies when running without file/url arg.\n"
|
||||||
|
"\n"
|
||||||
|
"When invoked without a file or URL, will search for any new feed items\n"
|
||||||
|
"published since last check by by any 'feed file' placed in the config\n"
|
||||||
|
"directory (default: ~/config/settings/Rifen/feeds/) and create their\n"
|
||||||
|
"corresponding files.\n"
|
||||||
|
"\n"
|
||||||
|
"When invoked with a file or URL, will create files from items contained\n"
|
||||||
|
"within the given file or URL.\n"
|
||||||
|
"\n"
|
||||||
|
"'Feed files' are files with a 'META:url' attribute containing the\n"
|
||||||
|
"corresponding URL to the feed's XML.\n"
|
||||||
|
"\n"
|
||||||
|
"Both -t and -T use the ISO 8601 format for specifying datetimes:\n"
|
||||||
|
" YYYY-MM-DDTHH:MM:SS - 2020-01-01T07:07:07\n"
|
||||||
|
"You can leave out seconds, minutes, or hours, but YMD are required.\n"
|
||||||
|
;
|
||||||
|
|
|
@ -5,9 +5,6 @@
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
#include "parsing.h"
|
#include "parsing.h"
|
||||||
|
|
||||||
/* predicate == sweet http version of tag
|
|
||||||
subject == parent
|
|
||||||
object == data */
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// PARSERS
|
// PARSERS
|
||||||
|
|
Ŝarĝante…
Reference in New Issue