This is main.m in view mode; [Download] [Up]
// Hey ! emacs, it is an -*- objective-c -*- file
/*
Webster Command line interface.
Copyright (C) 1994 BENOIT GRANGE.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "WebsterVolume.h"
#include "WebsterWord.h"
#include <defaults/defaults.h>
const char* pgmName;
#define DEFAULTSNAME "CommandLineWebster"
// List of defaults values
static NXDefaultsVector appDefaults = {
// Use library defaults
{"Codebook", "" },
// What do we do ?
{"SearchDictionary", "YES" },
{"SearchThesaurus", "YES" },
// Show ascii
{"Mode", "ascii" },
// Paths for the files
{"Webster-Dictionary",
"/NextLibrary/References/Webster-Dictionary/Dictionary" },
{"Webster-Thesaurus",
"/NextLibrary/References/Webster-Thesaurus/Thesaurus" },
// Remember if
{"NoticePrinted", "NO" },
{NULL}
};
void proceed(WebsterVolume* dico, WebsterVolume* thes,
const char **words, const char* mode, BOOL useReference)
{
WebsterWord* word;
NX_DURING
while (*words) {
BOOL found = NO;
if (useReference && [dico respondsTo: @selector(defineByReference:)])
word = [dico defineByReference: *words];
else
word = [dico defineWord: *words];
if (word) {
char* text;
int length;
found = YES;
if ([word outputDefinitionAs: mode result: &text length: &length]) {
printf("--- '%s' (%d definitions) :\n", *words, [word numberOfDefinitions]);
fwrite(text, length, 1, stdout);
vm_deallocate(task_self(), (vm_address_t)text, (vm_size_t)length);
} else printf("--- '%s' failed\n", *words);
[word free];
}
word = [thes defineWord: *words];
if (word) {
char* text;
int length;
found = YES;
if ([word outputDefinitionAs: mode result: &text length: &length]) {
printf("--- '%s' (%d definitions in thesaurus) :\n", *words, [word numberOfDefinitions]);
fwrite(text, length, 1, stdout);
vm_deallocate(task_self(), (vm_address_t)text, (vm_size_t)length);
} else printf("--- '%s' failed\n", *words);
[word free];
}
if (!found) printf("--- '%s' has no definition\n", *words);
words++;
}
return;
NX_HANDLER
NXReportError(&NXLocalHandler);
NX_ENDHANDLER
}
void printNotice()
{
fputs("Webster commandline interface version 1.0, "
"Copyright (C) 1994 BENOIT GRANGE.\n"
"This program is distributed under the GNU General Public License.\n"
"It comes with ABSOLUTELY NO WARRANTY, for details, use the -license option.\n", stderr);
fputs([WebsterVolume libraryCopyrightString], stderr);
fputs("\n", stderr);
fputs([WebsterVolume volumeCopyrightString], stderr);
}
void printLicense()
{
printNotice();
fputs(
" \n"
" This program is free software; you can redistribute it and/or\n"
" modify it under the terms of the GNU General Public License\n"
" as published by the Free Software Foundation; either version 2\n"
" of the License, or (at your option) any later version.\n"
" \n"
" This program is distributed in the hope that it will be useful,\n"
" but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
" GNU General Public License for more details.\n"
" \n"
" You should have received a copy of the GNU General Public License\n"
" along with this program; if not, write to the Free Software\n"
" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
"\n"
, stderr);
}
void printUsage()
{
printNotice();
fprintf(stderr, "Usage: %s [-license] [-d][-t][-r][-c] [words]\n", pgmName);
exit(-1);
}
#ifdef DEBUG
void ignore()
{
fputs("<CONTINUING>\n", stderr);
}
#endif
int main(int argc, const char** argv)
{
WebsterVolume* dictionary= NULL;
WebsterVolume* thesaurus = NULL;
BOOL useDictionary = YES;
BOOL useReference = NO;
BOOL useThesaurus = YES;
BOOL findCompletions = NO;
const char* mode;
#ifdef DEBUG
BOOL debug = NO;
#endif
pgmName = *argv++;
NXRegisterDefaults(DEFAULTSNAME, appDefaults);
if (!strcmp(NXGetDefaultValue(DEFAULTSNAME, "NoticePrinted"), "NO")) {
printNotice();
NXWriteDefault(DEFAULTSNAME, "NoticePrinted", "YES");
}
#ifdef DEBUG
if (*argv && !strcmp(*argv, "-debug")) {
debug = YES;
argv++;
}
#endif
if (*argv && !strcmp(*argv, "-license")) {
printLicense();
argv++;
}
if (!strcmp(NXGetDefaultValue(DEFAULTSNAME, "SearchDictionary"), "NO")) {
useDictionary = NO;
} else if (!strcmp(NXGetDefaultValue(DEFAULTSNAME, "SearchDictionary"), "YES")) {
useDictionary = YES;
} else {
fprintf(stderr, "%s: Warning: allowed values for default 'SearchDictionary' are 'YES' or 'NO'\n",
pgmName);
}
if (!strcmp(NXGetDefaultValue(DEFAULTSNAME, "SearchThesaurus"), "NO")) {
useThesaurus = NO;
} else if (!strcmp(NXGetDefaultValue(DEFAULTSNAME, "SearchThesaurus"), "YES")) {
useThesaurus = YES;
} else {
fprintf(stderr, "%s: Warning: allowed values for default 'SearchThesaurus' are 'YES' or 'NO'\n",
pgmName);
}
if (*argv && !strcmp(*argv, "-t")) {
useThesaurus = YES;
useDictionary = NO;
argv++;
}
if (*argv && !strcmp(*argv, "-d")) {
useThesaurus = NO;
useDictionary = YES;
argv++;
}
if (*argv && !strcmp(*argv, "-r")) {
useReference = YES;
argv++;
}
if (*argv && !strcmp(*argv, "-c")) {
findCompletions = YES;
argv++;
}
if (*argv && (**argv == '-')) printUsage();
// No need to do more
if (!*argv) exit(0);
#ifdef DEBUG
if (debug) {
signal(SIGINT, ignore);
fputs("<DEBUG PAUSE>\n", stderr);
pause();
}
#endif
/*
All main in encapsulated in an NX_DURGING/NX_HANDLER construct
because we are not using a standard event loop.
If we don't do this we get longjmp botchs when an error is raised.
*/
NX_DURING
if (strlen(NXGetDefaultValue(DEFAULTSNAME, "Codebook")))
[WebsterVolume setCodebookFileName: NXGetDefaultValue(DEFAULTSNAME, "Codebook")];
if (useDictionary)
dictionary = [[WebsterDictionary alloc]
initFromFile: NXGetDefaultValue(DEFAULTSNAME, "Webster-Dictionary") ];
if (useThesaurus)
thesaurus = [[WebsterThesaurus alloc]
initFromFile: NXGetDefaultValue(DEFAULTSNAME, "Webster-Thesaurus") ];
if (findCompletions) {
List* l = [dictionary completeWord: *argv];
int i = 0;
WebsterWord* w;
while (w = [l objectAt: i++]) {
printf("%s\n", [w word]);
}
[l freeObjects];
[l free];
} else {
mode = NXGetDefaultValue(DEFAULTSNAME, "Mode");
if ((dictionary && ![dictionary canOutputDefinitionsAs: mode]) ||
(thesaurus && ![thesaurus canOutputDefinitionsAs: mode]))
fprintf(stderr, "%s: translation of entry to mode '%s' is not possible\n",
pgmName, mode);
else
proceed(dictionary, thesaurus, argv, mode, useReference);
}
[dictionary free];
[thesaurus free];
#ifdef DEBUG
if (debug) {
fputs("<DEBUG PAUSE>\n", stderr);
pause();
}
#endif
return(0);
NX_HANDLER
NXReportError(&NXLocalHandler);
NX_ENDHANDLER
return(2);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.