This is ITextD.m in view mode; [Download] [Up]
/*$Copyright:
* Copyright (C) 1992.5.22. Recruit Co.,Ltd.
* Institute for Supercomputing Research
* All rights reserved.
* NewsBase by ISR, Kazuto MIYAI, Gary ARAKAKI, Katsunori SUZUKI, Kok-meng Lue
*
* You may freely copy, distribute and reuse the code in this program under
* following conditions.
* - to include this notice in the source code, if it is to be distributed
* with source code.
* - to add the file named "COPYING" within the code, which shall include
* GNU GENERAL PUBLIC LICENSE(*).
* - to display an acknowledgement in binary code as follows: "This product
* includes software developed by Recruit Co.,Ltd., ISR."
* - to display a notice which shall state that the users may freely copy,
* distribute and reuse the code in this program under GNU GENERAL PUBLIC
* LICENSE(*)
* - to indicate the way to access the copy of GNU GENERAL PUBLIC LICENSE(*)
*
* (*)GNU GENERAL PUBLIC LICENSE is stored in the file named COPYING
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
$*/
/* ITextD */
#import "ITextD.h"
#import <appkit/Application.h>
#import <appkit/Text.h>
#import <appkit/Panel.h>
#import <objc/hashtable.h>
#import <streams/streams.h>
#import <string.h>
#import <stdlib.h>
#import <libc.h>
#import <stdio.h>
#import <mach.h>
#import "errdebug.h"
#import "data_types.h"
#import "Localization.h"
#define LoStr(key) doLocalString(NULL,key,NULL)
#define EOF (-1)
#define DEF_BLK_SIZE 512
@implementation ITextD
static NXAtom fileExtension;
+ initialize
{
fileExtension = NXUniqueStringNoCopy("rtf");
return(self);
}
+ (NXAtom)rtfControlWord
{
return(NULL);
}
+ (NXAtom)fileExtension;
{
return(fileExtension);
}
+ (NXAtom)pasteboardType
{
return(NULL);
}
- init
{
[super init];
text = NULL;
return(self);
}
- free
{
vm_deallocate(task_self(), (vm_address_t)text, maxSize);
return([super free]);
}
//- kanjiCodeConvert:(char *)conv_option
//{
// NXStream *inStream, *outStream;
// int status;
// int kanjiconv (char *conv_option, NXStream *fin, NXStream *fout);
//
// inStream = NXOpenMemory(text, size, NX_READONLY);
// outStream = NXOpenMemory(NULL, 0, NX_READWRITE);
// if ((status = kanjiconv(conv_option, inStream, outStream)) != 0) {
// NXRunAlertPanel(LoStr("NewsBase"),
// LoStr("ERROR: ITextD: kanjiconv() abort %d\n"),
// NULL,NULL,NULL, status);
// NXCloseMemory(inStream, NX_SAVEBUFFER);
// NXCloseMemory(outStream, NX_FREEBUFFER);
// return(NULL);
// }
// NXCloseMemory(inStream, NX_SAVEBUFFER);
// vm_deallocate(task_self(), (vm_address_t)text, maxSize);
// NXGetMemoryBuffer(outStream, &text, &size, &maxSize);
// size = NXTell(outStream);
// NXCloseMemory(outStream, NX_SAVEBUFFER);
// return(self);
//}
//
- setTextData:(char *)data size:(int)length maxSize:(int)maxLength
{
if (text != NULL) {
vm_deallocate(task_self(), (vm_address_t)text, maxSize);
}
text = data;
size = length;
maxSize = maxLength;
return(self);
}
- (BOOL)readFromFile:(const char *)pathName
{
NXStream *tempStream;
if (text != NULL) {
vm_deallocate(task_self(), (vm_address_t)text, maxSize);
}
if ((tempStream = NXMapFile(pathName, NX_READONLY)) != NULL) {
NXGetMemoryBuffer(tempStream, &text, &size, &maxSize);
NXSeek(tempStream, 0, NX_FROMEND);
size = NXTell(tempStream);
NXCloseMemory(tempStream, NX_SAVEBUFFER);
return(YES);
} else {
return(NO);
}
}
- (BOOL)readFromStream:(NXStream *)stream
{
long start;
NXStream *tempStream;
char buffer[vm_page_size];
int nread;
if (text != NULL) {
vm_deallocate(task_self(), (vm_address_t)text, maxSize);
}
if (stream->flags & NX_CANSEEK) {
start = NXTell(stream);
NXSeek(stream, 0, NX_FROMEND);
size = NXTell(stream) - start;
NXSeek(stream, start, NX_FROMSTART);
if (vm_allocate(task_self(), (vm_address_t *)&text, size, TRUE)
== KERN_SUCCESS) {
NXRead(stream, text, size);
return(YES);
} else {
return(NO);
}
} else {
tempStream = NXOpenMemory(NULL, 0, NX_READWRITE);
while((nread = NXRead(stream, buffer, sizeof(buffer))) > 0) {
NXWrite(tempStream, buffer, nread);
}
NXGetMemoryBuffer(tempStream, &text, &size, &maxSize);
size = NXTell(tempStream);
NXCloseMemory(tempStream, NX_SAVEBUFFER);
return(YES);
}
}
- (void)writeToStream:(NXStream *)stream
{
const char *ptr, *textEnd;
textEnd = text + size;
for (ptr = text; ptr < textEnd; ++ptr) {
// if (*ptr != '\015') {
NXPutc(stream, *ptr);
// }
}
}
- (char *)textData
{
return text;
}
- writeRichTextStreamTo:textObj
{
NXStream *tempStream;
tempStream = NXOpenMemory(text, size, NX_READONLY);
[textObj readRichText:tempStream];
NXCloseMemory(tempStream, NX_SAVEBUFFER);
return(self);
}
- writeTextStreamTo:textObj
{
NXStream *tempStream;
tempStream = NXOpenMemory(text, size, NX_READONLY);
[textObj readText:tempStream];
NXCloseMemory(tempStream, NX_SAVEBUFFER);
return(self);
}
- (void)writeToTarStream:(NXStream *)stream
{
NXStream *tempStream;
int commandWithStreams(const char *, NXStream *, NXStream *);
tempStream = NXOpenMemory(text, size, NX_READONLY);
commandWithStreams("compress", tempStream, stream);
NXCloseMemory(tempStream, NX_SAVEBUFFER);
}
- (BOOL)readFromTarStream:(NXStream *)stream
{
NXStream *tempStream;
int commandWithStreams(const char *, NXStream *, NXStream *);
if (text != NULL) {
vm_deallocate(task_self(), (vm_address_t)text, maxSize);
}
tempStream = NXOpenMemory(NULL, 0, NX_READWRITE);
commandWithStreams("uncompress", stream, tempStream);
NXGetMemoryBuffer(tempStream, &text, &size, &maxSize);
size = NXTell(tempStream);
NXCloseMemory(tempStream, NX_SAVEBUFFER);
return(YES);
}
- (int)size
{
return size;
}
- (int)countLine
{
NXStream *textStream;
int count;
int ch;
count = 0;
textStream = NXOpenMemory(text, size, NX_READONLY);
NXSeek(textStream, 0, NX_FROMSTART);
while ((ch=NXGetc(textStream)) != EOF) {
if (ch=='\n') {
count++;
}
}
NXCloseMemory(textStream, NX_SAVEBUFFER);
return count;
}
- (int)width
{
int width;
if (sscanf(text, "{\\info{\\width %d}}", &width) == 1) {
return(width);
} else {
return(0);
}
}
@end
#undef __OBJC__
#include "errdebug.h"
//
// commandWithStreams() runs a command with stdin and stdout from NXStreams
//
int
commandWithStreams(command, inStream, outStream)
char *command;
NXStream *inStream;
NXStream *outStream;
{
int pipeIn[2];
int pipeOut[2];
int saveFd0;
int saveFd1;
int pid;
int noBytesReadInStream;
int noBytesReadFromCommand;
#define BUFFER_SIZE vm_page_size
unsigned char bufferOutToCommand[BUFFER_SIZE];
unsigned char bufferInFromCommand[BUFFER_SIZE];
// create two pipes, pipeIn and pipeOut, and 3 processes, X, Y and Z and connect as follows
// X > pipeIn[1] ==> 0 < Y > 1 ==> pipeOut[0] < Z
pipe(pipeIn);
pipe(pipeOut);
saveFd0 = dup(0);
saveFd1 = dup(1);
dup2(pipeIn[0], 0);
dup2(pipeOut[1], 1);
close(pipeIn[0]);
close(pipeOut[1]);
if ((pid = fork()) == -1) {
perror("tarSub: commandWithStreams: fork()");
return(-1);
} else if (pid > 0) {
close(pipeIn[1]);
if ((pid = vfork()) == -1) {
perror("tarSub: commandWithStreams: fork()");
return(-1);
} else if (pid > 0) {
// process Z: copies stdout of the command to outStream
close(0);
close(1);
while ((noBytesReadFromCommand = read(pipeOut[0], bufferInFromCommand,
sizeof(bufferInFromCommand))) > 0) {
NXWrite(outStream, bufferInFromCommand, noBytesReadFromCommand);
DBG(10, fprintf(stderr, "%d bytes read from command\n", noBytesReadFromCommand););
}
close(pipeOut[0]);
} else {
// process Y: executes the command
close(pipeOut[0]);
// {char buffer[8192]; write(1, buffer, read(0, buffer, sizeof(buffer)));}
_exit(system(command));
}
} else {
// process X: copies the inStream to stdin of command
close(0);
close(1);
close(pipeOut[0]);
while(NXAtEOS(inStream) == FALSE) {
noBytesReadInStream = NXRead(inStream, bufferOutToCommand,
sizeof(bufferOutToCommand));
write(pipeIn[1], bufferOutToCommand, noBytesReadInStream);
DBG(10, fprintf(stderr, "%d bytes written to command\n", noBytesReadInStream););
}
close(pipeIn[1]);
_exit(0);
}
dup2(saveFd0, 0);
dup2(saveFd1, 1);
close(saveFd0);
close(saveFd1);
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.