X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=test_src%2Fstring-extras-asm.S;fp=test_src%2Fstring-extras-asm.S;h=c40e442b6c1d56ef2027b13e0158718286cfb09e;hb=52ec168ece9d61bd9cb652235dfe8faee6232a11;hp=0000000000000000000000000000000000000000;hpb=7f4bda01ca923c4a9aca6da3370a7c4793426a5c;p=avr-crypto-lib.git diff --git a/test_src/string-extras-asm.S b/test_src/string-extras-asm.S new file mode 100644 index 0000000..c40e442 --- /dev/null +++ b/test_src/string-extras-asm.S @@ -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 . +*/ + +#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