@@ -83,6 +83,22 @@ void PCPGenericData_removeAllFields(PCPGenericData* this)
8383 }
8484}
8585
86+ #define PrintField (format , value ) \
87+ xSnprintf(buffer, sizeof(buffer), format, width, value);\
88+ RichString_appendAscii(str, attr, buffer);
89+
90+ #define KBytesField (format , val ) \
91+ pmConvScale(format, gf->value, &gf->units, &atom, &kbyte_scale);\
92+ Process_printKBytes(str, val, coloring);
93+
94+ #define TimeField (format , val ) \
95+ pmConvScale(format, gf->value, &gf->units, &atom, &sec_scale);\
96+ Process_printTime(str, val, coloring);
97+
98+ #define CountField (format , val ) \
99+ pmConvScale(format, gf->value, &gf->units, &atom, &count_scale);\
100+ Process_printCount(str, val, coloring);
101+
86102static void PCPGenericData_writeField (const GenericData * this , RichString * str , int field ) {
87103 const PCPGenericData * gg = (const PCPGenericData * ) this ;
88104 PCPGenericDataField * gf = (PCPGenericDataField * )Hashtable_get (gg -> fields , field );
@@ -92,6 +108,7 @@ static void PCPGenericData_writeField(const GenericData* this, RichString* str,
92108 const ProcessField * fields = this -> settings -> ss -> fields ;
93109 char buffer [256 ];
94110 int attr = CRT_colors [DEFAULT_COLOR ];
111+ bool coloring = this -> settings -> highlightMegabytes ;
95112
96113 DynamicColumn * dc = Hashtable_get (this -> settings -> dynamicColumns , fields [field ]);
97114 if (!dc || !dc -> enabled )
@@ -100,6 +117,21 @@ static void PCPGenericData_writeField(const GenericData* this, RichString* str,
100117 PCPDynamicColumn * column = (PCPDynamicColumn * ) dc ;
101118 bool instances = column -> instances ;
102119
120+ bool scaled = column -> scale ;
121+ pmAtomValue atom ;
122+ pmUnits kbyte_scale ;
123+
124+ kbyte_scale .dimSpace = 1 ;
125+ kbyte_scale .scaleSpace = PM_SPACE_KBYTE ;
126+
127+ pmUnits sec_scale ;
128+ sec_scale .dimTime = 1 ;
129+ sec_scale .scaleTime = PM_TIME_SEC ;
130+
131+ pmUnits count_scale ;
132+ count_scale .dimCount = 1 ;
133+ count_scale .scaleCount = PM_COUNT_ONE ;
134+
103135 int width = column -> super .width ;
104136 if (!width || abs (width ) > DYNAMIC_MAX_COLUMN_WIDTH )
105137 width = DYNAMIC_DEFAULT_COLUMN_WIDTH ;
@@ -125,32 +157,104 @@ static void PCPGenericData_writeField(const GenericData* this, RichString* str,
125157 RichString_appendAscii (str , attr , buffer );
126158 break ;
127159 case PM_TYPE_32 :
128- xSnprintf (buffer , sizeof (buffer ), "%*d " , width , gf -> value -> l );
129- RichString_appendAscii (str , attr , buffer );
130- break ;
160+ if (scaled ) {
161+ if (gf -> units .dimSpace ) {
162+ KBytesField (PM_TYPE_32 , atom .l );
163+ break ;
164+ } else if (gf -> units .dimTime ) {
165+ TimeField (PM_TYPE_32 , atom .l );
166+ break ;
167+ } else {
168+ CountField (PM_TYPE_32 , atom .l );
169+ break ;
170+ }
171+ } else {
172+ PrintField ("%*d " , gf -> value -> l );
173+ break ;
174+ }
131175 case PM_TYPE_U32 :
132- xSnprintf (buffer , sizeof (buffer ), "%*u " , width , gf -> value -> ul );
133- RichString_appendAscii (str , attr , buffer );
134- break ;
176+ if (scaled ) {
177+ if (gf -> units .dimSpace ) {
178+ KBytesField (PM_TYPE_U32 , atom .ul );
179+ break ;
180+ } else if (gf -> units .dimTime ) {
181+ TimeField (PM_TYPE_U32 , atom .ul );
182+ break ;
183+ } else {
184+ CountField (PM_TYPE_U32 , atom .ul );
185+ break ;
186+ }
187+ } else {
188+ PrintField ("%*u " , gf -> value -> ul );
189+ break ;
190+ }
135191 case PM_TYPE_64 :
136- xSnprintf (buffer , sizeof (buffer ), "%*lld " , width , (long long ) gf -> value -> ll );
137- RichString_appendAscii (str , attr , buffer );
138- break ;
192+ if (scaled ) {
193+ if (gf -> units .dimSpace ) {
194+ KBytesField (PM_TYPE_64 , atom .ll );
195+ break ;
196+ } else if (gf -> units .dimTime ) {
197+ TimeField (PM_TYPE_64 , atom .ll );
198+ break ;
199+ } else {
200+ CountField (PM_TYPE_64 , atom .ll );
201+ break ;
202+ }
203+ } else {
204+ PrintField ("%*lld " , (long long )gf -> value -> ll );
205+ break ;
206+ }
139207 case PM_TYPE_U64 :
140- xSnprintf (buffer , sizeof (buffer ), "%*llu " , width , (unsigned long long ) gf -> value -> ull );
141- RichString_appendAscii (str , attr , buffer );
142- break ;
208+ if (scaled ) {
209+ if (gf -> units .dimSpace ) {
210+ KBytesField (PM_TYPE_U64 , atom .ull );
211+ break ;
212+ } else if (gf -> units .dimTime ) {
213+ TimeField (PM_TYPE_U64 , atom .ull );
214+ break ;
215+ } else {
216+ CountField (PM_TYPE_U64 , atom .ull );
217+ break ;
218+ }
219+ } else {
220+ PrintField ("%*llu " , (unsigned long long )gf -> value -> ull );
221+ break ;
222+ }
143223 case PM_TYPE_FLOAT :
144- xSnprintf (buffer , sizeof (buffer ), "%*.2f " , width , (double ) gf -> value -> f );
145- RichString_appendAscii (str , attr , buffer );
146- break ;
224+ if (scaled ) {
225+ if (gf -> units .dimSpace ) {
226+ KBytesField (PM_TYPE_FLOAT , atom .f );
227+ break ;
228+ } else if (gf -> units .dimTime ) {
229+ TimeField (PM_TYPE_FLOAT , atom .f );
230+ break ;
231+ } else {
232+ CountField (PM_TYPE_FLOAT , atom .f );
233+ break ;
234+ }
235+ } else {
236+ PrintField ("%*.2f " , (double )gf -> value -> f );
237+ break ;
238+ }
147239 case PM_TYPE_DOUBLE :
148- xSnprintf (buffer , sizeof (buffer ), "%*.2f " , width , gf -> value -> d );
149- RichString_appendAscii (str , attr , buffer );
150- break ;
240+ if (scaled ) {
241+ if (gf -> units .dimSpace ) {
242+ KBytesField (PM_TYPE_DOUBLE , atom .d );
243+ break ;
244+ } else if (gf -> units .dimTime ) {
245+ TimeField (PM_TYPE_DOUBLE , atom .d );
246+ break ;
247+ } else {
248+ CountField (PM_TYPE_DOUBLE , atom .d );
249+ break ;
250+ }
251+ } else {
252+ PrintField ("%*.2f " , gf -> value -> d );
253+ break ;
254+ }
151255 default :
152256 attr = CRT_colors [DYNAMIC_RED ];
153- RichString_appendAscii (str , attr , "no data" );
257+ RichString_appendAscii (str , attr , "no data " );
154258 break ;
155259 }
156260 }
0 commit comments