ObjFW  Diff

Differences From Artifact [3a185096d3]:

To Artifact [2ed48001e4]:


27
28
29
30
31
32
33
34

35

36
37


38













39

40
41
42
43
44
45
46
47
48
49
50

51
52
53
54
55
56



57
58
59
60



61
62
63
64
65
66
67
68
69
70

71
72
73
74
75
76

77
78
79

80
81
82
83
84
85
86
87
88
89
90
91
92

93
94
95
96
27
28
29
30
31
32
33

34
35
36


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

91
92
93
94
95
96

97
98
99

100
101
102
103
104
105
106
107
108
109
110
111
112

113
114
115
116
117







-
+

+
-
-
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
-
+











+






+
+
+




+
+
+









-
+





-
+


-
+












-
+





extern void newApp(OFString *);
extern void newClass(OFString *, OFString *, OFMutableArray *);

OF_APPLICATION_DELEGATE(ObjFWNew)

static void
showUsage(void)
help(OFStream *stream, bool full, int status)
{
	[stream writeFormat:
	[OFStdErr writeFormat: @"Usage: %@ --app|--class name\n",
			       [OFApplication programName]];
	    @"Usage: %@ --app|--class [--superclass=] [--property=] name\n",
	    [OFApplication programName]];

	if (full) {
		[stream writeString: @"\n"];
		[stream writeLine:
		    @"Options:\n"
		    @"    --app          Create a new app\n"
		    @"    --class        Create a new class\n"
		    @"    --help         Show this help\n"
		    @"    --superclass=  Specify the superclass for the class\n"
		    @"    --property=    Add a property to the class.\n"
		    @"                   E.g.: --property='(readonly, "
		    @"nonatomic) id foo'"];
	}

	[OFApplication terminateWithStatus: 1];
	[OFApplication terminateWithStatus: status];
}

@implementation ObjFWNew
- (void)applicationDidFinishLaunching: (OFNotification *)notification
{
	bool app, class;
	OFString *superclass = nil, *name;
	OFMutableArray OF_GENERIC(OFString *) *properties = nil;
	const OFOptionsParserOption options[] = {
		{ 'a', @"app", 0, &app, NULL },
		{ 'c', @"class", 0, &class, NULL },
		{ 'h', @"help", 0, NULL, NULL },
		{ 's', @"superclass", 1, NULL, &superclass },
		{ 'p', @"property", 1, NULL, NULL },
		{ '\0', nil, 0, NULL, NULL }
	};
	OFOptionsParser *optionsParser;
	OFUnichar option;

	if ([OFApplication arguments].count == 0)
		help(OFStdErr, true, 1);

	optionsParser = [OFOptionsParser parserWithOptions: options];
	while ((option = [optionsParser nextOption]) != '\0') {
		switch (option) {
		case 'h':
			help(OFStdOut, true, 0);
			break;
		case 'p':
			if (properties == nil)
				properties = [OFMutableArray array];

			[properties addObject: optionsParser.argument];
			break;
		case '?':
		case ':':
		case '=':
			showUsage();
			help(OFStdErr, false, 1);
			break;
		}
	}

	if ((app ^ class) != 1 || optionsParser.remainingArguments.count != 1)
		showUsage();
		help(OFStdErr, false, 1);

	if ((superclass && !class)  || (properties != nil && !class))
		showUsage();
		help(OFStdErr, false, 1);

	name = optionsParser.remainingArguments.firstObject;
	if ([name rangeOfString: @"."].location != OFNotFound) {
		[OFStdErr writeLine: @"Name must not contain dots!"];
		[OFApplication terminate];
	}

	if (app)
		newApp(name);
	else if (class)
		newClass(name, superclass, properties);
	else
		showUsage();
		help(OFStdErr, false, 1);

	[OFApplication terminate];
}
@end