📄 files.c
字号:
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 + -