From 29cfa53e3b9f06f99be55c160e0f220e5fe9b1b1 Mon Sep 17 00:00:00 2001
From: "Israel B. Sant'Anna" <ibsa14@inf.ufpr.br>
Date: Wed, 17 Jun 2015 17:32:22 -0300
Subject: [PATCH] Insertion sort and convertion from integer to char

---
 cMIPS/tests/uart.c | 104 +++++++++++++++++++++++++++++++++++----------
 1 file changed, 81 insertions(+), 23 deletions(-)

diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c
index 3d96284..203d3ca 100644
--- a/cMIPS/tests/uart.c
+++ b/cMIPS/tests/uart.c
@@ -50,15 +50,18 @@ typedef struct UARTDriver{
 } UARTDriver;
 
 #define EOF -1
+#define MAX_SIZE 16
 
 int proberx(void);         // returns nrx
 int probetx(void);         // returns ntx
 int iostat(void);          // returns integer with status at lsb
 void ioctl(int);           // write lsb in control register
 char getc(void);           // returns char in queue, decrements nrx
-void Putc(char);            // inserts char in queue, decrements ntx
+void Putc(char);           // inserts char in queue, decrements ntx
 int ctoi(char);            // converts a character to an integer
+void itoc(int, char*);            // converts integer to char 
 
+void insertionSort(int v[], int size);
 void initUd();
 
 extern UARTDriver Ud;
@@ -76,12 +79,43 @@ int main(){
 
     initUd();
     volatile char c;
-    
+    int h, i=0, n=0;
+    int v[MAX_SIZE];
+    char last = EOF;
     while((c = getc()) != '\0') {
         if(c != EOF) {
-            Putc(c);
+            if(c == '\n' && last != '\n') {
+                v[i] = n;
+                n = 0;
+                i++;
+            }else{
+                h = ctoi(c);
+                if(h != EOF) {
+                    n = n*16 + h;         
+                }
+            }
+            last = c;
         }
     }
+
+    insertionSort(v,i);
+    char hex[9];
+    for(;i>0;i--){
+        // print(v[i-1]);
+        itoc(v[i-1], hex);
+        n = 0;
+        while(hex[n] != '\0') {
+            Putc(hex[n]);
+            n++;
+        }
+        Putc('\n');
+    }
+    Putc('\n');
+    // for(i=0;i<16;i++) {
+    //     //TODO
+    //     c = convert(v[i]);
+    //     Putc(c);
+    // }
     if(Ud.ntx < 16){
         disableInterr();
         uart->d.tx = Ud.tx_q[Ud.tx_hd];
@@ -93,24 +127,6 @@ int main(){
     int cont;
     for(cont=0;cont<1000;cont++);  //Wait for the remote uart
     
-    // while((c = getc()) != '\0') {
-    //     if(c != EOF) {
-    //         // while(!Putc(c)); // Wait till there's space on queue
-    //         int n = 0;
-    //         while(c != '\n' && c != '\0') {
-    //             int h = ctoi(c);
-    //             if(h != EOF) {
-    //                 n = n*16 + h;         
-    //             }
-    //             c = getc();
-    //         }
-    //         //If it's a negative hex make it a negative integer as well
-    //         n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n;
-    //         // print(n);
-    //     }
-    // }
-    // Putc(c); // Sends EOF
-
     return 0;
 }
 
@@ -123,6 +139,19 @@ void initUd(){
     Ud.ntx = 16;
 }
 
+void insertionSort(int v[], int size){
+  int i, j, index;
+  for (i=1; i < size; i++) {
+    index = v[i];
+    j = i;
+    while ((j > 0) && (v[j-1] > index)) {
+      v[j] = v[j-1];
+      j = j - 1;
+    }
+    v[j] = index;
+  }
+}
+
 char getc(){
     char c = EOF;
     if(Ud.nrx > 0){
@@ -169,13 +198,42 @@ int ctoi(char c) {
 
     // If it's an uppercase letter
     if(c >= 0x41 && c < 0x47) {
-        return ((int) c) - 0x37; // 0x40 - 0xa
+        return ((int) c) - 0x37; // 0x41 - 0xa
     }
 
     // If it's a lowercase letter
     if(c >= 0x61 && c < 0x67) {
-        return ((int) c) - 0x57; //0x60 - 0xa
+        return ((int) c) - 0x57; //0x61 - 0xa
     }
 
     return EOF;
+}
+
+void itoc(int n, char* result) {
+    int i, hex, j;
+    char c;
+    j = 0;
+    result[0] = '\0';
+    for(i = 28; i >= 0; i-=4) {
+        hex = (n>>i)&0xf;
+
+        if(hex >= 0 && hex < 10) {
+            c = (char) hex + 0x30;
+        }else if(hex >= 10 && hex < 16) {
+            c = (char) hex + 0x37;
+        }
+
+        if(hex == 0 && result[0] != '\0') {
+            result[j] = c;
+            j++;
+        } else if(hex != 0) {
+            result[j] = c;
+            j++;
+        }
+    }
+    if(result[0] == '\0') {
+        result[0] = '0';
+        j = 1;
+    }
+    result[j] = '\0';
 }
\ No newline at end of file
-- 
GitLab