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
/ * 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 / * 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 / * 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 / * 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;}