]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - test_src/string-extras-asm.S
backporting uart_i and cli
[avr-crypto-lib.git] / test_src / string-extras-asm.S
diff --git a/test_src/string-extras-asm.S b/test_src/string-extras-asm.S
new file mode 100644 (file)
index 0000000..c40e442
--- /dev/null
@@ -0,0 +1,138 @@
+/* string-extras-asm.S */
+/*
+    This file is part of the AVR-Huffman.
+    Copyright (C) 2009  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "avr-asm-macros.S"
+
+/******************************************************************************/
+/*
+       uint16_t stridentcnt_P(char* a, PGM_P b){
+               uint16_t i=0;
+               char c;
+               for(;;){
+                       c = pgm_read_byte(b++);
+                       if(*a != c || c=='\0')
+                               return i;
+                       i++;
+                       a++;
+               }
+       }
+       
+       param a: r24:r25
+       param b: r22:r23
+*/     
+.global stridentcnt_P
+stridentcnt_P:
+       movw r30, r22
+       movw r26, r24
+       clr r24
+       clr r25
+1:
+       ld r22, X+
+       lpm r23, Z+
+       cpse r22, r23
+       ret
+       cpse r22, r1
+       ret
+       adiw r24, 1
+       rjmp 1b
+               
+
+/******************************************************************************/
+/*
+       uint16_t firstword_length(char* s){
+               uint16_t ret=0;
+               while(isgraph(*s++))
+                       ret++;
+               return ret; 
+       }
+       
+       param s: r24:r25
+*/
+.global firstword_length
+firstword_length:
+       push r28
+       push r29
+       push r2
+       push r3
+       movw r2, r24
+       movw r28, r24
+1:
+       clr r25
+       ld r24, Y+
+       call isgraph
+       adiw r24, 0
+       brne 1b
+       movw r24, r28
+       sbiw r24, 1
+       sub r24, r2
+       sbc r25, r3     
+       pop r3
+       pop r2
+       pop r29
+       pop r28
+       ret
+
+
+/******************************************************************************/
+/*
+       char* strstrip(char* str){
+               if(!str)
+                       return str;
+               char* endptr;
+               while(*str && (*str==' ' || *str=='\t'))
+                       ++str;
+               endptr=str;
+               while(*endptr)
+                       ++endptr;
+               do{
+                       --endptr;
+               }while(*endptr==' ' || *endptr=='\t');
+               endptr[1]='\0';
+               return str;
+       }
+  
+  param str: r24:r25
+*/
+.global strstrip
+strstrip:
+       movw r26, r24
+       adiw r26, 0
+       breq 9f
+1:
+       ld r22, X+
+       cpi r22, ' '
+       breq 1b
+       cpi r22, '\t'
+       breq 1b
+       sbiw r26, 1
+       movw r30, r26
+2:
+       ld r22, Z+
+       tst r22
+       brne 2b
+3:     
+       ld r22, -Z
+       cpi r22, ' '
+       breq 3b
+       cpi r22, '\t'
+       breq 3b
+       st Z, r1
+       movw r24, r26
+9:
+       ret