This is IndentController.m in view mode; [Download] [Up]
/* IndentController.m
* Copyright (C) 1994 Kurt Werle
* This is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, see the file COPYING.
*/
#import "IndentController.h"
@implementation IndentController
- setFileName:(char *)newFileName
{
myFileName = (char *)malloc (strlen (newFileName) + 1);
if (myFileName == NULL)
{
NXRunAlertPanel (NULL, "You're outta memory!!!\nAborting Program.", "OK", NULL, NULL);
exit (0);
}
strcpy (myFileName, newFileName);
return self;
}
- initValues
{
[BlankafterBlock setIntValue:0];
[BlankafterProcedure setIntValue:0];
[BlankbeforeBlock setIntValue:0];
[NewLineafterComma setIntValue:0];
[LineupCompound setIntValue:0];
[BlankLineComments setIntValue:1];
[NestleElses setIntValue:1];
[LeftJustifyDeclares setIntValue:0];
[MatchElsetoIf setIntValue:1];
[FormatCol1Comments setIntValue:1];
[IndentParameterDeclarations setIntValue:1];
[JustifyParenthesisSplit setIntValue:1];
[ConvertSymbols setIntValue:0];
[SpaceBeforeParens setIntValue:0];
[SpaceAroundPointers setIntValue:0];
[ProcedureNameCol1 setIntValue:1];
[LineComments setIntValue:1];
[DeleteExtraBlanks setIntValue:0];
[VerboseMode setIntValue:0];
[CommentCodeCol setIntValue:33];
[CommentDeclarationCol setIntValue:33];
[ContinuationIndent setIntValue:0];
[IndentCaseLabels setFloatValue:0.0];
[NegativeIndentComments setIntValue:0];
[IndentVariableDeclarations setIntValue:16];
[SpaceperIndent setIntValue:8];
[MaxLineLength setIntValue:78];
[MaxCommentLineLength setIntValue:78];
[TabStopWidth setIntValue:8];
return self;
}
- (const char *)OptionString
{
char allTypeDefText[2048];
/* So Now we get Ugly... */
[typedefText getSubstring:allTypeDefText start:0 length:[typedefText textLength] + 1];
sprintf (indentCodes, "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s -c%d -cd%d -ci%d -cli%f -d%d -di%d -i%d -l%d -lc%d -ts%d %s",
[BlankafterBlock intValue] ? "-bad" : "-nbad",
[BlankafterProcedure intValue] ? "-bap" : "-nbap",
[BlankbeforeBlock intValue] ? "-bbb" : "-nbbb",
[NewLineafterComma intValue] ? "-bc" : "-nbc",
[LineupCompound intValue] ? "-br" : "-bl",
[BlankLineComments intValue] ? "-cdb" : "-ncdb",
[NestleElses intValue] ? "-ce" : "-nce",
[LeftJustifyDeclares intValue] ? "-dj" : "-ndj",
[MatchElsetoIf intValue] ? "-ei" : "-nei",
[FormatCol1Comments intValue] ? "-fc1" : "-nfc1",
[IndentParameterDeclarations intValue] ? "-ip" : "-nip",
[JustifyParenthesisSplit intValue] ? "-lp" : "-nlp",
[ConvertSymbols intValue] ? "-osa" : "-nosa",
[SpaceBeforeParens intValue] ? "-pcs" : "-npcs",
[SpaceAroundPointers intValue] ? "-ps" : "-nps",
[ProcedureNameCol1 intValue] ? "-psl" : "-npsl",
[LineComments intValue] ? "-sc" : "-nsc",
[DeleteExtraBlanks intValue] ? "-sob" : "-nsob",
[VerboseMode intValue] ? "-v" : "-nv",
[CommentCodeCol intValue],
[CommentDeclarationCol intValue],
[ContinuationIndent intValue],
[IndentCaseLabels floatValue],
[NegativeIndentComments intValue],
[IndentVariableDeclarations intValue],
[SpaceperIndent intValue],
[MaxLineLength intValue],
[MaxCommentLineLength intValue],
[TabStopWidth intValue],
allTypeDefText
);
return indentCodes;
}
#define MAXTOKENLENGTH 80 /* If you have tokens over 80 chars */
#define FSCANF_FORMAT_STRING "%79s" /* You deserve what you get. */
- (void)parseIndentFile:(char *)indentFileName
{
char indentToken[MAXTOKENLENGTH], sometypedefText[MAXTOKENLENGTH];
FILE *indentFile;
int tempint;
float tempfloat;
indentFile = fopen (indentFileName, "rt");
[self setFileName:indentFileName];
strcpy (myFileName, indentFileName);
[typedefText selectAll:self];
[typedefText replaceSel:""];
while (fscanf (indentFile, FSCANF_FORMAT_STRING, indentToken) > 0)
{
/* We only need to test for the 'non-default' case */
if (strstr (indentToken, "-bad"))
[BlankafterBlock setIntValue:1];
if (strstr (indentToken, "-bap"))
[BlankafterProcedure setIntValue:1];
if (strstr (indentToken, "-bbb"))
[BlankbeforeBlock setIntValue:1];
if (strstr (indentToken, "-bc"))
[NewLineafterComma setIntValue:1];
if (strstr (indentToken, "-bl"))
[LineupCompound setIntValue:0];
if (strstr (indentToken, "-ncdb"))
[BlankLineComments setIntValue:0];
if (strstr (indentToken, "-nce"))
[NestleElses setIntValue:0];
if (strstr (indentToken, "-dj"))
[LeftJustifyDeclares setIntValue:1];
if (strstr (indentToken, "-nei"))
[MatchElsetoIf setIntValue:0];
if (strstr (indentToken, "-nfc1"))
[FormatCol1Comments setIntValue:0];
if (strstr (indentToken, "-nip"))
[IndentParameterDeclarations setIntValue:0];
if (strstr (indentToken, "-nlp"))
[JustifyParenthesisSplit setIntValue:0];
if (strstr (indentToken, "-osa"))
[ConvertSymbols setIntValue:1];
if (strstr (indentToken, "-pcs"))
[SpaceBeforeParens setIntValue:1];
if (strstr (indentToken, "-ps"))
[SpaceAroundPointers setIntValue:1];
if (strstr (indentToken, "-npsl"))
[ProcedureNameCol1 setIntValue:0];
if (strstr (indentToken, "-nsc"))
[LineComments setIntValue:0];
if (strstr (indentToken, "-sob"))
[DeleteExtraBlanks setIntValue:1];
if (strstr (indentToken, "-v"))
[VerboseMode setIntValue:1];
if (sscanf (indentToken, "-c%d", &tempint))
[CommentCodeCol setIntValue:tempint];
if (sscanf (indentToken, "-cd%d", &tempint))
[CommentDeclarationCol setIntValue:tempint];
if (sscanf (indentToken, "-ci%d", &tempint))
[ContinuationIndent setIntValue:tempint];
if (sscanf (indentToken, "-cli%f", &tempfloat))
[IndentCaseLabels setFloatValue:tempfloat];
if (sscanf (indentToken, "-d%d", &tempint))
[NegativeIndentComments setIntValue:tempint];
if (sscanf (indentToken, "-di%d", &tempint))
[IndentVariableDeclarations setIntValue:tempint];
if (sscanf (indentToken, "-i%d", &tempint))
[SpaceperIndent setIntValue:tempint];
if (sscanf (indentToken, "-l%d", &tempint))
[MaxLineLength setIntValue:tempint];
if (sscanf (indentToken, "-lc%d", &tempint))
[MaxCommentLineLength setIntValue:tempint];
if (sscanf (indentToken, "-ts%d", &tempint))
[TabStopWidth intValue];
if (sscanf (indentToken, "-T%s", sometypedefText))
{
[typedefText setSel:0 :0];
[typedefText replaceSel:" "];
[typedefText setSel:0 :0];
[typedefText replaceSel:indentToken];
}
}
}
- appDidInit:sender
{
[self setFileName:"./.indent.pro"];
myCodeBlock = NXOpenMemory (NULL, 0, NX_READWRITE);
[myCodeScrollView writeText:myCodeBlock];
NXSeek (myCodeBlock, 0, NX_FROMSTART);
myFileName = NULL;
return self;
}
- (BOOL)appAcceptsAnotherFile:sender
{
return YES;
}
- (int)app:sender openFile:(const char *)filename type:(const char *)aType;
{
[self parseIndentFile:filename];
return YES;
}
- loadInfo:sender
{
[NXApp loadNibSection:"info.nib" owner:self withNames:NO];
return self;
}
- NewFile:sender
{
[self initValues];
return self;
}
- LoadFile:sender
{
id myopenpanel;
const char *const types[2] = {"pro", NULL};
myopenpanel = [OpenPanel new];
[myopenpanel allowMultipleFiles:FALSE];
if (NX_OKTAG == [myopenpanel runModalForDirectory:"." file:".indent.pro" types:types])
{
[self initValues];
[self parseIndentFile:[myopenpanel filename]];
}
return self;
}
- ProcessCode:sender
{
char systemLine[2048];
NXStream *tempCodeFileStream;
int tempCodeFile;
/*
This is totally bogus. Why do I have to open this file TWICE?!? There
Should Be a command NXOpenMyDamnFile(const char *filename, int flags)!
*/
tempCodeFile = open (".indent.code.c", O_WRONLY | O_CREAT, 0777);
#ifdef DEBUG
if (tempCodeFile != -1)
printf ("opened %d\n", tempCodeFile);
else
perror ("bummer");
#endif
tempCodeFileStream = NXOpenFile (tempCodeFile, NX_WRITEONLY);
printf ("openedstream %p\n", tempCodeFileStream);
[myCodeScrollView writeText:tempCodeFileStream];
/*
And while I'm ranting, can I just get a copy of the Text text so I can
do my own fopen/fprintf?
*/
NXClose (tempCodeFileStream);
close (tempCodeFile);
sprintf (systemLine, "indent -npro %s .indent.code.c",[self OptionString]);
#ifdef DEBUG
printf ("%s\n", systemLine);
#endif
/*
I wanted to do this using a pipe, and avoid the whole temporary file
thing, but pipes look real ugly. Is there no easy way to say
'openmypipe (systemLine, &writefd, &readfd)?
*/
system (systemLine);
tempCodeFile = open (".indent.code.c", O_RDONLY, 777);
tempCodeFileStream = NXOpenFile (tempCodeFile, NX_READONLY);
[myCodeScrollView readText:tempCodeFileStream];
NXClose (tempCodeFileStream);
unlink (".indent.code.c");
unlink (".indent.code.c.BAK");
return self;
}
- ResetCode:sender
{
[myCodeScrollView readText:myCodeBlock];
NXSeek (myCodeBlock, 0, NX_FROMSTART);
return self;
}
- SaveFile:sender
{
FILE *mySaveFile;
if (myFileName == NULL)
{
myFileName = "./.indent.pro";
return[self SaveFileAs:self];
}
if (!access (myFileName, F_OK)) /* Rename the old file .BAK */
{
char *newFileName = (char *)malloc (strlen (myFileName) + 5);
if (newFileName == NULL)
{
NXRunAlertPanel (NULL, "You're outta memory!!!\nAborting Save.", "OK", NULL, NULL);
return self;
}
strcpy (newFileName, myFileName);
strcat (newFileName, ".BAK");
unlink (newFileName); /* Remove old .BAK file if it exists */
if (0 != rename (myFileName, newFileName))
{
if (NX_ALERTDEFAULT != NXRunAlertPanel (NULL, "Couldn't make backup.\nSave over file?", "OK", "Don't Hose me!", NULL))
{
free (newFileName);
return self;
}
}
free (newFileName);
}
mySaveFile = fopen (myFileName, "wt");
if (!mySaveFile)
{
NXRunAlertPanel (NULL, "Couldn't open save file.\nAborting Save?", "OK", NULL, NULL);
return self;
}
if (0 != fprintf (mySaveFile, "%s\n",[self OptionString]))
NXRunAlertPanel (NULL, "Save failed.\nCouldn't write to opened file.", "OK", NULL, NULL);
fclose (mySaveFile);
return self;
}
- SaveFileAs:sender
{
id mySavePanel;
char *saveFilePath, *saveFileName;
if (myFileName == NULL)
{
[self setFileName:"./.indent.pro"];
}
saveFilePath = (char *)malloc (strlen (myFileName) + 1);
if (saveFilePath == NULL)
{
NXRunAlertPanel (NULL, "You're outta memory!!!\nAborting Save.", "OK", NULL, NULL);
return self;
}
strcpy (saveFilePath, myFileName);
if (NULL == (saveFileName = strchr (saveFilePath, '/')))
{
saveFileName = saveFilePath;
}
else
{
*saveFileName = '\0';
saveFileName++;
}
mySavePanel = [SavePanel new];
if (NX_OKTAG == [mySavePanel runModalForDirectory:saveFilePath file:saveFileName])
{
[self setFileName:[mySavePanel filename]];
free (saveFilePath);
return[self SaveFile:self];
}
free (saveFilePath);
return self;
}
- free
{ /* I wonder why this is never called... */
if (myFileName != NULL)
{
free (myFileName);
}
NXCloseMemory (myCodeBlock, NX_TRUNCATEBUFFER);
return[super free];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.