Mercurial > repos > clustalomega > clustalomega
comparison clustalomega/clustal-omega-1.0.2/src/clustal/progress.c @ 1:bc707542e5de
Uploaded
author | clustalomega |
---|---|
date | Thu, 21 Jul 2011 13:35:08 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:ff1768533a07 | 1:bc707542e5de |
---|---|
1 /* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ | |
2 | |
3 /********************************************************************* | |
4 * Clustal Omega - Multiple sequence alignment | |
5 * | |
6 * Copyright (C) 2010 University College Dublin | |
7 * | |
8 * Clustal-Omega is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU General Public License as | |
10 * published by the Free Software Foundation; either version 2 of the | |
11 * License, or (at your option) any later version. | |
12 * | |
13 * This file is part of Clustal-Omega. | |
14 * | |
15 ********************************************************************/ | |
16 | |
17 /* | |
18 * RCS $Id: progress.c 230 2011-04-09 15:37:50Z andreas $ | |
19 */ | |
20 | |
21 #ifdef HAVE_CONFIG_H | |
22 #include "config.h" | |
23 #endif | |
24 | |
25 #include <stdlib.h> | |
26 #include <stdio.h> | |
27 #include <assert.h> | |
28 | |
29 #include "util.h" | |
30 #include "log.h" | |
31 #include "progress.h" | |
32 | |
33 #define LOGLEVEL_THRESHOLD LOG_INFO | |
34 | |
35 /** | |
36 * @brief Allocates a new progress structure and initialises its members. | |
37 * Free with FreeProgress() | |
38 * | |
39 * @note Starts the internal stopwatch immediatly! | |
40 * | |
41 * @see FreeProgress() | |
42 * | |
43 * @param[out] pprProgress | |
44 * Pointer pointer to progress structure. Progress structure will be | |
45 * allocated here. | |
46 * @param[in] prFile | |
47 * Where to log messages to | |
48 * @param[in] pcPrefix | |
49 * What prefix to use for messages | |
50 * @param[in] bPrintCR | |
51 * If TRUE carriage return instead of newline will be printed between log messages | |
52 */ | |
53 void | |
54 NewProgress(progress_t **pprProgress, FILE *prFile, | |
55 char *pcPrefix, bool bPrintCR) | |
56 { | |
57 assert(NULL!=pprProgress); | |
58 assert(NULL!=prFile); | |
59 assert(NULL!=pcPrefix); | |
60 | |
61 (*pprProgress) = (progress_t *) CKMALLOC(1*sizeof(progress_t)); | |
62 (*pprProgress)->prFile = prFile; | |
63 (*pprProgress)->bPrintCR = bPrintCR; | |
64 (*pprProgress)->pcPrefix = CkStrdup(pcPrefix); | |
65 strcpy((*pprProgress)->pcLastLogMsg, "\0"); | |
66 (*pprProgress)->prStopwatch = StopwatchCreate(); | |
67 StopwatchZero((*pprProgress)->prStopwatch); | |
68 StopwatchStart((*pprProgress)->prStopwatch); | |
69 | |
70 return; | |
71 } | |
72 /*** end: NewProgress() ***/ | |
73 | |
74 | |
75 | |
76 /** | |
77 * @brief Frees progress structure and its members | |
78 * | |
79 * @param[out] pprProgress | |
80 * Pointer pointer to progress structure | |
81 * | |
82 * @see NewProgress() | |
83 * | |
84 */ | |
85 void | |
86 FreeProgress(progress_t **pprProgress) | |
87 { | |
88 (*pprProgress)->prFile = NULL; | |
89 CKFREE((*pprProgress)->pcPrefix); | |
90 StopwatchFree((*pprProgress)->prStopwatch); | |
91 | |
92 CKFREE(*pprProgress); | |
93 return; | |
94 } | |
95 /*** end: FreeProgress() ***/ | |
96 | |
97 | |
98 | |
99 | |
100 /** | |
101 * @brief Prints a progress update (and a carriage return) | |
102 * | |
103 * @param[in] prProgress | |
104 * Pointer to the progress structure | |
105 * @param[in] iStep | |
106 * Current step number | |
107 * @param[in] iTotalSteps | |
108 * Total step number | |
109 * @param[in] bForceOutput | |
110 * If percentage hasn't changed output is normally supressed | |
111 * normally. Output can be forced with this flag. | |
112 * | |
113 */ | |
114 void | |
115 ProgressLog(progress_t *prProgress, | |
116 unsigned long int iStep, unsigned long int iTotalSteps, | |
117 bool bForceOutput) | |
118 { | |
119 char pcLogMsg[1024]; | |
120 assert(0!=iTotalSteps); | |
121 | |
122 if (rLog.iLogLevelEnabled>LOGLEVEL_THRESHOLD) { | |
123 return; | |
124 } | |
125 | |
126 (void) snprintf(pcLogMsg, sizeof(pcLogMsg), "%s: %lu %%", | |
127 prProgress->pcPrefix, (unsigned long int)(iStep/(float)iTotalSteps*100.0)); | |
128 | |
129 if (! bForceOutput) { | |
130 /* Skip logging, if we've just logged the same message */ | |
131 if (STR_EQ(pcLogMsg, prProgress->pcLastLogMsg)) { | |
132 return; | |
133 } | |
134 } | |
135 | |
136 strncpy(prProgress->pcLastLogMsg, pcLogMsg, | |
137 sizeof(prProgress->pcLastLogMsg)); | |
138 | |
139 fprintf(prProgress->prFile, "%s (%lu out of %lu)", pcLogMsg, iStep, iTotalSteps); | |
140 if (prProgress->bPrintCR) { | |
141 fprintf(prProgress->prFile, "\r"); | |
142 } else { | |
143 fprintf(prProgress->prFile, "\n"); | |
144 | |
145 } | |
146 (void) fflush(prProgress->prFile); | |
147 | |
148 return; | |
149 } | |
150 /*** end: ProgressLog() ***/ | |
151 | |
152 | |
153 /** | |
154 * @brief Finishes progress output by printing the elapsed time | |
155 * | |
156 * @param[in] prProgress | |
157 * Pointer to the progress structure | |
158 * | |
159 */ | |
160 void | |
161 ProgressDone(progress_t *prProgress) | |
162 { | |
163 char pcBuf[1024]; | |
164 | |
165 if (rLog.iLogLevelEnabled>LOGLEVEL_THRESHOLD) { | |
166 return; | |
167 } | |
168 | |
169 (void) snprintf(pcBuf, sizeof(pcBuf), "%s done. CPU time: ", | |
170 prProgress->pcPrefix); | |
171 StopwatchStop(prProgress->prStopwatch); | |
172 StopwatchDisplay(prProgress->prFile, pcBuf, prProgress->prStopwatch); | |
173 (void) fflush(prProgress->prFile); | |
174 | |
175 return; | |
176 } | |
177 /*** end: ProgressDone() ***/ |