A command line-based text editor

xiaoxiao2021-03-06  18

Implement a command-based text editor

Function: 1. Open the file 2, save the file 3, can look for the file 4, able to replace 5, can be deleted on the file

/ * File: TextProc.h Compiler: DEV-C or TC2.0 (#define compiler_tc) define macros and tool functions * /

/ * Define results file name * / # define result_file_name "010588_Result.txt"

/ * Define debug flag * // * #define do_debug 1 * /

/ * Define Compiler Flag DEV-C or TC2.0 * // * #define compiler_tc 1 * /

/ * Define Error Code * / # define ERR_OPTR_UNKOWN -1 # define ERR_OPND_NOT_MATCH -2 / * #define ERR_DIR_FMT_INVALID -3 * / # define ERR_FILE_CANT_FOUND -4 # define ERR_FILE_CANT_OPEN -5 # define ERR_FILE_WRITE_ERROR -6 # define ERR_FILE_READ_ERROR -7 # define ERR_MEMORY_OVERFLOW - 8

/ * Define max value * / # define max_arg_num 5 # define max_cmd_len 1024 # define max_str_len 256

/ * Define for envType * / typedef struct {char exec expepath [MAX_STR_LEN 1]; char Curpath [MAX_STR_LEN 1]; int textlen; char * text; int Arllen; char * arr;} envType;

/ * DEFINE for FFBLK STRUCT for TC2.0 * / TypedEf struct {char ff_reserved [21]; / * dos reserved word * / char ff_attrib; / * file attrib * / int ft ftime; / * file time * / int FF_FDATE; / * File Date * / long ff_fsize; / * file size * / char ff_name [13]; / * file name * /} ffblk;

/ * Split filename, extract pathname * / int splitdir (char pathname [], char filename []) {INT i, flag = 1; if (filename [0]! = '//' && filename [1]! = ' : ') Flag = 0; for (i = strlen (filename) -1; I> = 0 && filename [i]! =' // '; i -); Pathname [i 1] =' / 0 ' WHILE (i> = 0) {pathname [i] = filename [i]; i--;} returnif;

/ * Dynamic Programming, Calc NextVal for Kmp * / Void getNextVal (int nextVal [], char t [= 0, j = -1; NextVal [0] = -1; while (i < T_LEN-1) {IF (j == - 1 || T [I] == T [j]) { i; J; if (t [i]! = T [j]) NextVal [i ] = J; Else NextVal [i] = nextVal [J];} else j = nextval [j];}} / * index substring (kmp) * / int indexkmp (char s, int S_len, char t [] , INT T_LEN, INT NEXTVAL [], INT POS) {INT i = POS, J = 0; While (i = t_len) Return I-T_LEN; else return -1;}

/ * Basic Operation: Mark Markarr Array, Using Kmp Index * / INT GETMARKARR (Int Markarr [], CHAR S [], INT S_LEN, CHAR T [], INT T_LEN) {INT I, RES, NEXTVAL [MAX_STR_LEN], MARKCNT = 0; getNextVal (NextVal, T, T_LEN); # ifdef do_debug printf ("NextVal_Debug_begin / nnextval: / n"); for (i = 0; i

/ * Basic Operation: Replace Substring * / Void ReplaceStr (char Arr [], char text [], int textlen, int markarr [], int lensrc, char strdest [], int lendest) {Int i = 0, j = 0 , K; WHILE (I

#include #include #include #include #include "textproc.h"

/ * Open file proc for cmd "-o" * / int openproc (envty * env, char filename []) {char pathname [max_str_len 1], TMP [MAX_STR_LEN 1]; # ifdef compiler_tc ffblk fileinfo; #ELSE STRUCT _finddata_t fileinfo; #ndif int filehandle; file * fp; if (! splitdir (pathname, filename)) {stratdir (TMP, ENV-> EXEPATH); STRCAT (TMP, PathName); STRCPY (Pathname, TMP); STRCPY (TMP , env-> exePath); strcat (tmp, fileName); strcpy (fileName, tmp); / * return ERR_DIR_FMT_INVALID; * /} #ifdef COMPILER_TC fileHandle = findfirst (fileName, & fileInfo); # else fileHandle = _findfirst (fileName, & fileInfo ); # endif if (fileHandle == -1) return ERR_FILE_CANT_FOUND; #ifndef COMPILER_TC _findclose (fileHandle); # endif fp = fopen (fileName, "rb"); if (fp == NULL) return ERR_FILE_CANT_OPEN; if (env- > text! = null) {free (env-> text); env-> text = null; env-> textlen = 0;}} (env-> arr! = null) {free (env-> arr); ENV -> arr = null; env-> arrlen = 0;} strcpy (env-> curpath, pathname); # ifdef compiler_tc env-> textlen = fileInfo.ff_fsize; #ELSE env-> textlen = fileinfo.size; #ENDIF ENV-> text = (char *) Malloc (Env-> Textlen * SizeOf (CHAR)); if (Env-> Text == Null) Return Err_Memory_Overflow; if ( Fread (env-> text, sizeof (char), env-> textlen, fp)! = env-> textlen) {fclose (fp); return err_file_read_error;} fclose (fp); return 0;}

/ * Save file proc for cmd "-s "* / int SaveProc (EnvType * ENV, Char filename []) {char Pathname [MAX_STR_LEN 1], TMP [MAX_STR_LEN 1]; file * fp; if (! Splitdir) Pathname, FileName)) {struct (TMP, ENV-> EXEPATH); STRCAT (TMP, PathName); STRCPY (Pathname, TMP); STRCPY (TMP, ENV-> EXEPATH); STRCAT (TMP, FileName); STRCPY (FileName , TMP); / * RETURN ERR_DIR_FMT_INVALID; * /} fp = fopen (filename, "wb"); if (fp == null) Return err_file_cant_open; if (env-> arr! = null) {free (env-> text ); Env-> text = env-> arr; env-> textlen = env-> arrlen; env-> arr = null; env-> arrlen = 0;} strcpy (env-> curpath, pathname); if (fwrite (Env-> text, sizeof (char), env-> textlen, fp)! = env-> textlen) {fclose (fp); return err_file_write_error;} fclose (fp); return 0;} / * Find Substring, for CMD "-f" * / int FindProc (EnvTyPe * ENV, Char strfind [], int Strlen) {INT I, MARKCNT, * MARKARR = (int *) malloc (env-> textlen * sizeof (int)); char filename [MAX_STR_LEN 1]; file * fp; if (Markarr == NULL) Return Err_Memory_Overflow; Markcn T = getMarkarr (Markarr, Env-> text, env-> textlen, strfind, strlen); Printf ("- f% d / n / n", markcnt); # ifdef do_debug printf ("markarr_debug_begin / nmarkarr: / n" ); For (i = 0; i textlen; i ) Printf ("% d", markarr [i]); printf ("/ nmarkarr_debug_end / n"); # endif stracpy (filename, env-> Curpath ); Strcat (filename, result_file_name); fp = fopen (filename, "ab"); if (fp == null) return err_file_cant_open; fprintf (fp, "-f% d / r / n / r / n", Markcnt Free (Markarr); Fclose (fp); Return 0;}

/ * Replace string and delete substring for cmd "-r" and "-d" * / int replaceproc (envty * env, char strsrc [], int lensrc, char strdest [], int lendest) {INT I, MARKCNT, * Malkarr = (int *) Malloc (int)); char filename [max_str_len 1]; file * fp; if (markarr == null) Return err_memory_overflow; markcnt = getMarkarr (Markarr, ENV-> Text, env-> textlen, strsrc, lensrc); if (lendest == 0) Printf ("- D% D / N / N", Markcnt); Else Printf ("- R% D / N / N", Markcnt ); # ifdef do_debug printf ("Markarr_Debug_begin / nmarkarr: / n"); for (i = 0; I textlen; i ) Printf ("% D", Markarr [I]); Printf ("/ nmarkarr_debug_end / N "); # Endif Strcpy (filename, env-> curpath); strcat (filename, result_file_name); fp = fopen (filename," ab "); if (fp == null) return err_file_cant_open; if (lendest == 0) FPRINTF (FP, "-d% D / R / N", Markcnt); Else Fprintf (FP, "-R% D / R / N", Markcnt); if (ENV-> Arr! = Null) { Free (env-> arr); env-> arr = null; env-> arrlen = 0;} ENV-> arrlen = env-> textlen markcnt * (lendest-lensrc); env-> arr = (char *) Malloc (ENV-> Arrlen * SizeOf (CHAR)); if (Env-> arr == null) Return Err_Memory_Overflow; ReplaceStr (Env-> Arr, Env-> Text, Env-> Textlen, Markarr, Lensrc, StRDEST , Lendest); Free (FWRITE (ENV-> Arr, Sizeof (Char), Env-> Arrlen, FP)! = env-> arrlen) {fclose (fp); return err_file_write_error;} fprintf (FP , "/ r / n / r / n"); fclose (fp); return 0;}

/ * Init workspace * / void init (envType * env) {getcwd (env-> execPath, max_str_len); strcat (env-> execPath, "//"); env-> Curpath [0] = '/ 0'; ENV-> text = env-> arr = null; env-> textlen = env-> arrlen = 0;} / * Clear Workspace * / void clear (envType * ENV) {if (env-> text! = null) { Free (env-> text); env-> text = null; env-> textlen = 0;} if (env-> arr! = null) {free (env-> arr); ENV-> arr = null; -> arrlen = 0;}}

/ * Read cmd line * / int tentcmd (int * argc, char argv []_str_len 1], int Argl []) {INT i; char line [max_cmd_len 1]; gets (line); * argc = 0 ; Argl [* argc] = 0; for (i = 0; line [i]! = '/ 0'; i ) {if (line [i] == '|| line [i] ==' / t ') {If (argl [* argc]> 0) {Argv [* argc] [argl [* argc]] =' / 0 '; (* argc) ; argl [* argc] = 0;}} else {Argv [* Argc] = line [i]; argl [* argc] ;}}}}} (argl [* argc]> 0) {Argv [* argc] [argl [* argc] ]] = '/ 0'; (* argc) ;} if (* argc == 1 && strcmp (argv [0], "-q") == 0) Return 0; Else Return 1;

/ * Display usage * / void displayusage () {printf ("cmd_format: optr [OPND1 [OPND2] / N"); Printf ("OPTR CMD_TYPE OPND_LIST / N); Printf (" -o open file. Opnd1 = filename / N "); Printf (" -h Help Info./N "); Printf (" -s save file. Opnd1 = filename / n "); Printf (" -f find substring. Opnd1 = StringTofind / N "); Printf ("-r Replace substring / n"); Printf ("OPND2 = Targetstring / N"); Printf ("-d delete substring. Opnd1 = StringTodeElete / N"); Printf ("-q quit. / N "); Printf (" "-e display env info (debug) ./ n");} / * Display env info for debug * / void displayenv (EnvType ENV) {INT i; printf ("env_debug_begin / nexepath =% S / N ", env.exepath; Printf (" curpath =% s / n ", env.curpath); Printf (" Textlen =% D, Text: / N ", env.textlen; printf (" - --------------- / n "); for (i = 0; i

}

/ * Display Error Info for Debug * / void DisplayError (int errCode) {switch (errCode) {case ERR_FILE_READ_ERROR: printf ( "ERR_FILE_READ_ERROR / n"); break; case ERR_FILE_WRITE_ERROR: printf ( "ERR_FILE_WRITE_ERROR"); break; / * case ERR_DIR_FMT_INVALID: printf ( "ERR_DIR_FMT_INVALID / n"); break; * / case ERR_FILE_CANT_FOUND: printf ( "ERR_FILE_CANT_FOUND / n"); break; case ERR_FILE_CANT_OPEN: printf ( "ERR_FILE_CANT_OPEN / n"); break; case ERR_MEMORY_OVERFLOW: printf ( "ERR_MEMORY_OVERFLOW / n "); break; case ERR_OPTR_UNKOWN: printf (" ERR_OPTR_UNKOWN / n "); break; case ERR_OPND_NOT_MATCH: printf (" ERR_OPND_NOT_MATCH / n "); break; default: printf (" ERR_UNKOWN / n ");}} / * Main function * / int main () {envType env; INT I, Argc, Argl [MAX_ARG_NUM 1], Errcode; char Argv [MAX_ARG_NUM 1] [MAX_STR_LEN 1];

INIT (& ENV); WHILE (READCMD (& Argc, Argv, Arg) {#ifdef do_debug printf ("arg_debug_begin / nargc =% d / n", argc); for (i = 0; I

#ENDIF IF (Errcode! = 0) DisplayError (Errcode);} clear (& env); return 0;}

转载请注明原文地址:https://www.9cbs.com/read-41457.html

New Post(0)