summaryrefslogtreecommitdiff
path: root/src/slices.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/slices.c')
-rw-r--r--src/slices.c89
1 files changed, 44 insertions, 45 deletions
diff --git a/src/slices.c b/src/slices.c
index fae363a..e8f1d49 100644
--- a/src/slices.c
+++ b/src/slices.c
@@ -92,6 +92,48 @@ int sliceSplit(slices_t *slices, slice_t *initialSlice, address_t splitAt, slice
return 1 + (splitBeforeSingularity?1:0) + (splitAfterSingularity?1:0);
}
+void sliceDumpUpdate(char *dump, slice_t *s, address_t blockSize, unsigned int charCount, address_t begin, address_t end) {
+ address_t sb,se,i;
+ char ci;
+
+ // If "s" slice is (partially) contained/visible in the [begin,end] display interval
+ if ( !(s->end < begin) && !(s->begin > end) ) {
+ // Draw the slice on the right number of characters
+ // Mathematically correct, but crashes because address_t is UNSIGNED
+ // sb=MAX(0, (s->begin - begin) / *blockSize);
+ sb=(s->begin < begin)?0:(s->begin - begin) / blockSize;
+ se=MIN((s->end - begin) / blockSize, charCount-1);
+
+ /* Debug "assertion"
+ if (sb >= charCount || se >= charCount) {
+ printf("BUG : sb==%lli, se=%lli, charCount==%i\n", sb, se, charCount);
+ printf("BUG : MAX(0, (%lli - %lli) / %lli)", s->begin, begin, blockSize);
+ exit(42);
+ }*/
+
+ // Choose from the sent slice status the right char to draw
+ switch (s->status) {
+ case S_UNKNOWN: ci='_'; break;
+ case S_UNREADABLE: ci='!'; break;
+ case S_RECOVERED: ci='.'; break;
+ default: ci='~'; break;
+ }
+
+ // Draw on the right number of characters, paying attention with information collision
+ for (i=sb;i<=se;i++) {
+ if (dump[i] == ' ' ) {
+ // This is a new information
+ dump[i]=ci;
+ } else if ( dump[i] == ci || dump[i] == '!' ) {
+ // Already the right information or error, don't modify
+ } else {
+ // Multiple information on the same character
+ dump[i]='#';
+ }
+ }
+ }
+}
+
slices_t *slicesNewEmpty() {
int res;
slices_t *ss = malloc(1*sizeof(slices_t));
@@ -203,54 +245,11 @@ slice_t *slicesFindLargestFast(slices_t *slices, address_t *foundMax, sliceStatu
return sMax;
}
-void _sliceDump(char *dump, slice_t *curr, address_t blockSize, unsigned int charCount, address_t begin, address_t end) {
- address_t sb,se,i;
- char ci;
-
- // If "curr" slice is (partially) contained/visible in the [begin,end] display interval
- if ( !(curr->end < begin) && !(curr->begin > end) ) {
- // Draw the slice on the right number of characters
- // Mathematically correct, but crashes because address_t is UNSIGNED
- // sb=MAX(0, (curr->begin - begin) / *blockSize);
- sb=(curr->begin < begin)?0:(curr->begin - begin) / blockSize;
- se=MIN((curr->end - begin) / blockSize, charCount-1);
-
- /* Debug "assertion"
- if (sb >= charCount || se >= charCount) {
- printf("BUG : sb==%lli, se=%lli, charCount==%i\n", sb, se, charCount);
- printf("BUG : MAX(0, (%lli - %lli) / %lli)", curr->begin, begin, blockSize);
- pthread_mutex_unlock(&(slices->writeOrConsistentReadMutex));
- exit(42);
- }*/
-
- // Choose from the current slice status the right char to draw
- switch (curr->status) {
- case S_UNKNOWN: ci='_'; break;
- case S_UNREADABLE: ci='!'; break;
- case S_RECOVERED: ci='.'; break;
- default: ci='~'; break;
- }
-
- // Draw on the right number of characters, paying attention with information collision
- for (i=sb;i<=se;i++) {
- if (dump[i] == ' ' ) {
- // This is a new information
- dump[i]=ci;
- } else if ( dump[i] == ci || dump[i] == '!' ) {
- // Already the right information or error, don't modify
- } else {
- // Multiple information on the same character
- dump[i]='#';
- }
- }
- }
-}
-
char *slicesDump(slices_t *slices, address_t *blockSize, unsigned int charCount, address_t begin, address_t end) {
int res;
slice_t *curr;
char *dump;
-
+
res=pthread_mutex_lock(&(slices->writeOrConsistentReadMutex));
if (res!=0) {
//FIXME Trashy code
@@ -273,7 +272,7 @@ char *slicesDump(slices_t *slices, address_t *blockSize, unsigned int charCount,
//For each slice write in dump ASCII representation
curr = slices->first;
while (curr != NULL) {
- _sliceDump(dump, curr, *blockSize, charCount, begin, end);
+ sliceDumpUpdate(dump, curr, *blockSize, charCount, begin, end);
curr=curr->next;
}