-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.m
197 lines (153 loc) · 8.16 KB
/
main.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
// main.m
//
// Created by Damien Clauzel on 21/06/13.
// GPLv3, Damien Clauzel
//
#import <Foundation/Foundation.h>
#import "externals/GBCli/GBCli/GBSettings+Application.h"
#import "externals/GBCli/GBCli/src/GBCommandLineParser.h"
#import "externals/GBCli/GBCli/src/GBOptionsHelper.h"
void registerOptions(GBOptionsHelper *options) {
GBOptionDefinition definitions[] = {
{'h', GBSettingKeys.printHelp, @"Affiche cette aide et termine", GBValueNone|GBOptionNoPrint},
{'V', GBSettingKeys.printVersion, @"Affiche la version et termine", GBValueNone|GBOptionNoPrint},
{ 0, nil, nil, 0 }
};
[options registerOptionsFromDefinitions:definitions];
}
#import "fonctions.h"
int main(int argc, char **argv) {
@autoreleasepool {
/*
* initialisation des paramètres d'appel de la commande
* Tout cela est mouliné par GBCli.
* Code repris de l'exemple de GBCli.
*/
// Chargement des paramètres : défaut → fichier de configuration → arguments de la commande
GBSettings *factoryDefaults = [GBSettings mySettingsWithName:@"Factory" parent:nil];
GBSettings *fileSettings = [GBSettings mySettingsWithName:@"File" parent:factoryDefaults];
GBSettings *settings = [GBSettings mySettingsWithName:@"CmdLine" parent:fileSettings];
[factoryDefaults applyFactoryDefaults];
// Initialize options helper class and prepare injection strings.
GBOptionsHelper *options = [[GBOptionsHelper alloc] init];
options.applicationVersion = ^{ return @"1.0"; };
options.applicationBuild = ^{ return @"1"; };
options.printHelpHeader = ^{ return @"Usage %APPNAME [OPTIONS] <arguments séparé par des espaces>"; };
options.printHelpFooter = ^{ return @"\nLes arguments ne prenant pas de paramètres peuvent être niés avec le préfix --no-<name> ou --<name>=0"; };
registerOptions(options);
// Initialize command line parser and register it with all options from helper. Then parse command line.
GBCommandLineParser *parser = [[GBCommandLineParser alloc] init];
// Create parser and register all options.
[options registerOption:'s' long:@"souligne" description:@"souligne le texte" flags:GBValueNone];
[options registerOption:'S' long:@"souligne-double" description:@"double souligne le texte" flags:GBValueNone];
[options registerOption:'v' long:@"souligne-vague" description:@"souligne le texte avec une vague" flags:GBValueNone];
[options registerOption:'u' long:@"surligne" description:@"surligne le texte" flags:GBValueNone];
[options registerOption:'U' long:@"surligne-double" description:@"double surligne le texte" flags:GBValueNone];
[options registerOption:'b' long:@"barre" description:@"barre le texte" flags:GBValueNone];
[options registerOption:'B' long:@"barre-long" description:@"barre longuement le texte" flags:GBValueNone];
[options registerOption:'i' long:@"italique" description:@"transforme le texte en italique (pour les caractères possibles)" flags:GBValueNone];
[options registerOption:'m' long:@"indice" description:@"transforme le texte en indice (pour les caractères possibles)" flags:GBValueNone];
[options registerOption:'M' long:@"exposant" description:@"transforme le texte en exposant (pour les caractères possibles)" flags:GBValueNone];
[options registerOption:'c' long:@"code" description:@"applique le modificateur désigné par son code UNICODE" flags:GBValueRequired];
[options registerOptionsToCommandLineParser:parser];
__block BOOL commandLineValid = YES;
[parser parseOptionsWithArguments:argv count:argc block:^(GBParseFlags flags, NSString *option, id value, BOOL *stop) {
switch (flags) {
case GBParseFlagUnknownOption:
[[[@"Option " stringByAppendingString:option]
stringByAppendingString:@" inconnue, utilisez --help pour obtenir l’aide\n"]
NSPrint];
commandLineValid = NO;
break;
case GBParseFlagMissingValue:
[[[@"Valeur manquante pour l’option " stringByAppendingString:option]
stringByAppendingString:@", utilisez --help pour obtenir l’aide\n"]
NSPrint];
commandLineValid = NO;
break;
case GBParseFlagArgument:
[settings addArgument:value];
break;
case GBParseFlagOption:
[settings setObject:value forKey:option];
break;
}
}];
if (!commandLineValid)
return EXIT_FAILURE;
// Print help or version if instructed - print help if there's no cmd line argument also...
if (settings.printHelp || argc == 1) {
[options printHelp];
return EXIT_SUCCESS;
}
if (settings.printVersion) {
[options printVersion];
return EXIT_SUCCESS;
}
/*
* Récupération des actions demandées par l'utilisateur
*/
id actionSouligne = [parser valueForOption:@"souligne"];
id actionSouligneDouble = [parser valueForOption:@"souligne-double"];
id actionSouligneVague = [parser valueForOption:@"souligne-vague"];
id actionSurligne = [parser valueForOption:@"surligne"];
id actionSurligneDouble = [parser valueForOption:@"surligne-double"];
id actionBarre = [parser valueForOption:@"barre"];
id actionBarreLong = [parser valueForOption:@"barre-long"];
id actionItalique = [parser valueForOption:@"italique"];
id actionIndice = [parser valueForOption:@"indice"];
id actionExposant = [parser valueForOption:@"exposant"];
id actionModifieAvecCode = [parser valueForOption:@"code"];
NSString *texteSource = @""; // texte récupéré de l'utilisateur
NSString *texteSortie = @""; // texte traité
// Récupération de ce qui entre par le pipe
NSFileHandle *fhMonPipe = [NSFileHandle fileHandleWithStandardInput];
NSData *donneesDuPipe = [NSData dataWithData:[fhMonPipe readDataToEndOfFile]];
NSString *texteDepuisDonneesDuPipe = [[NSString alloc] initWithData:donneesDuPipe encoding:NSUTF8StringEncoding];
texteSource = [texteSource stringByAppendingString: texteDepuisDonneesDuPipe];
/*
Moulinage du texte pour connaître le nombre de caractère.
Le problème est qu'en unicode, des signes — comme les emojis — occupent plusieurs octets;
donc pas le choix, il faut éplucher les caractères 1 par 1.
*/
__block int texteSourceTaille = 0;
[texteSource enumerateSubstringsInRange:NSMakeRange(0, [texteSource length]-1)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
texteSourceTaille++;
}];
/*
Moulinage du texte pour le traiter caractère par caractère.
*/
for(int i=0; i<texteSourceTaille; i++) {
// extraction du caractère courant
NSString *tmpCaractere = [texteSource substringWithRange: [texteSource rangeOfUTFCodePoint:i] ];
// application de chaque modificateur demandé
if(actionSouligne)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeSouligne] ];
if(actionSouligneDouble)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeSouligneDouble] ];
if(actionSouligneVague)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeSouligneVague] ];
if(actionSurligne)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeSurligne] ];
if(actionSurligneDouble)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeSurligneDouble] ];
if(actionBarre)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeBarre] ];
if(actionBarreLong)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeBarreLong] ];
if(actionItalique)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeItalique] ];
if(actionIndice)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeIndice] ];
if(actionExposant)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeExposant] ];
if(actionModifieAvecCode)
texteSortie = [texteSortie stringByAppendingString: [tmpCaractere transformeCode:(NSString*)actionModifieAvecCode] ];
}
// affichage de la chaîne modifiée
[texteSortie writeToFile:@"/dev/stdout" atomically:NO encoding:NSUTF8StringEncoding error:NULL];
return EXIT_SUCCESS;
} // fin @autoreleasepool
}