home *** CD-ROM | disk | FTP | other *** search
- /* ----------------------------------------------------- */
- /* MUMIC Version 1.0, der Mini Editor in C. */
- /* Ein multilinguales Experiment in drei Sprachen. */
- /* C-Version in Turbo C++ ab Version 1.0 */
- /* (c) 1991 toolbox & Ulrich Schmitz */
- /* ----------------------------------------------------- */
- #include<stdio.h>
- #include<conio.h>
- #include<alloc.h>
- #include<dos.h>
-
- /* -- KONSTANTEN --------------------------------------- */
- #define LIGHT_GRAY 7
- #define COLOR_SEG 0xB800
- #define MONO_SEG 0xB000
- #define TRUE 1
- #define FALSE 0
- #define MIN_ZEILEN 0
- #define MAX_ZEILEN 24
- #define MIN_SPALTEN 0
- #define MAX_SPALTEN 79
- #define TEXTSPEICHER 60000 /* Puffergröße */
- #define MAX_ZEICHEN 1920 /* 24 Zeilen x 80 Zeichen */
- #define MIN_ZEICHEN 1840 /* 23 Zeilen x 80 Zeichen */
- #define CR 256
-
- /* -- STRUKTUREN --------------------------------------- */
- typedef unsigned char byte;
-
- struct crtchar
- {
- char ch;
- byte at;
- };
-
- struct crtchar crtpage[25][80];
-
-
- /* -- TYPENDEKLARATTIONEN ------------------------------ */
- typedef struct crtchar SCREEN[25][80];
- typedef unsigned int word;
-
- /* -- PROTOTYPEN DER MULTILINGUALEN FUNKTIONEN --------- */
- word GetKey(void);
- void Scroll(int);
- void InsertLine(int Zeile);
- void DeleteLine(int Zeile);
- void ShowPosition(int Zeile, int Spalte);
- void ShowFilename(char* Filename);
- int LoadFile(char* Filename);
- int SaveFile(char* Filename);
- void QuitProgramm(void);
- void EditLine(int Zeilennr, int Position, char Zeichen);
-
-
- /* -- ALLGEMEINE PROTOTYPEN ---------------------------- */
- void scroll_up(void);
- void scroll_down(void);
- void video_init(void);
- int video_modus(void);
- void sondertasten(byte key);
- void init(void);
- void Scrolling(int);
- void select_file(void);
-
- /* -- GLOBALE VARIABLEN -------------------------------- */
- SCREEN far *screen;
- int zeile = 0, spalte = 0, abs_zeile = 0, abs_spalte = 0, ende_zeiger;
- byte Toggle_Insert = TRUE;
- char *text, *textstart, dokument[20];
-
-
- /* -- PROGRAMM ----------------------------------------- */
-
- void main(argc,argv)
- char **argv;
- int argc;
- {
- word taste;
- char *xtext[30];
- int i;
-
- init();
-
- //--------------- Datei einladen
-
- if (argc == 2) // Dateiname wurde als Parameter übergeben
- {
- strcpy(dokument, argv[1]);
- LoadFile(dokument);
- }
- else
- {
- strcpy( dokument,"NEU.DOC");
- }
-
- //--------------
- textbackground(LIGHTGRAY);
- textcolor(BLACK);
- gotoxy(MIN_SPALTEN + 1, MAX_ZEILEN + 1);
- strcpy(xtext," Datei: ");
- strncat(xtext, dokument, 20);
- cprintf(" Zeile:%03d Spalte:%03d /\\ F2-SPEICHERN F3-LADEN /\\ %21.21s ", abs_zeile + 1, spalte + 1, xtext);
- gotoxy(spalte + 1, zeile +1);
- textbackground(BLACK);
- textcolor(LIGHTGRAY);
-
- do
- {
- if (abs_zeile < 0)
- abs_zeile = 0;
-
- if (spalte < 0)
- spalte = 0;
-
- textbackground(LIGHTGRAY);
- textcolor(BLACK);
- gotoxy(MIN_SPALTEN + 1, MAX_ZEILEN + 1);
- cprintf(" Zeile:%03d Spalte:%03d ", abs_zeile + 1, spalte + 1);
- gotoxy(spalte + 1, zeile +1);
- if ( ende_zeiger <= abs_zeile )
- ende_zeiger = abs_zeile;
- textbackground(BLACK);
- textcolor(LIGHTGRAY);
-
- //------------------------------------------------------------
-
- taste = GetKey();
-
- switch ( taste )
- {
- case 0: /*--- Es wurde eine Steuersequenz aktiviert */
- sondertasten( GetKey() );
- break;
-
- case 8: /*--- Backspace */
- if ( spalte > 0 )
- {
- gotoxy(spalte, zeile + 1);
- (*screen)[zeile][spalte--].at = LIGHTGRAY;
- (*screen)[zeile][spalte].ch = 32;
- }
- break;
-
- case 13: /*--- Return ---> Zeilenende */
- if ( zeile < MAX_ZEILEN - 1)
- {
- gotoxy(1, zeile + 2);
- (*screen)[zeile][MAX_SPALTEN].at = LIGHTGRAY;
- (*screen)[zeile++][MAX_SPALTEN].ch = CR;
- spalte = 0;
- abs_zeile++;
- }
- else
- {
- Scroll(+1);
- gotoxy(1, zeile + 1);
- spalte = 0;
- }
- break;
-
- default: /*--- normale Tastatureingabe, OVERWRITE und INSERT */
- if (Toggle_Insert == FALSE)
- {
- gotoxy(spalte + 2, zeile + 1);
- (*screen)[zeile][spalte].at = LIGHTGRAY;
- (*screen)[zeile][spalte++].ch = taste;
- }
- else
- {
- for ( i = MAX_SPALTEN; i > spalte; i-- )
- {
- (*screen)[zeile][i].ch = (*screen)[zeile][i-1].ch;
- }
- (*screen)[zeile][spalte].at = LIGHTGRAY;
- (*screen)[zeile][spalte++].ch = taste;
- }
- break;
- }
- } while (taste != 0x1B); /* Ausstieg mit ESCAPE */
-
- QuitProgramm();
- }
-
-
- /* -- PROZEDUREN --------------------------------------- */
-
- word GetKey(void)
- {
- return(getch());
- }
-
- /* ----------------------------------------------------- */
- void select_file()
- {
- char *xtext[30];
-
- textbackground(LIGHTGRAY);
- textcolor(BLACK);
-
- gotoxy(MIN_SPALTEN + 1, MAX_ZEILEN + 1);
- cprintf(" ");
-
- gotoxy(MIN_SPALTEN + 1, MAX_ZEILEN + 1);
- cprintf(" Bitte geben Sie einen Dateinamen an: ");
- cscanf("%s", dokument);
-
- strcpy(xtext," Datei: ");
- strncat(xtext, dokument, 20);
- cprintf(" Zeile:%03d Spalte:%03d /\\ F2-SPEICHERN F3-LADEN /\\ %21.21s ", abs_zeile + 1, spalte + 1, xtext);
-
- getch();
-
- gotoxy(spalte + 1, zeile +1);
- textbackground(BLACK);
- textcolor(LIGHTGRAY);
- }
-
- /* ----------------------------------------------------- */
-
- int SaveFile(char* Filename)
- {
- int i, z;
- char c;
- FILE *datei;
- strcpy( Filename, Filename);
- datei = fopen ( Filename, "w"); /* im Textmode */
-
- /* Bildschirmspeicher mit in den Textpuffer sichern */
- /* 256 ist als CR-Kennung definiert */
-
- text = textstart;
-
- for (i=0; i <= (79 * MAX_ZEILEN); i++)
- {
- text[i] = (*screen)[MIN_ZEILEN][i].ch;
- }
-
- for ( z=0; z <= ende_zeiger; z++ )
- {
- for ( i=0; i <= 78; i++)
- {
- c = text[i+z*80];
- if ( !c )
- c = ' ';
- fputc( c, datei);
- }
- fputc( 13, datei ); // Carriage Return und
- fputc( 10, datei ); // Line Feed als Zeilenabschluß
- }
-
- fclose(datei);
- return(TRUE);
- }
-
- /* ----------------------------------------------------- */
-
- int LoadFile(char* Filename)
- {
- int i, z, zeile;
- char c;
- FILE *datei;
- strcpy( Filename, Filename);
- datei = fopen ( Filename, "r+t"); /* im Textmode */
-
- if (datei == NULL)
- fopen ( Filename, "w+t" ); /* Neue Datei öffnen */
-
- text = textstart;
-
-
- //-------- Bildschirm und Speicher füllen
-
- zeile = 0;
- c = ' ';
- while ( c != EOF )
- {
- i = -1;
-
- //------- Jeweils eine Zeile
- do {
- // Ausnahmegel: CR oder LF
- if ( c == 13 || c == 10)
- {
- for ( z = i; z < 80; z++)
- {
- c = ' ';
- text[(zeile * 80) + i++] = c;
- }
- }
- else
- {
- text[(zeile * 80) + i++] = c;
- c = fgetc(datei);
- }
- } while ( (c != EOF) && (i < 80) );
- //------- Zeile Ende
- zeile++;
- }
-
- gotoxy(1,1);
- printf("%s", text);
-
- //-------- Resttext in Puffer kopieren
- while ( c != EOF )
- {
- i = -1;
-
- //------- Jeweils eine Zeile
-
- do {
- // Ausnahmegel: CR oder LF
- if ( c == 13 || c == 10)
- {
- for ( z = i; z < 80; z++)
- {
- c = ' ';
- text[(zeile * 80) + i++] = c;
- }
- }
- else
- {
- text[(zeile * 80) + i++] = c;
- c = fgetc(datei);
- }
- } while ( (c != EOF) && (i < 80) );
-
- zeile++;
- }
-
- ende_zeiger = --zeile - 1;
-
- fclose(datei);
- return(TRUE);
- }
- /* ----------------------------------------------------- */
-
- void Scroll(int x)
- {
- int i;
-
- switch (x)
- {
- case 1:
- scroll_up();
- break;
-
- case 23:
- if (abs_zeile < ende_zeiger)
- {
- for (i = 1; i <= 23; i++)
- {
- if ( zeile < MAX_ZEILEN - 1)
- {
- gotoxy(spalte + 1, ++zeile +1);
- abs_zeile++;
- }
- else if ( zeile == MAX_ZEILEN - 1 )
- Scroll ( 1 );
- }
- }
- break;
-
- case 99:
- while (abs_zeile < ende_zeiger)
- {
- if ( zeile < MAX_ZEILEN - 1)
- {
- gotoxy(spalte + 1, ++zeile +1);
- abs_zeile++;
- }
- else if ( zeile == MAX_ZEILEN - 1 )
- Scroll ( 1 );
-
- gotoxy(MIN_SPALTEN + 1, MAX_ZEILEN + 1);
- cprintf(" Zeile:%03d Spalte:%03d ", abs_zeile + 1, spalte + 1);
- }
- break;
-
- case -1:
- scroll_down();
- break;
-
- case -23:
- for (i = 1; i <= 23; i++)
- {
- if ( zeile > MIN_ZEILEN )
- {
- gotoxy(spalte + 1, --zeile +1);
- abs_zeile--;
- }
- else if ( zeile == MIN_ZEILEN )
- Scroll ( -1 );
- }
- break;
-
- case -99:
- while ( abs_zeile )
- {
- if ( zeile > MIN_ZEILEN )
- {
- gotoxy(spalte + 1, --zeile +1);
- abs_zeile--;
- }
- else if ( zeile == MIN_ZEILEN )
- {
- gotoxy(MIN_SPALTEN + 1, MAX_ZEILEN + 1);
- cprintf(" Zeile:%03d Spalte:%03d ", abs_zeile + 1, spalte + 1);
- Scroll ( -1 );
- }
- }
-
-
- break;
-
- }
- }
- /* ----------------------------------------------------- */
-
- void QuitProgramm()
- {
- clrscr();
- _setcursortype(_NORMALCURSOR);
- exit(0);
- }
-
-
- /* ----------------------------------------------------- */
- int video_modus ()
- {
- union REGS regs;
- regs.h.ah = 0x0F;
- int86(0x10, ®s, ®s);
- return(regs.h.al);
- }
-
- /* ------------------------------------------------------ */
- void video_init ()
- {
- if (video_modus() == 7)
- {
- screen = MK_FP( MONO_SEG, 0 );
- }
- else
- {
- screen = MK_FP( COLOR_SEG, 0 );
- }
- }
- /* ----------------------------------------------------- */
-
- void init()
- {
- long i;
- textstart = malloc(TEXTSPEICHER);
-
- video_init();
-
- for (i = 0; i <= TEXTSPEICHER; i++)
- textstart[i] = 0;
-
- clrscr();
- }
-
-
- /* ----------------------------------------------------- */
-
- void scroll_up()
- {
- union REGS regs;
- int i;
- char far *copy_screen;
-
- // oberste Zeile retten!
-
- text = textstart + (abs_zeile - MAX_ZEILEN + 1) * 80;
-
- for (i=0; i <= 79; i++)
- {
- text[i] = (*screen)[MIN_ZEILEN][i].ch;
- }
-
- abs_zeile++;
- regs.h.ah = 0x06;
- regs.h.al = 1; /* Anzahl zu scrollender Zeilen */
- regs.h.ch = 0; /* obere linke Zeile */
- regs.h.cl = 0; /* obere linke Spalte */
- regs.h.dh = 23; /* untere rechte Zeile */
- regs.h.dl = 79; /* untere rechte Spalte */
- regs.h.bh = 7; /* Farbattribut für Leerzeilen */
- int86(0x10, ®s, ®s);
-
- // unterste Zeile schreiben!
-
- text = textstart + (abs_zeile) * 80;
-
- for (i=0; i <= 79; i++)
- {
- (*screen)[MAX_ZEILEN - 1][i].ch = text[i]; // OK
- }
- }
-
- /* ----------------------------------------------------- */
-
- void scroll_down()
- {
- union REGS regs;
- int i;
- char far *copy_screen;
-
- if (abs_zeile > 0) /* nach unten scrollen */
- {
- // unterste Zeile in Speicher retten
-
- text = textstart + (abs_zeile + MAX_ZEILEN - 1) * 80;
-
- for (i=0; i <= 79; i++)
- {
- text[i] = (*screen)[MAX_ZEILEN - 1][i].ch;
- }
-
- abs_zeile--;
- regs.h.ah = 0x07;
- regs.h.al = 1; /* Anzahl zu scrollender Zeilen */
- regs.h.ch = 0; /* obere linke Zeile */
- regs.h.cl = 0; /* obere linke Spalte */
- regs.h.dh = 23; /* untere rechte Zeile */
- regs.h.dl = 79; /* untere rechte Spalte */
- regs.h.bh = 7; /* Farbattribut für Leerzeilen */
- int86(0x10, ®s, ®s);
-
- // oberste Zeile aufbauen!
-
- text = textstart + (abs_zeile) * 80;
- for (i=0; i <= 79; i++)
- {
- (*screen)[MIN_ZEILEN][i].ch = text[i]; // OK
- }
- }
- }
-
- /* ----------------------------------------------------- */
-
-
- void sondertasten(byte key)
- {
- int i;
- switch ( key )
- {
-
- case 0x48: /*--- Cursor up */
- if ( zeile > MIN_ZEILEN )
- {
- gotoxy(spalte + 1, --zeile +1);
- abs_zeile--;
- }
- else if ( zeile == MIN_ZEILEN )
- Scroll ( -1 );
- break;
-
-
- case 0x50: /*--- Cursor down */
- if ( zeile < MAX_ZEILEN - 1)
- {
- gotoxy(spalte + 1, ++zeile +1);
- abs_zeile++;
- }
- else if ( zeile == MAX_ZEILEN - 1 )
- Scroll ( 1 );
- break;
-
-
- case 0x4D: /*--- Cursor right */
-
- if ( spalte < MAX_SPALTEN )
- gotoxy(spalte++ + 1, zeile +1);
-
- break;
-
-
- case 0x4B: /*--- Cursor left */
-
- if ( spalte > MIN_SPALTEN )
- gotoxy(spalte-- + 1, zeile +1);
-
- break;
-
- case 0x52: /*--- INSERT */
- if (Toggle_Insert)
- {
- Toggle_Insert = FALSE;
- _setcursortype(_SOLIDCURSOR);
- }
- else
- {
- Toggle_Insert = TRUE;
- _setcursortype(_NORMALCURSOR);
- }
- break;
-
- case 0x53: /*--- DELETE */
- for ( i = spalte + 1; i < MAX_SPALTEN; i++ )
- {
- (*screen)[zeile][i-1].ch = (*screen)[zeile][i].ch;
- }
- break;
-
- case 0x3B: /*--- F1 */
- break;
-
- case 0x3C: /*--- F2 */
- SaveFile(dokument);
- break;
-
- case 0x3D: /*--- F3 */
- select_file();
- LoadFile(dokument);
- break;
-
- case 0x47: /*--- POS1 */
- spalte = MIN_SPALTEN;
- gotoxy(spalte + 1, zeile +1);
- break;
-
- case 0x4F: /*--- END */
- break;
-
- case 0x49: /*--- Page up */
- Scroll(-23);
- break;
-
- case 0x51: /*--- Page down */
- Scroll(23);
- break;
-
- case 0x84: /*--- CTRL + Page up */
- Scroll(-99);
- break;
-
- case 0x76: /*--- CTRL + Page down */
- Scroll(99);
- break;
-
- default:
- break;
- }
-
- }
-
- /* ----------------------------------------------------- */
- /* - Ende von MUMIC.C */
-