This is PfindApp.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "PfindApp.h"
#import <streams/streams.h>
#import <appkit/ScrollView.h>
#import <appkit/Text.h>
#import <appkit/Cursor.h>
#import <stdio.h>
#import <stdlib.h>
#import <appkit/Matrix.h>
#import <appkit/Form.h>
#import <appkit/OpenPanel.h>
#import <sys/param.h>
#import <string.h>
#import <appkit/defaults.h>
#import <sys/fcntl.h>
#import <text/text.h>
#import <libc.h>
#define MAXFILES 10
#define MAXCOMMANDSIZE 1000
#define Notify(title, msg) NXRunAlertPanel(title, msg, "OK", NULL, NULL)
const char *pfinddir = "/.pfind";
const char *inpfind = "/inpfind";
const char *outpfind = "/outpfind";
const char *temppfind = "/temppfind";
const char *databasesdir = "/databases";
char *homepath;
char command[MAXCOMMANDSIZE];
char currentdbpath[MAXPATHLEN+1];
char includedfilespath[MAXPATHLEN+1];
char pfindpath[MAXPATHLEN+1];
char inpfindpath[MAXPATHLEN+1];
char outpfindpath[MAXPATHLEN+1];
char temppfindpath[MAXPATHLEN+1];
char databasespath[MAXPATHLEN+1];
char currentdbnamepath[MAXPATHLEN+1];
id openpanel;
@implementation PfindApp
char fullpaths[MAXFILES][MAXPATHLEN+1]; /* Full pathnames of included files */
int numfiles;
long dbmodtime;
+ initialize
{
static NXDefaultsVector pfindDefaults = {
{"CurrentDb", NULL},
{ NULL}
};
NXRegisterDefaults("Pfind", pfindDefaults);
return self;
}
+ new
{
self = [super new];
currentdb = NULL;
searchdb = currentdb;
homepath = getenv("HOME");
strcpy(pfindpath, homepath);
strcat(pfindpath,pfinddir);
strcpy(inpfindpath,pfindpath);
strcat(inpfindpath, inpfind);
strcpy(outpfindpath,pfindpath);
strcat(outpfindpath,outpfind);
strcpy(temppfindpath, pfindpath);
strcat(temppfindpath, temppfind);
strcpy(databasespath,pfindpath);
strcat(databasespath, databasesdir);
sprintf(command, "mkdirs %s %s", pfindpath, databasespath);
system(command);
currentdb = NXGetDefaultValue("Pfind", "CurrentDb");
freopen("/dev/null", "w", stderr);
return self;
}
- run
{
[self setcurrentdb:self];
[[includedfilesview docView] setEditable:NO];
[super run];
return self;
}
- terminate:sender
{
sprintf(command, "rm -f -r %s %s %s %s", inpfindpath,outpfindpath,temppfindpath, temppfindpath);
strcat(command, ".ig");
system(command);
NXWriteDefault("Pfind", "CurrentDb", currentdb);
[super terminate:sender];
return self;
}
- setResultsview:anObject
{
resultsview = anObject;
return self;
}
- setIncludedfilesview:anObject
{
includedfilesview = anObject;
return self;
}
- setCurrentdbfield:anObject
{
currentdbfield = anObject;
return self;
}
- setOpenPanelAccessory:anObject
{
openPanelAccessory = anObject;
return self;
}
-setSearchdbmatrix:anObject
{
searchdbmatrix = anObject;
return self;
}
- setcurrentdb:sender
{
FILE *fd;
NXStream *s;
int i, fl;
char *p;
/* Get db name if not already given */
if ((sender != self) || !currentdb) {
openpanel = [OpenPanel new];
[openpanel allowMultipleFiles:NO];
[openpanel setAccessoryView:NULL];
if ([openpanel runModalForDirectory:databasespath file:NULL]) {
if (strcmp([openpanel directory],databasespath)) {
NXRunAlertPanel("Set Db", "Database must be chosen from directory %s",NULL,NULL,\
NULL, databasespath);
return self;
}
currentdb = [openpanel filenames][0];
}
}
[[includedfilesview docView] setText:NULL];
[[resultsview docView] setText:NULL];
[currentdbfield setStringValue:NULL];
sprintf(command,"rm -f -r %s",temppfindpath);
system(command);
[searchdbmatrix selectCellAt:0:0];
if (!currentdb) return self;
strcpy(currentdbpath,pfindpath);
strcat(currentdbpath, "/");
strcat(currentdbpath,currentdb);
if (!(fd =fopen(currentdbpath, "r"))) {
currentdb = NULL;
searchdb = NULL;
return self;
}
fclose(fd);
[currentdbfield setStringValue:currentdb];
searchdb = currentdbpath;
strcpy(includedfilespath,currentdbpath);
strcat(includedfilespath,".files");
if (!(s = NXMapFile(includedfilespath, NX_READONLY))) return self;
[[includedfilesview docView] readText:s];
NXClose(s);
/* Fill up fullpaths with contents of includedfiles */
fd = fopen(includedfilespath, "r");
i = 0;
while (fgets(fullpaths[i], MAXPATHLEN, fd)){
p = strchr(fullpaths[i], ' '); /* Strip space and lf */
*p = '\0';
i++;
}
numfiles = i;
fclose(fd);
/* Get last modification date of currentdb name */
strcpy(currentdbnamepath, databasespath);
strcat(currentdbnamepath, "/");
strcat(currentdbnamepath, currentdb);
fl = open(currentdbnamepath, O_RDONLY);
dbmodtime = fdWriteDate(fl);
close(fl);
return self;
}
- createdb:sender
{
const char * const *filenames;
const char *directory;
FILE *fd;
int i, nfiles;
openpanel = [OpenPanel new];
[openpanel allowMultipleFiles:YES];
[openpanel setAccessoryView:openPanelAccessory];
if (![openpanel runModal]) return self;
currentdb = [openPanelAccessory stringValueAt:0];
if (!currentdb || !(*currentdb)) {
if (NX_ALERTALTERNATE == NXRunAlertPanel("Createdb", \
"Database name field must be filled in", "OK", "Cancel", NULL))
return self;
else
return [self createdb:self];
}
[NXWait push];
directory = [openpanel directory];
filenames = [openpanel filenames];
/* Make full path names */
i = 0;
while (filenames && *filenames) {
strcpy(fullpaths[i], directory);
strcat (fullpaths[i],"/");
strcat (fullpaths[i],*filenames);
filenames++;
i++;
}
nfiles= i;
strcpy(currentdbpath,pfindpath);
strcat(currentdbpath, "/");
strcat(currentdbpath,currentdb);
/* Make currentdb be a link to first file */
sprintf(command, "ln -s %s %s", fullpaths[0],currentdbpath);
system(command);
/* Create index */
sprintf(command, "cd %s; indxbib %s",pfindpath, currentdb);
if (nfiles > 1)
for (i = 1; i <nfiles; i++) {
strcat(command, " ");
strcat(command, fullpaths[i]);
}
if( system(command)) {
Notify("Create", "Can't execute indxbib, check protection");
}
/* Store included files */
strcpy(includedfilespath,currentdbpath);
strcat(includedfilespath,".files");
fd = fopen(includedfilespath, "w");
for (i = 0; i<nfiles; i++) {
fprintf(fd, "%s \n", fullpaths[i]);
}
fclose(fd);
/* Place currentdb name in databases subdirectory */
sprintf(command, "cd %s; touch %s", databasespath, currentdb);
system(command);
/* Make new db be current one */
[self setcurrentdb:self];
[NXWait pop];
return self;
}
- deletedb:sender
{
if (!currentdb) return self;
if (NX_ALERTALTERNATE == NXRunAlertPanel("Delete", "Do you really want to delete %s?",\
"Yes", "No", NULL, currentdb)) return self;
sprintf(command, "rm -f -r %s %s", currentdbpath, currentdbpath);
strcat(command,".ia ");
strcat(command,currentdbpath);
strcat(command,".ib ");
strcat(command, currentdbpath);
strcat(command,".ic ");
strcat(command,currentdbpath);
strcat(command,".files ");
strcat(command,databasespath);
strcat(command,"/");
strcat(command,currentdb);
system(command);
currentdb = NULL;
searchdb=NULL;
[currentdbfield setStringValue:NULL];
[[includedfilesview docView] setText:NULL];
[[resultsview docView] setText:NULL];
return self;
}
- savelastsearch:sender
{
NXStream *s;
FILE *fd;
id savepanel;
const char *filename;
if (!searchdb) return self;
savepanel = [SavePanel new];
if (![savepanel runModal]) return self;
filename = [savepanel filename];
if (!(fd = fopen(filename, "w"))) return self;
fclose(fd);
sprintf(command, "touch %s", filename);
system(command);
if (!(s = NXMapFile(filename, NX_WRITEONLY))) return self;
[[resultsview docView] writeText:s];
NXSaveToFile(s, filename);
NXCloseMemory(s,NX_FREEBUFFER);
return self;
}
- setsearchdb:sender
{
FILE *fd;
if (!currentdb) return self;
switch ([sender selectedRow]) {
case 0:
searchdb = currentdbpath;
break;
case 1:
if(!(fd = fopen(temppfindpath, "r")))
[sender selectCellAt:0:0];
else {
fclose(fd);
searchdb = temppfindpath;
}
break;
default:
break;
}
return self;
}
- findparagraphs:sender
{
NXStream *s;
FILE *fd;
const char *str;
char filename[MAXPATHLEN+1];
int i, fl;
BOOL updated;
long mod;
if (!searchdb) return self;
/* Save results view to results file in case it has been edited */
if (!(fd = fopen(temppfindpath, "w"))) return self;
fclose(fd);
sprintf(command, "touch %s", temppfindpath);
system(command);
if (!(s = NXMapFile(temppfindpath, NX_WRITEONLY))) return self;
[[resultsview docView] writeText:s];
NXSaveToFile(s, temppfindpath);
NXCloseMemory(s,NX_FREEBUFFER);
/* Make sure included files have not been updated. If so, re-index */
updated = NO;
for (i = 0; i <numfiles; i++) {
strcpy(filename, fullpaths[i]);
fl = open(filename, O_RDONLY);
if (fl == -1) {
NXRunAlertPanel("Pfind", "%s cannot be opened", NULL, NULL, \
NULL, filename);
return self;
}
mod = fdWriteDate(fl);
if (mod > dbmodtime) updated = YES;
close(fl);
}
if (updated) {
[NXWait push];
sprintf(command, "cd %s; indxbib %s", pfindpath, currentdb);
if (numfiles > 1)
for (i=1; i < numfiles; i++) {
strcat(command, " ");
strcat(command, fullpaths[i]);
}
system(command);
sprintf(command, "touch %s", currentdbnamepath);
system(command);
[NXWait pop];
}
/* Setup input file */
str= [sender stringValueAt:0];
if(!(fd = fopen(searchdb, "r"))) return self;
fclose(fd);
if(!(fd = fopen(inpfindpath, "w"))) return self;
fprintf(fd, "%s \n",str);
fclose(fd);
/* Search using lookbib */
sprintf(command,"lookbib -n %s <%s >%s \n", searchdb, inpfindpath, outpfindpath);
if (system(command)) Notify("Find", "Can't access lookbib, check protection");
sprintf(command,"mv %s %s \n", outpfindpath, temppfindpath);
system(command);
/* Read results into results view */
if (!(s = NXMapFile(temppfindpath, NX_READONLY))) return self;
[[resultsview docView] readText:s];
NXClose(s);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.