############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 04/Apr/2008 21:09:33 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\Pasha\elf\_MY_PROJECT_\naticq_mod\history.c # # Command line = D:\Pasha\elf\_MY_PROJECT_\naticq_mod\history.c -D # # X75 --preprocess D:\Pasha\elf\_MY_PROJECT_\naticq_mo # # d\Release_SGOLD_X75\List\ -lC # # D:\Pasha\elf\_MY_PROJECT_\naticq_mod\Release_SGOLD_X # # 75\List\ -o D:\Pasha\elf\_MY_PROJECT_\naticq_mod\Rel # # ease_SGOLD_X75\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\_MY_PROJECT_\naticq_mod\Release_SGOLD_X # # 75\List\history.lst # # Object file = D:\Pasha\elf\_MY_PROJECT_\naticq_mod\Release_SGOLD_X # # 75\Obj\history.r79 # # # # # ############################################################################## D:\Pasha\elf\_MY_PROJECT_\naticq_mod\history.c 1 #include "../inc/swilib.h" 2 #include "naticq.h" 3 #include "history.h" 4 #include "language.h" 5 //#include "decode.h" 6 #include "strings.h" 7 //#include "strings3.h" 8 9 10 extern char HIST_PATH[]; 11 extern int LOG_ALL; 12 extern int HISTORY_TYPE; 13 extern unsigned int UIN; 14 /* 15 Добавлет строку в историю контакта CLIST 16 */ 17 \ In segment CODE, align 4, keep-with-next 18 static do_logwrite(const char *n_a_m_e_z, unsigned int u_i_n, char *text) 19 { 20 volatile int hFile; 21 unsigned int io_error = 0; 22 unsigned int ul; 23 char error[36]; 24 char fullname[128]; 25 char hist_path[128]; 26 if(HISTORY_TYPE) \ do_logwrite: \ 00000000 ........ LDR R3,??DataTable5 ;; HIST_PATH \ 00000004 F0402DE9 PUSH {R4-R7,LR} \ 00000008 ........ LDR R7,??DataTable4 ;; `?` \ 0000000C 0040A0E1 MOV R4,R0 \ 00000010 ........ LDR R0,??DataTable6 ;; HISTORY_TYPE \ 00000014 4CDF4DE2 SUB SP,SP,#+304 \ 00000018 000090E5 LDR R0,[R0, #+0] \ 0000001C 0150A0E1 MOV R5,R1 \ 00000020 0260A0E1 MOV R6,R2 \ 00000024 0010A0E3 MOV R1,#+0 \ 00000028 00108DE5 STR R1,[SP, #+0] \ 0000002C 000050E3 CMP R0,#+0 \ 00000030 0800000A BEQ ??do_logwrite_0 27 snprintf(hist_path,127,"%s\\%u",HIST_PATH, UIN); \ 00000034 ........ LDR R0,??DataTable7 ;; UIN \ 00000038 0720A0E1 MOV R2,R7 \ 0000003C 000090E5 LDR R0,[R0, #+0] \ 00000040 7F10A0E3 MOV R1,#+127 \ 00000044 01002DE9 PUSH {R0} \ 00000048 90008DE2 ADD R0,SP,#+144 \ 0000004C 1B0100EF SWI +283 \ 00000050 04D08DE2 ADD SP,SP,#+4 \ 00000054 030000EA B ??do_logwrite_1 28 else 29 snprintf(hist_path,127,"%s",HIST_PATH); \ ??do_logwrite_0: \ 00000058 352F8FE2 ADR R2,??do_logwrite_2 ;; "%s" \ 0000005C 7F10A0E3 MOV R1,#+127 \ 00000060 8C008DE2 ADD R0,SP,#+140 \ 00000064 1B0100EF SWI +283 30 if (!isdir(hist_path,&ul)) \ ??do_logwrite_1: \ 00000068 08108DE2 ADD R1,SP,#+8 \ 0000006C 8C008DE2 ADD R0,SP,#+140 \ 00000070 910000EF SWI +145 \ 00000074 000050E3 CMP R0,#+0 \ 00000078 0200001A BNE ??do_logwrite_3 31 { 32 mkdir(hist_path,&ul); \ 0000007C 08108DE2 ADD R1,SP,#+8 \ 00000080 8C008DE2 ADD R0,SP,#+140 \ 00000084 100000EF SWI +16 33 } 34 snprintf(fullname,127,"%s\\%s(%d).txt", hist_path, n_a_m_e_z, u_i_n); \ ??do_logwrite_3: \ 00000088 20002DE9 PUSH {R5} \ 0000008C 10002DE9 PUSH {R4} \ 00000090 94308DE2 ADD R3,SP,#+148 \ 00000094 082087E2 ADD R2,R7,#+8 \ 00000098 7F10A0E3 MOV R1,#+127 \ 0000009C 14008DE2 ADD R0,SP,#+20 \ 000000A0 1B0100EF SWI +283 35 // mfree(buf); 36 // Открываем файл на дозапись и создаём в случае неудачи 37 hFile = fopen(fullname,A_ReadWrite + A_Create + A_Append + A_BIN,P_READ+P_WRITE, &io_error); \ 000000A4 08308DE2 ADD R3,SP,#+8 \ 000000A8 602FA0E3 MOV R2,#+384 \ 000000AC 0A10A0E3 MOV R1,#+10 \ 000000B0 811C81E3 ORR R1,R1,#0x8100 \ 000000B4 14008DE2 ADD R0,SP,#+20 \ 000000B8 0A0000EF SWI +10 \ 000000BC 0C008DE5 STR R0,[SP, #+12] 38 if(hFile!=-1) \ 000000C0 0C009DE5 LDR R0,[SP, #+12] \ 000000C4 08D08DE2 ADD SP,SP,#+8 \ 000000C8 010070E3 CMN R0,#+1 \ 000000CC 0A00000A BEQ ??do_logwrite_4 39 { 40 fwrite(hFile, text, strlen(text), &io_error); \ 000000D0 0600A0E1 MOV R0,R6 \ 000000D4 1B0000EF SWI +27 \ 000000D8 0D30A0E1 MOV R3,SP \ 000000DC 0020A0E1 MOV R2,R0 \ 000000E0 04009DE5 LDR R0,[SP, #+4] \ 000000E4 0610A0E1 MOV R1,R6 \ 000000E8 0C0000EF SWI +12 41 fclose(hFile, &io_error); \ 000000EC 04009DE5 LDR R0,[SP, #+4] \ 000000F0 0D10A0E1 MOV R1,SP \ 000000F4 0D0000EF SWI +13 \ 000000F8 090000EA B ??do_logwrite_5 42 } 43 else 44 { 45 snprintf(error,35, LG_HISTIOERR, io_error); \ ??do_logwrite_4: \ 000000FC 00309DE5 LDR R3,[SP, #+0] \ 00000100 182087E2 ADD R2,R7,#+24 \ 00000104 2310A0E3 MOV R1,#+35 \ 00000108 430F8DE2 ADD R0,SP,#+268 \ 0000010C 1B0100EF SWI +283 46 LockSched(); \ 00000110 460100EF SWI +326 47 ShowMSG(1,(int)error); \ 00000114 431F8DE2 ADD R1,SP,#+268 \ 00000118 0100A0E3 MOV R0,#+1 \ 0000011C 480100EF SWI +328 48 UnlockSched(); \ 00000120 470100EF SWI +327 49 } 50 mfree(text); \ ??do_logwrite_5: \ 00000124 0600A0E1 MOV R0,R6 \ 00000128 150000EF SWI +21 51 } \ 0000012C 4CDF8DE2 ADD SP,SP,#+304 \ 00000130 F080BDE8 POP {R4-R7,PC} ;; return \ ??do_logwrite_2: \ 00000134 25730000 DC8 "%s",+0 52 /* 53 static do_logwrite(unsigned int uin,char *text) 54 { 55 volatile int hFile; 56 unsigned int io_error = 0; 57 unsigned int ul; 58 char error[36]; 59 char fullname[128]; 60 char hist_path[128]; 61 if(HISTORY_TYPE) 62 snprintf(hist_path,127,"%s\\%u",HIST_PATH, UIN); 63 else 64 snprintf(hist_path,127,"%s",HIST_PATH); 65 if (!isdir(hist_path,&ul)) 66 { 67 mkdir(hist_path,&ul); 68 } 69 snprintf(fullname,127,"%s\\%u.txt", hist_path, uin); 70 // mfree(buf); 71 // Открываем файл на дозапись и создаём в случае неудачи 72 hFile = fopen(fullname,A_ReadWrite + A_Create + A_Append + A_BIN,P_READ+P_WRITE, &io_error); 73 if(hFile!=-1) 74 { 75 fwrite(hFile, text, strlen(text), &io_error); 76 fclose(hFile, &io_error); 77 } 78 else 79 { 80 snprintf(error,35, LG_HISTIOERR, io_error); 81 LockSched(); 82 ShowMSG(1,(int)error); 83 UnlockSched(); 84 } 85 mfree(text); 86 } 87 */ \ In segment CODE, align 4, keep-with-next 88 void Add2History(CLIST *CListEx, char *header, char *message, int direction) 89 { \ Add2History: \ 00000000 F0432DE9 PUSH {R4-R9,LR} \ 00000004 0040A0E1 MOV R4,R0 90 static const char *delim = "\r\n--------------<>-%04d\r\n"; 91 int len; 92 if (!LOG_ALL) return; \ 00000008 80009FE5 LDR R0,??Add2History_0 ;; LOG_ALL \ 0000000C 0150A0E1 MOV R5,R1 \ 00000010 000090E5 LDR R0,[R0, #+0] \ 00000014 0260A0E1 MOV R6,R2 \ 00000018 0370A0E1 MOV R7,R3 \ 0000001C 000050E3 CMP R0,#+0 \ 00000020 F083BD08 POPEQ {R4-R9,PC} 93 len=strlen(delim)+strlen(header)+strlen(message); \ 00000024 68809FE5 LDR R8,??Add2History_0+0x4 ;; `?-%0...">` \ 00000028 0800A0E1 MOV R0,R8 \ 0000002C 1B0000EF SWI +27 \ 00000030 0090A0E1 MOV R9,R0 \ 00000034 0500A0E1 MOV R0,R5 \ 00000038 1B0000EF SWI +27 \ 0000003C 099080E0 ADD R9,R0,R9 \ 00000040 0600A0E1 MOV R0,R6 \ 00000044 1B0000EF SWI +27 \ 00000048 090080E0 ADD R0,R0,R9 94 char *text=malloc(len+1); \ 0000004C 010080E2 ADD R0,R0,#+1 \ 00000050 140000EF SWI +20 \ 00000054 0090A0E1 MOV R9,R0 95 sprintf(text,delim,direction); \ 00000058 0720A0E1 MOV R2,R7 \ 0000005C 0810A0E1 MOV R1,R8 \ 00000060 160000EF SWI +22 96 strcat(text,header); \ 00000064 0510A0E1 MOV R1,R5 \ 00000068 0900A0E1 MOV R0,R9 \ 0000006C 170000EF SWI +23 97 strcat(text,message); \ 00000070 0610A0E1 MOV R1,R6 \ 00000074 0900A0E1 MOV R0,R9 \ 00000078 170000EF SWI +23 98 // if(UIN_WRITE2) 99 do_logwrite(CListEx->name, CListEx->uin, text); \ 0000007C 0C1094E5 LDR R1,[R4, #+12] \ 00000080 0920A0E1 MOV R2,R9 \ 00000084 140084E2 ADD R0,R4,#+20 \ 00000088 ........ BL do_logwrite 100 // else 101 // SUBPROC((void*)do_logwrite,CListEx->uin,text); 102 // SUBPROC((void*)do_logwrite2,CListEx->uin, text); 103 } \ 0000008C F083BDE8 POP {R4-R9,PC} ;; return \ ??Add2History_0: \ 00000090 ........ DC32 LOG_ALL \ 00000094 ........ DC32 `?-%0...">` 104 105 extern LOGQ *NewLOGQ(const char *s); 106 extern int AddLOGQ(LOGQ **queue, LOGQ *p); 107 108 //Делает ярким последний икс-статус, а остальные тусклыми \ In segment CODE, align 4, keep-with-next 109 void ActivateLastX(LOGQ *p) 110 { 111 LOGQ *q = p, *lastX = 0; \ ActivateLastX: \ 00000000 0010A0E3 MOV R1,#+0 \ 00000004 000050E3 CMP R0,#+0 \ 00000008 1EFF2F01 BXEQ LR 112 while(q) 113 { 114 if((q->type&0x0F) == 3) \ ??ActivateLastX_0: \ 0000000C 0C2090E5 LDR R2,[R0, #+12] \ 00000010 0F2002E2 AND R2,R2,#0xF \ 00000014 030052E3 CMP R2,#+3 115 { 116 lastX = q; \ 00000018 0010A001 MOVEQ R1,R0 117 q->type = 0x13; \ 0000001C 1320A003 MOVEQ R2,#+19 \ 00000020 0C208005 STREQ R2,[R0, #+12] 118 } 119 q = q->next; \ 00000024 000090E5 LDR R0,[R0, #+0] 120 } \ 00000028 000050E3 CMP R0,#+0 \ 0000002C F6FFFF1A BNE ??ActivateLastX_0 121 if(lastX) lastX->type = 3; \ 00000030 000051E3 CMP R1,#+0 \ 00000034 0300A013 MOVNE R0,#+3 \ 00000038 0C008115 STRNE R0,[R1, #+12] 122 } \ 0000003C 1EFF2FE1 BX LR ;; return 123 124 //Добавить элемент в лог первым \ In segment CODE, align 4, keep-with-next 125 void AddFirstLOGQ(CLIST *t, LOGQ *p) 126 { \ AddFirstLOGQ: \ 00000000 00402DE9 PUSH {LR} 127 LOGQ *q = t->log; \ 00000004 802090E5 LDR R2,[R0, #+128] 128 if(!p) return; \ 00000008 000051E3 CMP R1,#+0 \ 0000000C 0080BD08 POPEQ {PC} 129 t->log = p; \ 00000010 801080E5 STR R1,[R0, #+128] \ 00000014 003091E5 LDR R3,[R1, #+0] \ 00000018 000053E3 CMP R3,#+0 \ 0000001C 0300000A BEQ ??AddFirstLOGQ_0 130 while(p->next) 131 p = p->next; \ ??AddFirstLOGQ_1: \ 00000020 001091E5 LDR R1,[R1, #+0] \ 00000024 003091E5 LDR R3,[R1, #+0] \ 00000028 000053E3 CMP R3,#+0 \ 0000002C FBFFFF1A BNE ??AddFirstLOGQ_1 132 p->next = q; \ ??AddFirstLOGQ_0: \ 00000030 002081E5 STR R2,[R1, #+0] 133 ActivateLastX(t->log); \ 00000034 800090E5 LDR R0,[R0, #+128] \ 00000038 ........ BL ActivateLastX 134 } \ 0000003C 0080BDE8 POP {PC} ;; return 135 136 //Удаляем лог с заданного элемента \ In segment CODE, align 4, keep-with-next 137 void DeleteLOGQ(LOGQ *p) 138 { \ DeleteLOGQ: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0040B0E1 MOVS R4,R0 139 if(!p) return; \ 00000008 1080BD08 POPEQ {R4,PC} 140 if(p->next) DeleteLOGQ(p->next); \ 0000000C 000094E5 LDR R0,[R4, #+0] \ 00000010 000050E3 CMP R0,#+0 \ 00000014 0000000A BEQ ??DeleteLOGQ_0 \ 00000018 F8FFFFEB BL DeleteLOGQ 141 mfree(p); \ ??DeleteLOGQ_0: \ 0000001C 0400A0E1 MOV R0,R4 \ 00000020 150000EF SWI +21 142 } \ 00000024 1080BDE8 POP {R4,PC} ;; return 143 144 //Проверка что в логе не только иксстасусы \ In segment CODE, align 4, keep-with-next 145 int CheckLOGQ(CLIST *t) 146 { \ CheckLOGQ: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0040A0E1 MOV R4,R0 147 LOGQ *p = t->log; \ 00000008 800094E5 LDR R0,[R4, #+128] \ 0000000C 0010B0E1 MOVS R1,R0 148 if(!p) return 0; \ 00000010 0200001A BNE ??CheckLOGQ_0 \ 00000014 0000A0E3 MOV R0,#+0 \ 00000018 1080BDE8 POP {R4,PC} 149 for(; p->next && (p->type&0x0F)==3; p=p->next); \ ??CheckLOGQ_1: \ 0000001C 0210A0E1 MOV R1,R2 \ ??CheckLOGQ_0: \ 00000020 002091E5 LDR R2,[R1, #+0] \ 00000024 000052E3 CMP R2,#+0 \ 00000028 0300000A BEQ ??CheckLOGQ_2 \ 0000002C 0C3091E5 LDR R3,[R1, #+12] \ 00000030 0F3003E2 AND R3,R3,#0xF \ 00000034 030053E3 CMP R3,#+3 \ 00000038 F7FFFF0A BEQ ??CheckLOGQ_1 150 if(p->next) \ ??CheckLOGQ_2: \ 0000003C 000052E3 CMP R2,#+0 \ 00000040 0400000A BEQ ??CheckLOGQ_3 151 if((p->type&0x0F)!=3) \ 00000044 0C1091E5 LDR R1,[R1, #+12] \ 00000048 0F1001E2 AND R1,R1,#0xF \ 0000004C 030051E3 CMP R1,#+3 152 return 1; \ 00000050 0100A013 MOVNE R0,#+1 \ 00000054 1080BD18 POPNE {R4,PC} 153 DeleteLOGQ(t->log); \ ??CheckLOGQ_3: \ 00000058 ........ BL DeleteLOGQ 154 t->log = 0; \ 0000005C 0000A0E3 MOV R0,#+0 \ 00000060 800084E5 STR R0,[R4, #+128] 155 return 0; \ 00000064 1080BDE8 POP {R4,PC} ;; return 156 } 157 \ In segment CODE, align 4, keep-with-next 158 int GetHistory(CLIST *t, int bufsize) 159 { \ GetHistory: \ 00000000 F14F2DE9 PUSH {R0,R4-R11,LR} 160 LOGQ *log, *head; 161 static const char *delim = "\r\n--------------<>-000"; 162 volatile int hFile; 163 unsigned int io_error = 0; 164 char fullname[128], *s, *b, *e, *text, *str, *buf; 165 int i, delimlen = strlen(delim)+3, direction; \ 00000004 ........ LDR R5,??DataTable4 ;; `?` \ 00000008 90D04DE2 SUB SP,SP,#+144 \ 0000000C 0180A0E1 MOV R8,R1 \ 00000010 0040A0E3 MOV R4,#+0 \ 00000014 08408DE5 STR R4,[SP, #+8] \ 00000018 3C0085E2 ADD R0,R5,#+60 \ 0000001C 1B0000EF SWI +27 \ 00000020 036080E2 ADD R6,R0,#+3 166 // unsigned uin = t->uin; 167 168 if(CheckLOGQ(t)) return 0; \ 00000024 90009DE5 LDR R0,[SP, #+144] \ 00000028 ........ BL CheckLOGQ \ 0000002C 000050E3 CMP R0,#+0 \ 00000030 8700001A BNE ??GetHistory_0 169 170 buf = text = malloc(bufsize); \ 00000034 0800A0E1 MOV R0,R8 \ 00000038 140000EF SWI +20 171 text[0] = 0; 172 text[bufsize-1] = 0; 173 #ifdef EVILFOX 174 snprintf(fullname,127,"%s\\%u\\%s(%d).txt", HIST_PATH, UIN, t->name, t->uin); 175 #else 176 // if(UIN_WRITE2) 177 // { 178 /*WSHDR *name=AllocWS(64);; 179 // wsprintf(name,"%s",t->name); 180 ascii2ws(name,t->name); 181 */ 182 if(HISTORY_TYPE) \ 0000003C ........ LDR R3,??DataTable5 ;; HIST_PATH \ 00000040 0070A0E1 MOV R7,R0 \ 00000044 0C708DE5 STR R7,[SP, #+12] \ 00000048 0040C7E5 STRB R4,[R7, #+0] \ 0000004C 070088E0 ADD R0,R8,R7 \ 00000050 014040E5 STRB R4,[R0, #-1] \ 00000054 ........ LDR R0,??DataTable6 ;; HISTORY_TYPE \ 00000058 000090E5 LDR R0,[R0, #+0] \ 0000005C 000050E3 CMP R0,#+0 \ 00000060 90009DE5 LDR R0,[SP, #+144] \ 00000064 0C0090E5 LDR R0,[R0, #+12] \ 00000068 01002DE9 PUSH {R0} \ 0000006C 94009DE5 LDR R0,[SP, #+148] \ 00000070 140080E2 ADD R0,R0,#+20 \ 00000074 01002DE9 PUSH {R0} \ 00000078 0800000A BEQ ??GetHistory_1 183 snprintf(fullname,127,"%s\\%u\\%s(%d).txt", HIST_PATH, UIN, t->name, t->uin); \ 0000007C ........ LDR R0,??DataTable7 ;; UIN \ 00000080 282085E2 ADD R2,R5,#+40 \ 00000084 000090E5 LDR R0,[R0, #+0] \ 00000088 7F10A0E3 MOV R1,#+127 \ 0000008C 01002DE9 PUSH {R0} \ 00000090 1C008DE2 ADD R0,SP,#+28 \ 00000094 1B0100EF SWI +283 \ 00000098 0CD08DE2 ADD SP,SP,#+12 \ 0000009C 040000EA B ??GetHistory_2 184 else 185 snprintf(fullname,127,"%s\\%s(%d).txt", HIST_PATH, t->name, t->uin); \ ??GetHistory_1: \ 000000A0 082085E2 ADD R2,R5,#+8 \ 000000A4 7F10A0E3 MOV R1,#+127 \ 000000A8 18008DE2 ADD R0,SP,#+24 \ 000000AC 1B0100EF SWI +283 \ 000000B0 08D08DE2 ADD SP,SP,#+8 186 // } 187 // else 188 // { 189 // if(HISTORY_TYPE) 190 // snprintf(fullname,127,"%s\\%u\\%u.txt", HIST_PATH, UIN, t->uin); 191 // else 192 // snprintf(fullname,127,"%s\\%u.txt", HIST_PATH, t->uin); 193 // } 194 #endif 195 hFile = fopen(fullname,A_ReadOnly + A_BIN,P_READ, &io_error); \ ??GetHistory_2: \ 000000B4 08308DE2 ADD R3,SP,#+8 \ 000000B8 8020A0E3 MOV R2,#+128 \ 000000BC 801CA0E3 MOV R1,#+32768 \ 000000C0 10008DE2 ADD R0,SP,#+16 \ 000000C4 0A0000EF SWI +10 \ 000000C8 00008DE5 STR R0,[SP, #+0] \ 000000CC 00009DE5 LDR R0,[SP, #+0] \ 000000D0 010070E3 CMN R0,#+1 \ 000000D4 5C00000A BEQ ??GetHistory_3 196 if(hFile!=-1) 197 { 198 lseek(hFile, -(bufsize-1), S_END, &io_error, &io_error); \ 000000D8 08008DE2 ADD R0,SP,#+8 \ 000000DC 01002DE9 PUSH {R0} \ 000000E0 018048E2 SUB R8,R8,#+1 \ 000000E4 0C308DE2 ADD R3,SP,#+12 \ 000000E8 0220A0E3 MOV R2,#+2 \ 000000EC 04009DE5 LDR R0,[SP, #+4] \ 000000F0 001068E2 RSB R1,R8,#+0 \ 000000F4 0F0000EF SWI +15 199 i = fread(hFile, text, bufsize-1, &io_error); 200 text[i] = 0; \ 000000F8 04009DE5 LDR R0,[SP, #+4] \ 000000FC 0C308DE2 ADD R3,SP,#+12 \ 00000100 0820A0E1 MOV R2,R8 \ 00000104 0710A0E1 MOV R1,R7 \ 00000108 0B0000EF SWI +11 \ 0000010C 0740C0E7 STRB R4,[R0, +R7] 201 fclose(hFile, &io_error); \ 00000110 04009DE5 LDR R0,[SP, #+4] \ 00000114 0C108DE2 ADD R1,SP,#+12 \ 00000118 0D0000EF SWI +13 202 s = strstr(text, delim); \ 0000011C 3C1085E2 ADD R1,R5,#+60 \ 00000120 0700A0E1 MOV R0,R7 \ 00000124 180100EF SWI +280 \ 00000128 0080A0E1 MOV R8,R0 \ 0000012C 4B0F8FE2 ADR R0,??GetHistory_4 ;; "" 203 204 head = NewLOGQ(""); \ 00000130 ........ _BLF NewLOGQ,??NewLOGQ??rA \ 00000134 08008DE5 STR R0,[SP, #+8] 205 head->next = 0; \ 00000138 004080E5 STR R4,[R0, #+0] \ 0000013C 04D08DE2 ADD SP,SP,#+4 \ 00000140 100000EA B ??GetHistory_5 206 207 while(s && text) 208 { 209 direction = (*(s+delimlen-3))-0x30; 210 text = s+delimlen; 211 s = strstr(text, delim); 212 e = !s?(text+strlen(text)):s; 213 214 str = malloc(e-text+1); 215 if(e-text > 0) memcpy(str, text, e-text); 216 str[e-text] = 0; 217 218 // snprintf(fullname, 127, "\r\n-----\r\n%08X\r\n%08X, %d\r\n%08X, %d\r\n----\r\n", text, e, direction, s, e-text); 219 b = strstr(str, "\r\n"); 220 221 222 // log = NewLOGQ(fullname); 223 if(b) 224 { 225 log = NewLOGQ(b+2); 226 if(b-str >= 0) memcpy(log->hdr, str, b-str); 227 log->hdr[b-str] = 0; 228 } 229 else 230 { 231 log = NewLOGQ(""); \ ??GetHistory_6: \ 00000144 450F8FE2 ADR R0,??GetHistory_4 ;; "" \ 00000148 ........ _BLF NewLOGQ,??NewLOGQ??rA \ 0000014C 00A0A0E1 MOV R10,R0 232 strcpy(log->hdr, str); \ 00000150 0910A0E1 MOV R1,R9 \ 00000154 10008AE2 ADD R0,R10,#+16 \ 00000158 1A0000EF SWI +26 233 } 234 235 log->type = direction|0x10; \ ??GetHistory_7: \ 0000015C 00009DE5 LDR R0,[SP, #+0] 236 log->acked = 0; 237 log->ID=0xFFFFFFFF; 238 239 AddLOGQ(&head, log); \ 00000160 0A10A0E1 MOV R1,R10 \ 00000164 100080E3 ORR R0,R0,#0x10 \ 00000168 0C008AE5 STR R0,[R10, #+12] \ 0000016C 04408AE5 STR R4,[R10, #+4] \ 00000170 0400E0E1 MVN R0,R4 \ 00000174 08008AE5 STR R0,[R10, #+8] \ 00000178 04008DE2 ADD R0,SP,#+4 \ 0000017C ........ _BLF AddLOGQ,??AddLOGQ??rA 240 241 //mfree(log); 242 mfree(str); \ 00000180 0900A0E1 MOV R0,R9 \ 00000184 150000EF SWI +21 \ ??GetHistory_5: \ 00000188 000058E3 CMP R8,#+0 \ 0000018C 00005713 CMPNE R7,#+0 \ 00000190 2700000A BEQ ??GetHistory_8 \ 00000194 081086E0 ADD R1,R6,R8 \ 00000198 031051E5 LDRB R1,[R1, #-3] \ 0000019C 087086E0 ADD R7,R6,R8 \ 000001A0 0700A0E1 MOV R0,R7 \ 000001A4 301041E2 SUB R1,R1,#+48 \ 000001A8 00108DE5 STR R1,[SP, #+0] \ 000001AC 3C1085E2 ADD R1,R5,#+60 \ 000001B0 180100EF SWI +280 \ 000001B4 0080B0E1 MOVS R8,R0 \ 000001B8 0200001A BNE ??GetHistory_9 \ 000001BC 0700A0E1 MOV R0,R7 \ 000001C0 1B0000EF SWI +27 \ 000001C4 070080E0 ADD R0,R0,R7 \ ??GetHistory_9: \ 000001C8 07A040E0 SUB R10,R0,R7 \ 000001CC 01008AE2 ADD R0,R10,#+1 \ 000001D0 140000EF SWI +20 \ 000001D4 0090A0E1 MOV R9,R0 \ 000001D8 01005AE3 CMP R10,#+1 \ 000001DC 020000BA BLT ??GetHistory_10 \ 000001E0 0A20A0E1 MOV R2,R10 \ 000001E4 0710A0E1 MOV R1,R7 \ 000001E8 1E0100EF SWI +286 \ ??GetHistory_10: \ 000001EC 0940CAE7 STRB R4,[R10, +R9] \ 000001F0 1B1F8FE2 ADR R1,??GetHistory_4+0x4 ;; "\r\n" \ 000001F4 0900A0E1 MOV R0,R9 \ 000001F8 180100EF SWI +280 \ 000001FC 00B0B0E1 MOVS R11,R0 \ 00000200 CFFFFF0A BEQ ??GetHistory_6 \ 00000204 02008BE2 ADD R0,R11,#+2 \ 00000208 ........ _BLF NewLOGQ,??NewLOGQ??rA \ 0000020C 00A0A0E1 MOV R10,R0 \ 00000210 09B05BE0 SUBS R11,R11,R9 \ 00000214 0300004A BMI ??GetHistory_11 \ 00000218 0B20A0E1 MOV R2,R11 \ 0000021C 0910A0E1 MOV R1,R9 \ 00000220 10008AE2 ADD R0,R10,#+16 \ 00000224 1E0100EF SWI +286 \ ??GetHistory_11: \ 00000228 0A008BE0 ADD R0,R11,R10 \ 0000022C 1040C0E5 STRB R4,[R0, #+16] \ 00000230 C9FFFFEA B ??GetHistory_7 243 } 244 AddFirstLOGQ(t, head->next); \ ??GetHistory_8: \ 00000234 04009DE5 LDR R0,[SP, #+4] \ 00000238 001090E5 LDR R1,[R0, #+0] \ 0000023C 90009DE5 LDR R0,[SP, #+144] \ 00000240 ........ BL AddFirstLOGQ 245 mfree(head); \ 00000244 04009DE5 LDR R0,[SP, #+4] \ 00000248 150000EF SWI +21 246 247 } 248 249 mfree(buf); \ ??GetHistory_3: \ 0000024C 0C009DE5 LDR R0,[SP, #+12] \ 00000250 150000EF SWI +21 250 return 0; \ ??GetHistory_0: \ 00000254 0000A0E3 MOV R0,#+0 \ 00000258 94D08DE2 ADD SP,SP,#+148 \ 0000025C F08FBDE8 POP {R4-R11,PC} ;; return \ ??GetHistory_4: \ 00000260 00000000 DC8 "",+0,+0,+0 \ 00000264 0D0A0000 DC8 "\r\n",+0 251 } 252 \ In segment CODE, align 4, keep-with-next 253 void GetStatusById(char *buffer, int id) 254 { 255 256 // ??? Тут надо разбираться со статусами 257 // Похоже, не все коды верные... 258 switch(id) \ GetStatusById: \ 00000000 7C309FE5 LDR R3,??GetStatusById_1+0xC ;; `?` \ 00000004 00402DE9 PUSH {LR} \ 00000008 0120A0E1 MOV R2,R1 \ 0000000C 070052E3 CMP R2,#+7 \ 00000010 1400008A BHI ??GetStatusById_2 \ 00000014 01CF8FE2 ADR R12,??GetStatusById_0 \ 00000018 02C0DCE7 LDRB R12,[R12, R2] \ 0000001C 0CF18FE0 ADD PC,PC,R12, LSL #+2 \ ??GetStatusById_0: \ 00000020 01030609 DC8 +1,+3,+6,+9 \ 00000024 0B0D010F DC8 +11,+13,+1,+15 259 { 260 case 0: {strcpy(buffer,"Online");break;} \ ??GetStatusById_3: \ 00000028 0310A0E1 MOV R1,R3 \ 0000002C 030000EA B ??GetStatusById_4 261 case 1: {strcpy(buffer, "Invisible");break;} \ ??GetStatusById_5: \ 00000030 081083E2 ADD R1,R3,#+8 \ 00000034 1A0000EF SWI +26 \ 00000038 0080BDE8 POP {PC} 262 case 2: {strcpy(buffer, "Away");break;} \ ??GetStatusById_6: \ 0000003C 141083E2 ADD R1,R3,#+20 \ ??GetStatusById_4: \ 00000040 1A0000EF SWI +26 \ 00000044 0080BDE8 POP {PC} 263 case 3: {strcpy(buffer, "N/A");break;} \ ??GetStatusById_7: \ 00000048 0A1F8FE2 ADR R1,??GetStatusById_1 ;; "N/A" \ 0000004C FBFFFFEA B ??GetStatusById_4 264 case 4: {strcpy(buffer, "Occupied");break;} \ ??GetStatusById_8: \ 00000050 1C1083E2 ADD R1,R3,#+28 \ 00000054 F9FFFFEA B ??GetStatusById_4 265 case 5: {strcpy(buffer, "DND");break;} \ ??GetStatusById_9: \ 00000058 071F8FE2 ADR R1,??GetStatusById_1+0x4 ;; "DND" \ 0000005C F7FFFFEA B ??GetStatusById_4 266 case 6: {strcpy(buffer, "Online");break;} 267 case 7: {strcpy(buffer, "FFC");break;} \ ??GetStatusById_10: \ 00000060 061F8FE2 ADR R1,??GetStatusById_1+0x8 ;; "FFC" \ 00000064 F5FFFFEA B ??GetStatusById_4 268 default: {sprintf(buffer, "UNK: %d", id);} \ ??GetStatusById_2: \ 00000068 0120A0E1 MOV R2,R1 \ 0000006C 281083E2 ADD R1,R3,#+40 \ 00000070 160000EF SWI +22 269 } 270 } \ 00000074 0080BDE8 POP {PC} ;; return \ ??GetStatusById_1: \ 00000078 4E2F4100 DC8 "N/A" \ 0000007C 444E4400 DC8 "DND" \ 00000080 46464300 DC8 "FFC" \ 00000084 ........ DC32 `?` 271 \ In segment CODE, align 4, keep-with-next 272 void LogStatusChange(CLIST *CListEx) 273 { \ LogStatusChange: \ 00000000 F0402DE9 PUSH {R4-R7,LR} \ 00000004 0040A0E1 MOV R4,R0 274 extern int LOG_STATCH; 275 if(!LOG_STATCH){return;} \ 00000008 B0009FE5 LDR R0,??LogStatusChange_0+0x4 ;; LOG_STATCH \ 0000000C E8D04DE2 SUB SP,SP,#+232 \ 00000010 000090E5 LDR R0,[R0, #+0] \ 00000014 000050E3 CMP R0,#+0 \ 00000018 2500000A BEQ ??LogStatusChange_1 276 if(CListEx->state>7){return;} \ 0000001C B405D4E1 LDRH R0,[R4, #+84] \ 00000020 080050E3 CMP R0,#+8 \ 00000024 2200002A BCS ??LogStatusChange_1 277 if(CListEx->log==NULL){return;} \ 00000028 800094E5 LDR R0,[R4, #+128] \ 0000002C 000050E3 CMP R0,#+0 \ 00000030 1F00000A BEQ ??LogStatusChange_1 278 char hdr[] = "(System message) "; \ 00000034 88109FE5 LDR R1,??LogStatusChange_0+0x8 ;; `?` \ 00000038 D4008DE2 ADD R0,SP,#+212 \ 0000003C 2C5091E8 LDM R1,{R2,R3,R5,R12,LR} 279 char msg[] = "%s меняет статус на %s\r\n"; \ 00000040 80109FE5 LDR R1,??LogStatusChange_0+0xC ;; `?name) \ 00000054 140094E2 ADDS R0,R4,#+20 \ 00000058 0300000A BEQ ??LogStatusChange_2 284 { 285 strcpy(nickname, CListEx->name); \ 0000005C 141084E2 ADD R1,R4,#+20 \ 00000060 78008DE2 ADD R0,SP,#+120 \ 00000064 1A0000EF SWI +26 \ 00000068 040000EA B ??LogStatusChange_3 286 } 287 else 288 { 289 snprintf(nickname,63, "%u", CListEx->uin); \ ??LogStatusChange_2: \ 0000006C 0C3094E5 LDR R3,[R4, #+12] \ 00000070 112F8FE2 ADR R2,??LogStatusChange_0 ;; "%u" \ 00000074 3F10A0E3 MOV R1,#+63 \ 00000078 78008DE2 ADD R0,SP,#+120 \ 0000007C 1B0100EF SWI +283 290 } 291 GetStatusById(status, CListEx->state); \ ??LogStatusChange_3: \ 00000080 B415D4E1 LDRH R1,[R4, #+84] \ 00000084 0D00A0E1 MOV R0,SP \ 00000088 ........ BL GetStatusById 292 sprintf(message, msg, nickname, status); \ 0000008C 0D30A0E1 MOV R3,SP \ 00000090 78208DE2 ADD R2,SP,#+120 \ 00000094 B8108DE2 ADD R1,SP,#+184 \ 00000098 14008DE2 ADD R0,SP,#+20 \ 0000009C 160000EF SWI +22 293 Add2History(CListEx, hdr, message, 0); \ 000000A0 0030A0E3 MOV R3,#+0 \ 000000A4 14208DE2 ADD R2,SP,#+20 \ 000000A8 D4108DE2 ADD R1,SP,#+212 \ 000000AC 0400A0E1 MOV R0,R4 \ 000000B0 ........ BL Add2History 294 } \ ??LogStatusChange_1: \ 000000B4 E8D08DE2 ADD SP,SP,#+232 ;; stack cleaning \ 000000B8 F080BDE8 POP {R4-R7,PC} ;; return \ ??LogStatusChange_0: \ 000000BC 25750000 DC8 "%u",+0 \ 000000C0 ........ DC32 LOG_STATCH \ 000000C4 ........ DC32 `?` \ 000000C8 ........ DC32 `?` \ In segment CODE, align 4, keep-with-next \ ??DataTable5: \ 00000000 ........ DC32 HIST_PATH \ In segment CODE, align 4, keep-with-next \ ??DataTable6: \ 00000000 ........ DC32 HISTORY_TYPE \ In segment CODE, align 4, keep-with-next \ ??DataTable7: \ 00000000 ........ DC32 UIN \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 25735C257500 DC8 "%s\\%u" \ 00000006 0000 DC8 0, 0 \ 00000008 25735C257328 DC8 "%s\\%s(%d).txt" \ 2564292E7478 \ 7400 \ 00000016 0000 DC8 0, 0 \ 00000018 CEF8E8E1EAE0 DC8 "\316\370\350\341\352\340 I/O #%u" \ 20492F4F2020 \ 23257500 \ 00000028 25735C25755C DC8 "%s\\%u\\%s(%d).txt" \ 257328256429 \ 2E74787400 \ 00000039 000000 DC8 0, 0, 0 \ 0000003C 0D0A2D2D2D2D DC8 "\015\012--------------<>-000" \ 2D2D2D2D2D2D \ 2D2D2D2D3C3E \ 2D30303000 \ 00000053 00 DC8 0 \ In segment DATA_C, align 1, align-sorted \ 00000000 257300 DC8 "%s" \ In segment DATA_C, align 4, align-sorted \ `?-%0...">`: \ 00000000 0D0A2D2D2D2D DC8 "\015\012--------------<>-%04d\015\012" \ 2D2D2D2D2D2D \ 2D2D2D2D3C3E \ 2D253034640D \ 0A00 \ 0000001A 0000 DC8 0, 0 \ In segment DATA_C, align 1, align-sorted \ 00000000 00 DC8 "" \ In segment DATA_C, align 1, align-sorted \ 00000000 0D0A00 DC8 "\015\012" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4F6E6C696E65 DC8 "Online" \ 00 \ 00000007 00 DC8 0 \ 00000008 496E76697369 DC8 "Invisible" \ 626C6500 \ 00000012 0000 DC8 0, 0 \ 00000014 4177617900 DC8 "Away" \ 00000019 000000 DC8 0, 0, 0 \ 0000001C 4F6363757069 DC8 "Occupied" \ 656400 \ 00000025 000000 DC8 0, 0, 0 \ 00000028 554E4B3A2025 DC8 "UNK: %d" \ 6400 \ In segment DATA_C, align 4, align-sorted \ 00000000 4E2F4100 DC8 "N/A" \ In segment DATA_C, align 4, align-sorted \ 00000000 444E4400 DC8 "DND" \ In segment DATA_C, align 4, align-sorted \ 00000000 46464300 DC8 "FFC" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 285379737465 DC8 "(System message) " \ 6D206D657373 \ 616765292000 \ 00000012 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `? 84 ? 3 ?-%0..."> 28 ? 1 ? 3 ? 48 ? 4 ? 4 ? 4 ? 20 ? 3 Others 60 1 768 bytes in segment CODE 230 bytes in segment DATA_C 1 708 bytes of CODE memory (+ 60 bytes shared) 230 bytes of CONST memory Errors: none Warnings: none