This is 2rtf_main.c in view mode; [Download] [Up]
///* // main.c of // // 2rtf: a facility to convert files in the ATK file format to files compatible with the RTF format. // // Scribetext is copyright (c) 1989, 1990 by the Massachusetts Institute of // Technology. // // RTF is a product of the Microsoft Corporation. // // Permission to use, copy, modify, and distribute this software and // its documentation for any purpose and without fee is hereby granted, // provided that the above copyright notice and the name of the author(s) // appear in all copies; that both that copyright notice, the name of // the author(s) and this permission notice appear in supporting // documentation; and that the name of the Massachusetts Institute of // Technology not be used in advertising or publicity pertaining to // distribution of the software without specific, written prior // permission. The Massachusetts Institute of Technology makes no // representations about the suitability of this software for any purpose. // It is provided "as is" without express or implied warranty. // // 2rtf was written by Scott Rixner, rixner@ATHENA.MIT.EDU and Jeremy Paul Kirby, jpkirby@ATHENA.MIT.EDU // // $Header: /usr2/multimedia/RCS/MMEdit//2rtf_main.c,v 3.2 93/01/04 11:17:12 suzuki Exp $ //*/ // // #include <stdio.h> #include <sys/file.h> /* access() */ #include <sys/errno.h> #import <defaults/defaults.h> #include <strings.h> #include "2rtf.h" #import <streams/streams.h> #import "data_types.h" struct TableStruct *Table=NULL; struct ValuesStruct *Values=NULL; /* struct FileStackStruct *FileStack=NULL; */ struct IdStackStruct *IdStack=NULL; struct StyleStackStruct *Style=NULL; static char *launchDir = NULL; int ClaunchDirOk(); int NXRunAlertPanel(); char *doLocalString(); #define LoStr(key) doLocalString(NULL,key,NULL) #define fgetc(x) NXGetc(x) #define ungetc(x,y) NXUngetc(y) #define fputc(x,stream) NXPutc(stream,x) NXStream *ez2rtf(NXStream *stream) /* * * Handle command line arguments, and get pointers to the * appropriate files. Pass control on to ParseMain, * with the names of the input and output files as * arguments. * */ { char *GetInstruction(), *getenv(), path[1000]; int ExecuteSpecial(); int atoi(); void usage(), CloseFiles(), MakeTable(), TempPrintList(), ParseMain(), SetupEnvironment(), InitStateVector(), exit(); NXStream *outstream; /* Get date and time into char *datestamp as quick as posssible */ InitStateVector(); paragraph = 1; outstream = NXOpenMemory(NULL, 0, NX_READWRITE); fout = outstream; fin = stream; NXSeek(fin, (long)0, NX_FROMSTART); if ( !ClaunchDirOk()) { sprintf(path, "%s/2rtf.trans", launchDir); ftrans = NXMapFile(path ,NX_READONLY); if (!ftrans){ NXRunAlertPanel(LoStr("NewsBase"), LoStr("There is no translation table file."),LoStr("OK"),NULL,NULL); exit(1); } } // ftrans = NXMapFile("/usr2/suzuki/2rtf.trans" ,NX_READONLY); ferr = NXOpenMemory(NULL, 0, NX_READWRITE); MakeTable(); ParseMain(); NXCloseMemory(ferr, NX_FREEBUFFER); return(outstream); } NXStream *richtext2rtf(NXStream *stream) { char *GetInstruction(), *getenv(), path[1000]; int ExecuteSpecial(); void usage(), CloseFiles(), MakeTable(), TempPrintList(), richParseMain(), SetupEnvironment(), InitStateVector(), exit(); NXStream *outstream; /* Get date and time into char *datestamp as quick as posssible */ InitStateVector(); paragraph = 1; outstream = NXOpenMemory(NULL, 0, NX_READWRITE); fout = outstream; fin = stream; NXSeek(fin, (long)0, NX_FROMSTART); if ( !ClaunchDirOk()) { sprintf(path, "%s/rich2rtf.trans", launchDir); ftrans = NXMapFile(path ,NX_READONLY); if (!ftrans){ NXRunAlertPanel(LoStr("NewsBase"), LoStr("There is no translation table file."),LoStr("OK"),NULL,NULL); exit(1); } } ferr = NXOpenMemory(NULL, 0, NX_READWRITE); MakeTable(); richParseMain(); NXCloseMemory(ferr, NX_FREEBUFFER); return(outstream); } NXStream *plain2rtf(NXStream *stream) { char *GetInstruction(), *getenv(); int ExecuteSpecial(); void usage(), CloseFiles(), MakeTable(), TempPrintList(), plainParseMain(), SetupEnvironment(), InitStateVector(); NXStream *outstream; /* Get date and time into char *datestamp as quick as posssible */ InitStateVector(); paragraph = 1; outstream = NXOpenMemory(NULL, 0, NX_READWRITE); fout = outstream; fin = stream; NXSeek(fin, (long)0, NX_FROMSTART); ferr = NXOpenMemory(NULL, 0, NX_READWRITE); plainParseMain(); NXCloseMemory(ferr, NX_FREEBUFFER); return(outstream); } //static int ClaunchDirOk() int ClaunchDirOk() { const char *slash; if (launchDir) return(0); slash = strrchr(NXArgv[0], '/'); if (slash && slash-NXArgv[0]) { launchDir = malloc((slash-NXArgv[0]+1)*sizeof(char)); strncpy(launchDir, NXArgv[0], slash-NXArgv[0]); launchDir[slash-NXArgv[0]] = '\0'; return(0); } return(1); } void MakeTable() /* * * Create internal translation table by reading in ftrans. * */ { struct TableStruct *tmp; char ch, *ezword, rtfword[TMP_SIZE], *makelower(); extern FP AssignFunc(); int in, len, rv = 0, dsv=0 , atoi(), exit(); ezword = (char *) calloc(TMP_SIZE, sizeof(char)); // printf("* Creating internal translation table..."); while(1) { in = fgetc(ftrans); if(in==EOF) break; ch = (char) in; if(ch == '#' || ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') { while(ch != '\n' && ch != '\r') ch = (char) fgetc(ftrans); continue; } else ungetc(ch , ftrans); // if(fscanf(ftrans, "%s%s", ezword, rtfword)==EOF) if(NXScanf(ftrans, "%s%s", ezword, rtfword)==EOF) break; ezword = makelower(ezword); if(rtfword[0]=='~') { len = strlen(ezword) + 1; if(!strcmp(rtfword, "~RTFVersion")) { RTFVersion = atoi(ezword); rv = 1; } else if(!strcmp(rtfword, "~TextDSVersion")) { TextDSVersion = atoi(ezword); dsv = 1; } else { fprintf(stderr, "\n* Error!\n* %s: %s\n%s%s%s%s\n", me, "Corrupt translation table: Presence of invalid environment entry:", "Corrupt entry: \"", ezword, "\" --> ", rtfword); } } else { tmp = (struct TableStruct *) malloc (sizeof(struct TableStruct)); tmp->ezword = (char *) calloc (strlen(ezword) + 1, sizeof(char)); strcpy(tmp->ezword, ezword); tmp->mode = 0; if( (rtfword[0]=='@') || (rtfword[0]=='!') || (rtfword[0]=='#') || (rtfword[0]=='^')) { switch ((char) rtfword[0]) { case '@': tmp->mode=COMMAND | EZCOMMAND; break; case '!': tmp->mode=COMMAND | RTFCOMMAND; break; case '#': tmp->mode=COMMAND | EZCOMMAND | NAKED; break; case '^': tmp->mode=QUOTEDCHAR; } if(rtfword[0]=='^') tmp->rtf.quote = (char) atoi(&rtfword[1]); else tmp->rtf.fun = AssignFunc(&rtfword[1]); } else { tmp->mode = WORD; tmp->rtf.word = (char *) calloc(strlen(rtfword) + 1, sizeof(char)); strcpy(tmp->rtf.word, rtfword); } if(Table == NULL) { Table = tmp; Table->next = NULL; } else { tmp->next = Table; Table = tmp; } } } if(!rv || !dsv) { fprintf(stderr, "\n* Error!\n* %s: %s\n\t%s %s\n%s", me, "Fatal error in translation table: environment entry:", !rv ? "~RTFVersion" : "", !dsv ? "~TextDSVersion" : "", "weren't found and are necessary for operation."); exit(0); } NXCloseMemory(ftrans, NX_FREEBUFFER); } void SetupEnvironment(rootfile) char *rootfile; /* * * This adds a bunch of values. I'm not sure why, because * they never get used. * */ { void AddValue(); char *username, *wd, *getlogin(), *getwd(), *trimroot, *fullman; /* Go through all predefined string fields and define them and add them to the transtable */ /* Take care of device, devicename, filedate, fullmanuscript, genericdevice, manuscript, rootfiledate, site, sitename, time, timestamp, username, scribeversion and scribetextversion */ wd = (char *) malloc(1024 * sizeof(char)); trimroot = (char *) malloc(1024 * sizeof(char)); fullman = (char *) malloc(1024 * sizeof(char)); AddValue("device", "PostScript"); AddValue("devicename", "PostScript Page Description Language"); AddValue("genericdevice", "ScaleableLaser"); AddValue("scribeversion", VERSION); AddValue("scribetextversion", VERSION); AddValue("site", "MIT"); AddValue("sitename", "Project Athena"); /* and now for filedate, fullmanuscript, manuscript, rootfiledate, time, timestamp, and username */ username=getlogin(); wd = getwd(wd); // if(rootfile[0]=='/') // fullman = rootfile; // else // fullman = strcat(wd, rootfile); // // trimroot = &rootfile[roffset(rootfile, '/')]; AddValue("username", username); // AddValue("fullmanuscript", fullman); // AddValue("manuscript", trimroot); } void AddValue(name, value) char *name, *value; /* * * This adds a value to Values. * */ { struct ValuesStruct *tmp; tmp = (struct ValuesStruct *) malloc(sizeof(struct ValuesStruct)); tmp->name = (char *) calloc(strlen(name) + 1, sizeof(char)); tmp->name = name; if (value == NULL) { tmp->value = (char *) malloc (sizeof(char)); tmp->value[0] = '\0'; } else { tmp->value = (char *) calloc(strlen(value) + 1, sizeof(char)); tmp->value = value; } if(Values == NULL) { Values = tmp; Values->next = NULL; } else { tmp->next = Values; Values = tmp; } } void InitStateVector() /* * * This procedure initializes all the parts of the * state vector to their standard values. * */ { const char *fontNameAndSize; char fontName[128]; float fontSize; if ((fontNameAndSize = NXGetDefaultValue(OWNER, FONT)) != 0 ){ sscanf(fontNameAndSize, "%127[^:]:%f", fontName, &fontSize); } else { fontSize = 14.0; strcpy(fontName, "FixedRyuminCourier-Light"); } State.CurLeftMargin = 0; State.CurRightMargin = 0; State.CurRightEdge = 1140; State.CurLeftEdge = 1140; State.CurTopMargin = 0; State.CurBottomMargin = 0; State.CurScriptMovement = 0; // State.CurFontSize = 24; State.CurFontSize = 2*(int)fontSize; State.CurLeftIndentation = 0; State.CurRightIndentation = 0; State.CurJustification = style_LeftJustified; State.CurFontFamily = "andy"; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.