############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 26/May/2009 12:58:53 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\pasha\elf\evil_src\miosdel\miosd # # elka\string_works.c # # Command line = "D:\pasha\elf\evil_src\miosdel\miosd # # elka\string_works.c" -D NEWSGOLD -D ELKA -lC # # "D:\pasha\elf\evil_src\miosdel\miosd # # elka\Release_ELKA\List\" -lA # # "D:\pasha\elf\evil_src\miosdel\miosd # # elka\Release_ELKA\List\" -o # # "D:\pasha\elf\evil_src\miosdel\miosd # # elka\Release_ELKA\Obj\" -s9 --no_unroll --cpu_mode # # arm --endian little --cpu ARM926EJ-S --stack_align # # 4 --interwork -e --fpu None --dlib_config # # "D:\pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\LIB\dl5tpainl8n.h" -I # # "D:\pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\INC\" --inline_threshold=2 # # List file = D:\pasha\elf\evil_src\miosdel\miosd # # elka\Release_ELKA\List\string_works.lst # # Object file = D:\pasha\elf\evil_src\miosdel\miosd # # elka\Release_ELKA\Obj\string_works.r79 # # # # # ############################################################################## D:\pasha\elf\evil_src\miosdel\miosd elka\string_works.c 1 #include "../inc/swilib.h" 2 //#include "string_works.h" 3 4 #pragma inline=forced 5 int toupper(int c) 6 { 7 if ((c>='a')&&(c<='z')) c+='A'-'a'; 8 return(c); 9 } 10 \ In segment CODE, align 4, keep-with-next 11 int strcmp_nocase(const char *s1,const char *s2) 12 { 13 int i; 14 int c; 15 while(!(i=(c=toupper(*s1++))-toupper(*s2++))) if (!c) break; \ strcmp_nocase: \ ??strcmp_nocase_0: \ 00000000 0020D0E5 LDRB R2,[R0, #+0] \ 00000004 610052E3 CMP R2,#+97 \ 00000008 010000BA BLT ??strcmp_nocase_1 \ 0000000C 7B0052E3 CMP R2,#+123 \ 00000010 202042B2 SUBLT R2,R2,#+32 \ ??strcmp_nocase_1: \ 00000014 00C0D1E5 LDRB R12,[R1, #+0] \ 00000018 010080E2 ADD R0,R0,#+1 \ 0000001C 0230A0E1 MOV R3,R2 \ 00000020 61005CE3 CMP R12,#+97 \ 00000024 010000BA BLT ??strcmp_nocase_2 \ 00000028 7B005CE3 CMP R12,#+123 \ 0000002C 20C04CB2 SUBLT R12,R12,#+32 \ ??strcmp_nocase_2: \ 00000030 011081E2 ADD R1,R1,#+1 \ 00000034 0C2052E0 SUBS R2,R2,R12 \ 00000038 0100001A BNE ??strcmp_nocase_3 \ 0000003C 000053E3 CMP R3,#+0 \ 00000040 EEFFFF1A BNE ??strcmp_nocase_0 16 return(i); \ ??strcmp_nocase_3: \ 00000044 0200A0E1 MOV R0,R2 \ 00000048 1EFF2FE1 BX LR ;; return 17 } 18 \ In segment CODE, align 4, keep-with-next 19 char *MakeGlobalString(const char *first, int breakchar, const char *last) 20 { \ MakeGlobalString: \ 00000000 F0412DE9 PUSH {R4-R8,LR} \ 00000004 0040A0E1 MOV R4,R0 \ 00000008 0150A0E1 MOV R5,R1 \ 0000000C 0260A0E1 MOV R6,R2 21 int l; 22 char *p; 23 p=malloc((l=strlen(first))+strlen(last)+2); \ 00000010 1B0000EF SWI +27 \ 00000014 0070A0E1 MOV R7,R0 \ 00000018 0600A0E1 MOV R0,R6 \ 0000001C 1B0000EF SWI +27 \ 00000020 070080E0 ADD R0,R0,R7 \ 00000024 020080E2 ADD R0,R0,#+2 \ 00000028 140000EF SWI +20 \ 0000002C 0080A0E1 MOV R8,R0 24 strcpy(p,first); \ 00000030 0410A0E1 MOV R1,R4 \ 00000034 1A0000EF SWI +26 25 if (first[strlen(first)-1]!=breakchar) p[l++]=breakchar; \ 00000038 0400A0E1 MOV R0,R4 \ 0000003C 1B0000EF SWI +27 \ 00000040 040080E0 ADD R0,R0,R4 \ 00000044 010050E5 LDRB R0,[R0, #-1] 26 strcpy(p+l,last); \ 00000048 0610A0E1 MOV R1,R6 \ 0000004C 050050E1 CMP R0,R5 \ 00000050 0850C717 STRBNE R5,[R7, +R8] \ 00000054 01708712 ADDNE R7,R7,#+1 \ 00000058 080087E0 ADD R0,R7,R8 \ 0000005C 1A0000EF SWI +26 27 return p; \ 00000060 0800A0E1 MOV R0,R8 \ 00000064 F081BDE8 POP {R4-R8,PC} ;; return 28 } 29 \ In segment DATA_C, align 4, align-sorted 30 const char wintranslation[128]= 31 { 32 0x5F,0x5F,0x27,0x5F,0x22,0x3A,0xC5,0xD8,0x5F,0x25,0x5F,0x3C,0x5F,0x5F,0x5F,0x5F, 33 0x5F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x5F,0x54,0x5F,0x3E,0x5F,0x5F,0x5F,0x5F, 34 0xFF,0xF6,0xF7,0x5F,0xFD,0x83,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4, 35 0xF8,0x2B,'I' ,'i' ,0xA3,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x5F,0x5F,0x5F,0xF5, 36 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, 37 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, 38 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, 39 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF 40 }; 41 const unsigned short dos2unicode[128]= \ dos2unicode: \ 00000000 100411041204 DC16 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050 \ 130414041504 \ 160417041804 \ 19041A04 \ 00000016 1B041C041D04 DC16 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061 \ 1E041F042004 \ 210422042304 \ 24042504 \ 0000002C 260427042804 DC16 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072 \ 29042A042B04 \ 2C042D042E04 \ 2F043004 \ 00000042 310432043304 DC16 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083 \ 340435043604 \ 370438043904 \ 3A043B04 \ 00000058 3C043D043E04 DC16 1084, 1085, 1086, 1087, 45, 45, 45, 166, 43, 166, 166, 172, 172 \ 3F042D002D00 \ 2D00A6002B00 \ A600A600AC00 \ AC00 \ 00000072 A600A600AC00 DC16 166, 166, 172, 45, 45, 45, 172, 76, 43, 84, 43, 45, 43, 166, 166 \ 2D002D002D00 \ AC004C002B00 \ 54002B002D00 \ 2B00A600A600 \ 00000090 4C003304A600 DC16 76, 1075, 166, 84, 166, 61, 43, 166, 166, 84, 84, 76, 76, 45, 1075 \ 5400A6003D00 \ 2B00A600A600 \ 540054004C00 \ 4C002D003304 \ 000000AE 2B002B002D00 DC16 43, 43, 45, 45, 45, 45, 166, 166, 45, 1088, 1089, 1090, 1091, 1092 \ 2D002D002D00 \ A600A6002D00 \ 400441044204 \ 43044404 \ 000000CA 450446044704 DC16 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103 \ 480449044A04 \ 4B044C044D04 \ 4E044F04 \ 000000E0 010451040404 DC16 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, 176, 8226, 183 \ 540407045704 \ 0E045E04B000 \ 2220B700 \ 000000F6 76001621A400 DC16 118, 8470, 164, 166, 160 \ A600A000 \ wintranslation: \ 00000100 5F5F275F223A DC8 95, 95, 39, 95, 34, 58, 197, 216, 95, 37, 95, 60, 95, 95, 95, 95 \ C5D85F255F3C \ 5F5F5F5F \ 00000110 5F2727222207 DC8 95, 39, 39, 34, 34, 7, 45, 45, 95, 84, 95, 62, 95, 95, 95, 95, 255 \ 2D2D5F545F3E \ 5F5F5F5FFF \ 00000121 F6F75FFD83B3 DC8 246, 247, 95, 253, 131, 179, 21, 240, 99, 242, 60, 191, 45, 82, 244 \ 15F063F23CBF \ 2D52F4 \ 00000130 F82B4969A3E7 DC8 248, 43, 73, 105, 163, 231, 20, 250, 241, 252, 243, 62, 95, 95, 95 \ 14FAF1FCF33E \ 5F5F5F \ 0000013F F58081828384 DC8 245, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139 \ 85868788898A \ 8B \ 0000014C 8C8D8E8F9091 DC8 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152 \ 929394959697 \ 98 \ 00000159 999A9B9C9D9E DC8 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165 \ 9FA0A1A2A3A4 \ A5 \ 00000166 A6A7A8A9AAAB DC8 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 224, 225, 226 \ ACADAEAFE0E1 \ E2 \ 00000173 E3E4E5E6E7E8 DC8 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 \ E9EAEBECEDEE \ EF 42 { 43 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 44 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, 45 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 46 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, 47 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 48 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, 49 0x002D,0x002D,0x002D,0x00A6,0x002B,0x00A6,0x00A6,0x00AC, 50 0x00AC,0x00A6,0x00A6,0x00AC,0x002D,0x002D,0x002D,0x00AC, 51 0x004C,0x002B,0x0054,0x002B,0x002D,0x002B,0x00A6,0x00A6, 52 0x004C,0x0433,0x00A6,0x0054,0x00A6,0x003D,0x002B,0x00A6, 53 0x00A6,0x0054,0x0054,0x004C,0x004C,0x002D,0x0433,0x002B, 54 0x002B,0x002D,0x002D,0x002D,0x002D,0x00A6,0x00A6,0x002D, 55 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 56 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F, 57 0x0401,0x0451,0x0404,0x0454,0x0407,0x0457,0x040E,0x045E, 58 0x00B0,0x2022,0x00B7,0x0076,0x2116,0x00A4,0x00A6,0x00A0 59 }; 60 \ In segment CODE, align 4, keep-with-next 61 unsigned int char8to16(int c) 62 { 63 if (c>=128) \ char8to16: \ 00000000 800050E3 CMP R0,#+128 \ 00000004 1EFF2FB1 BXLT LR 64 { 65 //Win->Dos 66 c=wintranslation[c-128]; \ 00000008 18109FE5 LDR R1,??char8to16_0 ;; dos2unicode \ 0000000C 010080E0 ADD R0,R0,R1 \ 00000010 8000D0E5 LDRB R0,[R0, #+128] 67 if (c<128) return(c); \ 00000014 800050E3 CMP R0,#+128 68 return(dos2unicode[c-128]); \ 00000018 FF20E0A3 MVNGE R2,#+255 \ 0000001C 800081A0 ADDGE R0,R1,R0, LSL #+1 \ 00000020 B00092A1 LDRHGE R0,[R2, +R0] 69 } 70 return(c); \ 00000024 1EFF2FE1 BX LR ;; return \ ??char8to16_0: \ 00000028 ........ DC32 dos2unicode 71 } 72 \ In segment CODE, align 4, keep-with-next 73 void ascii2ws(WSHDR *ws, const char *s) 74 { \ ascii2ws: \ 00000000 30402DE9 PUSH {R4,R5,LR} \ 00000004 0040A0E1 MOV R4,R0 \ 00000008 0150A0E1 MOV R5,R1 75 char c; 76 CutWSTR(ws,0); \ 0000000C 0010A0E3 MOV R1,#+0 \ 00000010 260100EF SWI +294 \ 00000014 030000EA B ??ascii2ws_0 77 while((c=*s++)) 78 { 79 wsAppendChar(ws,char8to16(c)); \ ??ascii2ws_1: \ 00000018 ........ BL char8to16 \ 0000001C 0010A0E1 MOV R1,R0 \ 00000020 0400A0E1 MOV R0,R4 \ 00000024 1C0000EF SWI +28 80 } \ ??ascii2ws_0: \ 00000028 ........ LDRB R1,[R5], #+1 \ 0000002C 0100B0E1 MOVS R0,R1 \ 00000030 F8FFFF1A BNE ??ascii2ws_1 81 } \ 00000034 3080BDE8 POP {R4,R5,PC} ;; return 82 \ In segment CODE, align 4, keep-with-next 83 int char16to8(int c) 84 { 85 if (c<0x400) return (c); \ char16to8: \ 00000000 400E50E3 CMP R0,#+1024 \ 00000004 1EFF2FB1 BXLT LR 86 c-=0x400; \ 00000008 FF10E0E3 MVN R1,#+255 \ 0000000C C01FC1E3 BIC R1,R1,#0x300 \ 00000010 000081E0 ADD R0,R1,R0 87 if (c<16) \ 00000014 100050E3 CMP R0,#+16 \ 00000018 090000AA BGE ??char16to8_0 88 { 89 if (c==1) c=0; \ 0000001C 010050E3 CMP R0,#+1 \ 00000020 0000A003 MOVEQ R0,#+0 \ 00000024 1400000A BEQ ??char16to8_1 90 else if (c==4) c=2; \ 00000028 040050E3 CMP R0,#+4 \ 0000002C 0200A003 MOVEQ R0,#+2 \ 00000030 1100000A BEQ ??char16to8_1 91 else if (c==6) c=10; \ 00000034 060050E3 CMP R0,#+6 \ 00000038 1EFF2F11 BXNE LR \ 0000003C 0A00A0E3 MOV R0,#+10 \ 00000040 0D0000EA B ??char16to8_1 92 else return (c); 93 } 94 else if (c>79) \ ??char16to8_0: \ 00000044 500050E3 CMP R0,#+80 \ 00000048 0D0000BA BLT ??char16to8_2 95 { 96 if (c==0x51) c=16; \ 0000004C 510050E3 CMP R0,#+81 \ 00000050 1000A003 MOVEQ R0,#+16 \ 00000054 0800000A BEQ ??char16to8_1 97 else if (c==0x54) c=18; \ 00000058 540050E3 CMP R0,#+84 \ 0000005C 1200A003 MOVEQ R0,#+18 \ 00000060 0500000A BEQ ??char16to8_1 98 else if (c==0x56) c=11; \ 00000064 560050E3 CMP R0,#+86 \ 00000068 0B00A003 MOVEQ R0,#+11 \ 0000006C 0200000A BEQ ??char16to8_1 99 else if (c==0x57) c=23; \ 00000070 570050E3 CMP R0,#+87 \ 00000074 1EFF2F11 BXNE LR \ 00000078 1700A0E3 MOV R0,#+23 \ ??char16to8_1: \ 0000007C A80080E2 ADD R0,R0,#+168 \ 00000080 1EFF2FE1 BX LR 100 else return (c); 101 } 102 else c+=8; \ ??char16to8_2: \ 00000084 080080E2 ADD R0,R0,#+8 103 c+=168; 104 return (c); \ ??char16to8_3: \ 00000088 FBFFFFEA B ??char16to8_1 105 } 106 \ In segment CODE, align 4, keep-with-next 107 void utf82win(char*d,const char *s) 108 { \ utf82win: \ 00000000 0020D1E5 LDRB R2,[R1, #+0] \ 00000004 000052E3 CMP R2,#+0 \ 00000008 1700000A BEQ ??utf82win_0 109 for (; *s; s+=2) 110 { 111 unsigned char ub = *s, lb = *(s+1); \ ??utf82win_1: \ 0000000C 0020D1E5 LDRB R2,[R1, #+0] \ 00000010 0130D1E5 LDRB R3,[R1, #+1] 112 if (ub == 208) \ 00000014 D00052E3 CMP R2,#+208 \ 00000018 0400001A BNE ??utf82win_2 113 if (lb != 0x81) \ 0000001C 810053E3 CMP R3,#+129 \ 00000020 A820A003 MOVEQ R2,#+168 114 {*d = lb + 48; d++;} \ 00000024 30208312 ADDNE R2,R3,#+48 \ ??utf82win_3: \ 00000028 ........ STRB R2,[R0], #+1 \ 0000002C 0B0000EA B ??utf82win_4 115 else 116 {*d = '¨'; d++;} 117 118 if (ub == 209) \ ??utf82win_2: \ 00000030 D10052E3 CMP R2,#+209 \ 00000034 0500001A BNE ??utf82win_5 119 if (lb != 0x91) \ 00000038 910053E3 CMP R3,#+145 120 {*d = lb + 112; d++;} \ 0000003C 70208312 ADDNE R2,R3,#+112 \ 00000040 ........ STRBNE R2,[R0], #+1 \ 00000044 0500001A BNE ??utf82win_4 121 else 122 {*d = '¸'; d++;} \ 00000048 B820A0E3 MOV R2,#+184 \ 0000004C F5FFFFEA B ??utf82win_3 \ ??utf82win_5: \ 00000050 5B0053E3 CMP R3,#+91 \ 00000054 51005313 CMPNE R3,#+81 123 124 if ((ub != 208) && (ub != 209) && (lb != 91) && (lb != 81)) 125 { 126 *d = ub; \ 00000058 ........ STRBNE R2,[R0], #+1 127 d++; 128 s--; \ 0000005C 01104112 SUBNE R1,R1,#+1 129 } 130 } \ ??utf82win_4: \ 00000060 0220F1E5 LDRB R2,[R1, #+2]! \ 00000064 000052E3 CMP R2,#+0 \ 00000068 E7FFFF1A BNE ??utf82win_1 131 *d = 0; \ ??utf82win_0: \ 0000006C 0010A0E3 MOV R1,#+0 \ 00000070 0010C0E5 STRB R1,[R0, #+0] 132 } \ 00000074 1EFF2FE1 BX LR ;; return Maximum stack usage in bytes: Function CSTACK -------- ------ MakeGlobalString 24 ascii2ws 12 char16to8 0 char8to16 0 strcmp_nocase 0 utf82win 0 Segment part sizes: Function/Label Bytes -------------- ----- ??strcmp_nocase_0 76 MakeGlobalString 104 dos2unicode 384 char8to16 44 ascii2ws 56 char16to8 140 utf82win 120 Others 24 564 bytes in segment CODE 384 bytes in segment DATA_C 540 bytes of CODE memory (+ 24 bytes shared) 384 bytes of CONST memory Errors: none Warnings: none