⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 files.c

📁 Source code for an Numeric Cmputer
💻 C
📖 第 1 页 / 共 2 页
字号:
		BufTimers->Preset / BufTimers->Base);	    BufTimers++;	    NumTimer++;	}	while (NumTimer < NBR_TIMERS);	fclose(File);	Okay = TRUE;    }    printf(" - result=%d\n", Okay);    return (Okay);}char LoadMonostablesParams(char *FileName, StrMonostable * BufMonostables){    FILE *File;    char Okay = FALSE;    char Line[300];    char *LineOk;    int Params[3];    File = fopen(FileName, "rt");    if (File) {	do {	    LineOk = fgets(Line, 300, File);	    if (LineOk) {		if (Line[0] != ';') {		    ConvRawLineOfNumbers(Line, 2, Params);		    switch (Params[0]) {		    case BASE_MINS:		    case BASE_SECS:		    case BASE_100MS:			BufMonostables->Base =			    CorresDatasForBase[Params[0]].ValueInMS;			BufMonostables->Preset =			    Params[1] * BufMonostables->Base;			strcpy(BufMonostables->DisplayFormat,			    CorresDatasForBase[Params[0]].DisplayFormat);			break;		    default:			BufMonostables->Base = 1;			BufMonostables->Preset = 10;			strcpy(BufMonostables->DisplayFormat, "%f?");			printf("!!! Error loading parameter base in %s\n",			    FileName);			break;		    }		    dbg_printf("Monostable => Base = %d , Preset = %d\n",			BufMonostables->Base, BufMonostables->Preset);		    BufMonostables++;		}	    }	}	while (LineOk);	fclose(File);	Okay = TRUE;    }    return (Okay);}char SaveMonostablesParams(char *FileName, StrMonostable * BufMonostables){    FILE *File;    char Okay = FALSE;    int NumMonostable = 0;    File = fopen(FileName, "wt");    if (File) {	fprintf(File, "; Monostables :\n");	fprintf(File, "; Base(see classicladder.h),Preset\n");	do {	    fprintf(File, "%d,%d\n",		ConvBaseInMilliSecsToId(BufMonostables->Base),		BufMonostables->Preset / BufMonostables->Base);	    BufMonostables++;	    NumMonostable++;	}	while (NumMonostable < NBR_MONOSTABLES);	fclose(File);	Okay = TRUE;    }    return (Okay);}char LoadArithmeticExpr(char *FileName){    FILE *File;    char Okay = FALSE;    char Line[300];    char *LineOk;    int NumExpr = 0;    File = fopen(FileName, "rt");    if (File) {	do {	    LineOk = fgets(Line, 300, File);	    if (LineOk) {		if (Line[0] != ';') {		    if (strlen(Line) > 0 && Line[strlen(Line) - 1] == '\n')			Line[strlen(Line) - 1] = '\0';		    if (strlen(Line) > 0 && Line[strlen(Line) - 1] == '\r')			Line[strlen(Line) - 1] = '\0';		    if (strlen(Line) > 0 && Line[strlen(Line) - 1] == '\r')			Line[strlen(Line) - 1] = '\0';		    strcpy(ArithmExpr[NumExpr].Expr, Line);		    NumExpr++;		}	    }	}	while (LineOk);	fclose(File);	Okay = TRUE;    }    return (Okay);}char SaveArithmeticExpr(char *FileName){    FILE *File;    char Okay = FALSE;    int NumExpr;    File = fopen(FileName, "wt");    if (File) {	fprintf(File, "; Arithmetic expressions :\n");	fprintf(File, "; Compare or Operate ones\n");	for (NumExpr = 0; NumExpr < NBR_ARITHM_EXPR; NumExpr++) {	    fprintf(File, "%s\n", ArithmExpr[NumExpr].Expr);	}	fclose(File);	Okay = TRUE;    }    return (Okay);}char LoadSectionsParams(char *FileName){    FILE *File;    char Okay = FALSE;    char Line[300];    char *LineOk;    int NumSection;    StrSection *pSection;    int Params[10];    File = fopen(FileName, "rt");    if (File) {	do {	    LineOk = fgets(Line, 300, File);	    if (LineOk) {		switch (Line[0]) {		case ';':		    break;		case '#':		    if (strncmp(&Line[1], "VER=", 4) == 0) {			if (atoi(&Line[5]) > 1) {			    printf				("Sections file version not supported...\n");			    LineOk = FALSE;			}		    }		    // #NAMExxx=....		    if (strncmp(&Line[1], "NAME", 4) == 0) {			char *Name;			Line[8] = '\0';			NumSection = atoi(&Line[5]);			strcpy(SectionArray[NumSection].Name, &Line[9]);			Name = SectionArray[NumSection].Name;			if (strlen(Name) > 0			    && Name[strlen(Name) - 1] == '\n')			    Name[strlen(Name) - 1] = '\0';			if (strlen(Name) > 0			    && Name[strlen(Name) - 1] == '\r')			    Name[strlen(Name) - 1] = '\0';			if (strlen(Name) > 0			    && Name[strlen(Name) - 1] == '\r')			    Name[strlen(Name) - 1] = '\0';		    }		    break;		default:		    ConvRawLineOfNumbers(Line, 6, Params);		    NumSection = Params[0];		    pSection = &SectionArray[NumSection];		    pSection->Used = TRUE;		    pSection->Language = Params[1];		    pSection->SubRoutineNumber = Params[2];		    pSection->FirstRung = Params[3];		    pSection->LastRung = Params[4];		    pSection->SequentialPage = Params[5];		    dbg_printf			("Section %d => Name=%s, Language=%d, SRnbr=%d, FirstRung=%d, LastRung=%d, SequentialPage=%d\n",			NumSection, pSection->Name, pSection->Language,			pSection->SubRoutineNumber, pSection->FirstRung,			pSection->LastRung, pSection->SequentialPage);		    break;		}	    }	}	while (LineOk);	fclose(File);	Okay = TRUE;    }    return (Okay);}char SaveSectionsParams(char *FileName){    FILE *File;    char Okay = FALSE;    int NumSection;    StrSection *pSection;    File = fopen(FileName, "wt");    if (File) {	fprintf(File, "; Sections\n");	fprintf(File, "#VER=1.0\n");	NumSection = 0;	do {	    pSection = &SectionArray[NumSection];	    if (pSection->Used)		fprintf(File, "#NAME%03d=%s\n", NumSection, pSection->Name);	    NumSection++;	}	while (NumSection < NBR_SECTIONS);	NumSection = 0;	do {	    pSection = &SectionArray[NumSection];	    if (pSection->Used)		fprintf(File, "%03d,%d,%d,%d,%d,%d\n", NumSection,		    pSection->Language, pSection->SubRoutineNumber,		    pSection->FirstRung, pSection->LastRung,		    pSection->SequentialPage);	    NumSection++;	}	while (NumSection < NBR_SECTIONS);	fclose(File);	Okay = TRUE;    }    return (Okay);}char InitTempDir(void){    // get a temp directory    char *TmpEnv = getenv("TMP") ?: "/tmp";    TmpEnv =     sprintf(TmpDirectory, "%s/classicladder_XXXXXX",	TmpEnv != NULL ? TmpEnv : "/tmp");    if(mkdtemp(TmpDirectory) == 0) return FALSE;;    return TRUE;}char LoadProjectFiles(char *FileProject){    char ProjectType = 0;        ProjectType = VerifyPath(FileProject);    if ( ProjectType == 1 ) {	// split files of the project in the temp directory	printf ("Loading a new style project (single file)\n");	InitTempDir();	SplitFiles(FileProject, TmpDirectory);	printf("Load datas in tmp dir=%s\n", TmpDirectory);	LoadAllLadderDatas(TmpDirectory);	CleanTmpDirectory(TmpDirectory, TRUE);	return TRUE;    }    if ( ProjectType == 2 ) {	/* old project, read directly from the directory selected... */	printf("Loading old style project (many files in a directory)!\n");	LoadAllLadderDatas(FileProject);	return TRUE;    }    printf ( "Project %s not found\n", FileProject );    return FALSE;}char SaveProjectFiles(char *FileProject){    char result;    InitTempDir();    printf("Save datas in tmp dir=%s\n", TmpDirectory);    SaveAllLadderDatas(TmpDirectory);    if (strcmp(&FileProject[strlen(FileProject) - 4], ".clp") != 0)	strcat(FileProject, ".clp");    // join files for the project in one file    result = JoinFiles(FileProject, TmpDirectory);    CleanTmpDirectory(TmpDirectory, TRUE);    return result;}/* clean the tmp directory of the parameters files */void CleanTmpDirectory(char *Directory, char DestroyDir){    DIR *pDir;    struct dirent *pEnt;    char Buff[400];    if (Directory[0] != '\0') {	pDir = opendir(Directory);	if (pDir) {	    while ((pEnt = readdir(pDir)) != NULL) {		if (strcmp(pEnt->d_name, ".") && strcmp(pEnt->d_name, "..")) {                    int result;		    sprintf(Buff, "%s/%s", Directory, pEnt->d_name);		    result = remove(Buff);                    if(result != 0) perror("remove");		}	    }	}	closedir(pDir);	/* delete the temp directory if wanted */	if (DestroyDir) {	    int result = rmdir(Directory);	// _rmdir() for Win32 ?            if(result != 0) perror("rmdir");        }    }}#define FILE_HEAD "_FILE-"#define STR_LEN_FILE_HEAD strlen(FILE_HEAD)// Join many parameters files in a project filechar JoinFiles(char *DirAndNameOfProject, char *TmpDirectoryFiles){    char ProjectFileOk = FALSE;    FILE *pProjectFile;    char Buff[300];    char BuffTemp[300];    DIR *pDir;    struct dirent *pEnt;    pProjectFile = fopen(DirAndNameOfProject, "wt");    if (pProjectFile) {	/* start line of project */	fputs("_FILES_CLASSICLADDER\n", pProjectFile);	/* read directory of the parameters files */	pDir = opendir(TmpDirectoryFiles);	if (pDir) {	    while ((pEnt = readdir(pDir)) != NULL) {		if (strcmp(pEnt->d_name, ".") && strcmp(pEnt->d_name, "..")) {		    FILE *pParametersFile;		    sprintf(Buff, "%s/%s", TmpDirectoryFiles, pEnt->d_name);		    pParametersFile = fopen(Buff, "rt");		    if (pParametersFile) {			sprintf(BuffTemp, FILE_HEAD "%s\n", pEnt->d_name);			fputs(BuffTemp, pProjectFile);			while (!feof(pParametersFile)) {			    char Buff[300];			    fgets(Buff, 300, pParametersFile);			    if (!feof(pParametersFile)) {				fputs(Buff, pProjectFile);			    }			}			fclose(pParametersFile);			sprintf(BuffTemp, "_/FILE-%s\n", pEnt->d_name);			fputs(BuffTemp, pProjectFile);		    }		}	    }	    closedir(pDir);	}	/* end line of project */	fputs("_/FILES_CLASSICLADDER\n", pProjectFile);	fclose(pProjectFile);	ProjectFileOk = TRUE;    }    return ProjectFileOk;}// Split a project file in many parameters fileschar SplitFiles(char *DirAndNameOfProject, char *TmpDirectoryFiles){    char ProjectFileOk = TRUE;    char Buff[300];    FILE *pProjectFile;    FILE *pParametersFile;    char ParametersFile[300];    strcpy(ParametersFile, "");    pProjectFile = fopen(DirAndNameOfProject, "rb");    if (pProjectFile) {	/* start line of project ? */	fgets(Buff, 300, pProjectFile);	if (strncmp(Buff, "_FILES_CLASSICLADDER",		strlen("_FILES_CLASSICLADDER")) == 0) {	    while (!feof(pProjectFile)) {		fgets(Buff, 300, pProjectFile);		if (!feof(pProjectFile)) {		    // header line for a file parameter ?		    if (strncmp(Buff, FILE_HEAD, STR_LEN_FILE_HEAD) == 0) {			sprintf(ParametersFile, "%s/%s", TmpDirectoryFiles,			    &Buff[STR_LEN_FILE_HEAD]);			ParametersFile[strlen(ParametersFile) - 1] = '\0';			if (ParametersFile[strlen(ParametersFile) - 1] ==			    '\r')			    ParametersFile[strlen(ParametersFile) - 1] = '\0';		    } else {			/* not end line of project ? */			if ((strncmp(Buff, "_/FILES_CLASSICLADDER",				    strlen("_/FILES_CLASSICLADDER")) != 0)			    && Buff[0] != '\n') {			    char cEndOfFile = FALSE;			    /* file parameter */			    pParametersFile = fopen(ParametersFile, "wt");			    if (pParametersFile) {				fputs(Buff, pParametersFile);				while (!feof(pProjectFile) && !cEndOfFile) {				    fgets(Buff, 300, pProjectFile);				    if (strncmp(Buff, "_/FILE-",					    strlen("_/FILE-")) != 0) {					if (!feof(pProjectFile))					    fputs(Buff, pParametersFile);				    } else {					cEndOfFile = TRUE;				    }				}				fclose(pParametersFile);			    }			}		    }		}	    }	} else {	    ProjectFileOk = FALSE;	}	fclose(pProjectFile);    } else {	ProjectFileOk = FALSE;    }    return ProjectFileOk;}void InitAllLadderDatas(void){    InitVars();    InitTimers();    InitMonostables();    InitArithmExpr();    InitRungs();    InitSections();#ifdef SEQUENTIAL_SUPPORT    InitSequential();#endif}#define CAR_SEP '/'int VerifyDirectorySelected(char *Directory, char *NewDir){    strcpy(Directory, NewDir);    if (strlen(Directory) > 1) {	if (strcmp(&NewDir[strlen(NewDir) - 4], ".clp") != 0) {	    // verify if path given is really a directory (not a file in it)	    DIR *pDir;	    pDir = opendir(Directory);	    if (pDir == NULL && errno == ENOTDIR) {		int Lgt = strlen(Directory);		char *End = &Directory[Lgt - 1];		do {		    End--;		}		while (*End != CAR_SEP && --Lgt > 0);		End++;		if (Lgt > 0) {		    *End = '\0';		} else {		    printf			("ERROR whith path directory given for project !!!\n");		    Directory[0] = '\0';		    return (0);		}	    } else {		if (Directory[strlen(Directory) - 1] != CAR_SEP)		    strcat(Directory, "/");	    }	}    }    printf("DIRECTORY = %s\n", Directory);    return (1);}int VerifyPath (char *Path){    struct stat stat_buf;    if ( stat(Path, &stat_buf) != 0 ) {	/* not found */	return 0;    }    if ( S_ISREG(stat_buf.st_mode) ) {	/* single file (new style) */	return 1;    }    if ( S_ISDIR(stat_buf.st_mode) ) {	/* directory with multiple files (old style) */	return 2;    }    /* something else, not good */    return 0;}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -