############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 08/Jul/2011 13:40:57 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\history.c # # Command line = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\history.c -D # # NEWSGOLD -D ELKA -D GUI_INTERFACE -D ICONBAR -D # # kluchnik --preprocess D:\pasha\elf\_MY_PROJECT_\_NAT # # ICQ2\kluchnik\List\ -lC D:\pasha\elf\_MY_PROJECT_\_N # # ATICQ2\kluchnik\List\ -o D:\pasha\elf\_MY_PROJECT_\_ # # NATICQ2\kluchnik\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_\_NATICQ2\kluchnik\List\his # # tory.lst # # Object file = D:\pasha\elf\_MY_PROJECT_\_NATICQ2\kluchnik\Obj\hist # # ory.r79 # # # # # ############################################################################## D:\pasha\elf\_MY_PROJECT_\_NATICQ2\history.c 1 #include "../inc/swilib.h" 2 #include "naticq.h" 3 #include "history.h" 4 #include "language.h" 5 #include "lang.h" 6 7 8 extern const char HIST_PATH[64]; 9 extern const int LOG_ALL; 10 extern const int HISTORY_TYPE; 11 extern const unsigned int UIN; 12 extern const char TEMPLATES_PATH[]; 13 /* 14 Добавлет строку в историю контакта CLIST 15 */ 16 17 \ In segment CODE, align 4, keep-with-next 18 static do_logwrite(unsigned int uin, char *text) 19 { \ do_logwrite: \ 00000000 F0402DE9 PUSH {R4-R7,LR} 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) \ 00000004 ........ LDR R6,??DataTable4 ;; `?` \ 00000008 ........ LDR R7,??DataTable5 ;; HIST_PATH \ 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 0010A0E3 MOV R1,#+0 \ 00000024 00108DE5 STR R1,[SP, #+0] \ 00000028 000050E3 CMP R0,#+0 \ 0000002C 0F00000A BEQ ??do_logwrite_0 27 { 28 if(HIST_PATH[strlen(HIST_PATH)-1] == '\\') \ 00000030 0700A0E1 MOV R0,R7 \ 00000034 1B0000EF SWI +27 \ 00000038 ........ LDR R1,??DataTable7 ;; UIN \ 0000003C 070080E0 ADD R0,R0,R7 \ 00000040 001091E5 LDR R1,[R1, #+0] \ 00000044 010050E5 LDRB R0,[R0, #-1] \ 00000048 02002DE9 PUSH {R1} \ 0000004C 5C0050E3 CMP R0,#+92 \ 00000050 0730A0E1 MOV R3,R7 \ 00000054 08208612 ADDNE R2,R6,#+8 29 snprintf(hist_path,127,"%s%u",HIST_PATH, UIN); \ 00000058 0620A001 MOVEQ R2,R6 \ 0000005C 7F10A0E3 MOV R1,#+127 \ 00000060 90008DE2 ADD R0,SP,#+144 \ 00000064 1B0100EF SWI +283 \ 00000068 04D08DE2 ADD SP,SP,#+4 \ 0000006C 040000EA B ??do_logwrite_1 30 else 31 snprintf(hist_path,127,"%s\\%u",HIST_PATH, UIN); 32 } 33 else 34 snprintf(hist_path,127,"%s",HIST_PATH); \ ??do_logwrite_0: \ 00000070 0730A0E1 MOV R3,R7 \ 00000074 342F8FE2 ADR R2,??do_logwrite_2 ;; "%s" \ 00000078 7F10A0E3 MOV R1,#+127 \ 0000007C 8C008DE2 ADD R0,SP,#+140 \ 00000080 1B0100EF SWI +283 35 if (!isdir(hist_path,&ul)) \ ??do_logwrite_1: \ 00000084 08108DE2 ADD R1,SP,#+8 \ 00000088 8C008DE2 ADD R0,SP,#+140 \ 0000008C 910000EF SWI +145 \ 00000090 000050E3 CMP R0,#+0 \ 00000094 0200001A BNE ??do_logwrite_3 36 { 37 mkdir(hist_path,&ul); \ 00000098 08108DE2 ADD R1,SP,#+8 \ 0000009C 8C008DE2 ADD R0,SP,#+140 \ 000000A0 100000EF SWI +16 38 } 39 snprintf(fullname,127,"%s\\%u.txt", hist_path, uin); \ ??do_logwrite_3: \ 000000A4 10002DE9 PUSH {R4} \ 000000A8 90308DE2 ADD R3,SP,#+144 \ 000000AC 102086E2 ADD R2,R6,#+16 \ 000000B0 7F10A0E3 MOV R1,#+127 \ 000000B4 10008DE2 ADD R0,SP,#+16 \ 000000B8 1B0100EF SWI +283 40 // Открываем файл на дозапись и создаём в случае неудачи 41 hFile = fopen(fullname,A_ReadWrite + A_Create + A_Append + A_BIN,P_READ+P_WRITE, &io_error); \ 000000BC 04308DE2 ADD R3,SP,#+4 \ 000000C0 602FA0E3 MOV R2,#+384 \ 000000C4 0A10A0E3 MOV R1,#+10 \ 000000C8 811C81E3 ORR R1,R1,#0x8100 \ 000000CC 10008DE2 ADD R0,SP,#+16 \ 000000D0 0A0000EF SWI +10 \ 000000D4 08008DE5 STR R0,[SP, #+8] 42 if(hFile!=-1) \ 000000D8 08009DE5 LDR R0,[SP, #+8] \ 000000DC 04D08DE2 ADD SP,SP,#+4 \ 000000E0 010070E3 CMN R0,#+1 \ 000000E4 0A00000A BEQ ??do_logwrite_4 43 { 44 fwrite(hFile, text, strlen(text), &io_error); \ 000000E8 0500A0E1 MOV R0,R5 \ 000000EC 1B0000EF SWI +27 \ 000000F0 0020A0E1 MOV R2,R0 \ 000000F4 04009DE5 LDR R0,[SP, #+4] \ 000000F8 0D30A0E1 MOV R3,SP \ 000000FC 0510A0E1 MOV R1,R5 \ 00000100 0C0000EF SWI +12 45 fclose(hFile, &io_error); \ 00000104 04009DE5 LDR R0,[SP, #+4] \ 00000108 0D10A0E1 MOV R1,SP \ 0000010C 0D0000EF SWI +13 \ 00000110 090000EA B ??do_logwrite_5 46 } 47 else 48 { 49 snprintf(error,35, LG_HISTIOERR, io_error); \ ??do_logwrite_4: \ 00000114 00309DE5 LDR R3,[SP, #+0] \ 00000118 1C2086E2 ADD R2,R6,#+28 \ 0000011C 2310A0E3 MOV R1,#+35 \ 00000120 430F8DE2 ADD R0,SP,#+268 \ 00000124 1B0100EF SWI +283 50 LockSched(); \ 00000128 460100EF SWI +326 51 ShowMSG(1,(int)error); \ 0000012C 431F8DE2 ADD R1,SP,#+268 \ 00000130 0100A0E3 MOV R0,#+1 \ 00000134 480100EF SWI +328 52 UnlockSched(); \ 00000138 470100EF SWI +327 53 } 54 mfree(text); \ ??do_logwrite_5: \ 0000013C 0500A0E1 MOV R0,R5 \ 00000140 150000EF SWI +21 55 } \ 00000144 4CDF8DE2 ADD SP,SP,#+304 \ 00000148 F080BDE8 POP {R4-R7,PC} ;; return \ ??do_logwrite_2: \ 0000014C 25730000 DC8 "%s",+0 56 \ In segment CODE, align 4, keep-with-next 57 void Add2History(CLIST *CListEx, char *header, char *message, int direction) 58 { \ Add2History: \ 00000000 F0432DE9 PUSH {R4-R9,LR} \ 00000004 0040A0E1 MOV R4,R0 59 static const char *delim = "\r\n--------------<>-%04d\r\n"; 60 int len; 61 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} 62 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 63 char *text=malloc(len+1); \ 0000004C 010080E2 ADD R0,R0,#+1 \ 00000050 140000EF SWI +20 \ 00000054 0090A0E1 MOV R9,R0 64 sprintf(text,delim,direction); \ 00000058 0720A0E1 MOV R2,R7 \ 0000005C 0810A0E1 MOV R1,R8 \ 00000060 160000EF SWI +22 65 strcat(text,header); \ 00000064 0510A0E1 MOV R1,R5 \ 00000068 0900A0E1 MOV R0,R9 \ 0000006C 170000EF SWI +23 66 strcat(text,message); \ 00000070 0610A0E1 MOV R1,R6 \ 00000074 0900A0E1 MOV R0,R9 \ 00000078 170000EF SWI +23 67 SUBPROC((void*)do_logwrite,CListEx->uin,text); \ 0000007C 0C1094E5 LDR R1,[R4, #+12] \ 00000080 10009FE5 LDR R0,??Add2History_0+0x8 ;; do_logwrite \ 00000084 0920A0E1 MOV R2,R9 \ 00000088 710100EF SWI +369 68 } \ 0000008C F083BDE8 POP {R4-R9,PC} ;; return \ ??Add2History_0: \ 00000090 ........ DC32 LOG_ALL \ 00000094 ........ DC32 `?-%0...">` \ 00000098 ........ DC32 do_logwrite 69 70 extern LOGQ *NewLOGQ(const char *s); 71 extern int AddLOGQ(LOGQ **queue, LOGQ *p); 72 73 //Делает ярким последний икс-статус, а остальные тусклыми \ In segment CODE, align 4, keep-with-next 74 void ActivateLastX(LOGQ *p) 75 { 76 LOGQ *q = p, *lastX = 0; \ ActivateLastX: \ 00000000 0010A0E3 MOV R1,#+0 \ 00000004 000050E3 CMP R0,#+0 \ 00000008 1EFF2F01 BXEQ LR 77 while(q) 78 { 79 if((q->type&0x0F) == 3) \ ??ActivateLastX_0: \ 0000000C 0C2090E5 LDR R2,[R0, #+12] \ 00000010 0F2002E2 AND R2,R2,#0xF \ 00000014 030052E3 CMP R2,#+3 80 { 81 lastX = q; \ 00000018 0010A001 MOVEQ R1,R0 82 q->type = 0x13; \ 0000001C 1320A003 MOVEQ R2,#+19 \ 00000020 0C208005 STREQ R2,[R0, #+12] 83 } 84 q = q->next; \ 00000024 000090E5 LDR R0,[R0, #+0] 85 } \ 00000028 000050E3 CMP R0,#+0 \ 0000002C F6FFFF1A BNE ??ActivateLastX_0 86 if(lastX) lastX->type = 3; \ 00000030 000051E3 CMP R1,#+0 \ 00000034 0300A013 MOVNE R0,#+3 \ 00000038 0C008115 STRNE R0,[R1, #+12] 87 } \ 0000003C 1EFF2FE1 BX LR ;; return 88 89 //Добавить элемент в лог первым \ In segment CODE, align 4, keep-with-next 90 void AddFirstLOGQ(CLIST *t, LOGQ *p) 91 { \ AddFirstLOGQ: \ 00000000 00402DE9 PUSH {LR} 92 LOGQ *q = t->log; \ 00000004 682090E5 LDR R2,[R0, #+104] 93 if(!p) return; \ 00000008 000051E3 CMP R1,#+0 \ 0000000C 0080BD08 POPEQ {PC} 94 t->log = p; \ 00000010 681080E5 STR R1,[R0, #+104] \ 00000014 003091E5 LDR R3,[R1, #+0] \ 00000018 000053E3 CMP R3,#+0 \ 0000001C 0300000A BEQ ??AddFirstLOGQ_0 95 while(p->next) 96 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 97 p->next = q; \ ??AddFirstLOGQ_0: \ 00000030 002081E5 STR R2,[R1, #+0] 98 ActivateLastX(t->log); \ 00000034 680090E5 LDR R0,[R0, #+104] \ 00000038 ........ BL ActivateLastX 99 } \ 0000003C 0080BDE8 POP {PC} ;; return 100 101 //Удаляем лог с заданного элемента \ In segment CODE, align 4, keep-with-next 102 void DeleteLOGQ(LOGQ *p) 103 { \ DeleteLOGQ: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0040B0E1 MOVS R4,R0 104 if(!p) return; \ 00000008 1080BD08 POPEQ {R4,PC} 105 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 106 mfree(p); \ ??DeleteLOGQ_0: \ 0000001C 0400A0E1 MOV R0,R4 \ 00000020 150000EF SWI +21 107 } \ 00000024 1080BDE8 POP {R4,PC} ;; return 108 109 //Проверка что в логе не только иксстасусы \ In segment CODE, align 4, keep-with-next 110 int CheckLOGQ(CLIST *t) 111 { \ CheckLOGQ: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0040A0E1 MOV R4,R0 112 LOGQ *p = t->log; \ 00000008 680094E5 LDR R0,[R4, #+104] \ 0000000C 0010B0E1 MOVS R1,R0 113 if(!p) return 0; \ 00000010 0200001A BNE ??CheckLOGQ_0 \ 00000014 0000A0E3 MOV R0,#+0 \ 00000018 1080BDE8 POP {R4,PC} 114 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 115 if(p->next) \ ??CheckLOGQ_2: \ 0000003C 000052E3 CMP R2,#+0 \ 00000040 0400000A BEQ ??CheckLOGQ_3 116 if((p->type&0x0F)!=3) \ 00000044 0C1091E5 LDR R1,[R1, #+12] \ 00000048 0F1001E2 AND R1,R1,#0xF \ 0000004C 030051E3 CMP R1,#+3 117 return 1; \ 00000050 0100A013 MOVNE R0,#+1 \ 00000054 1080BD18 POPNE {R4,PC} 118 DeleteLOGQ(t->log); \ ??CheckLOGQ_3: \ 00000058 ........ BL DeleteLOGQ 119 t->log = 0; \ 0000005C 0000A0E3 MOV R0,#+0 \ 00000060 680084E5 STR R0,[R4, #+104] 120 return 0; \ 00000064 1080BDE8 POP {R4,PC} ;; return 121 } 122 \ In segment CODE, align 4, keep-with-next 123 int GetHistory(CLIST *t, int bufsize) 124 { \ GetHistory: \ 00000000 F14F2DE9 PUSH {R0,R4-R11,LR} 125 LOGQ *log, *head; 126 static const char *delim = "\r\n--------------<>-000"; 127 volatile int hFile; 128 unsigned int io_error = 0; 129 char fullname[128], *s, *b, *e, *text, *str, *buf; 130 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 131 unsigned uin = t->uin; \ 00000024 90009DE5 LDR R0,[SP, #+144] \ 00000028 0C9090E5 LDR R9,[R0, #+12] 132 133 if(CheckLOGQ(t)) return 0; \ 0000002C ........ BL CheckLOGQ \ 00000030 000050E3 CMP R0,#+0 \ 00000034 8200001A BNE ??GetHistory_0 134 135 buf = text = malloc(bufsize); \ 00000038 0800A0E1 MOV R0,R8 \ 0000003C 140000EF SWI +20 136 text[0] = 0; 137 text[bufsize-1] = 0; 138 if(HISTORY_TYPE) \ 00000040 ........ LDR R3,??DataTable5 ;; HIST_PATH \ 00000044 0070A0E1 MOV R7,R0 \ 00000048 0C708DE5 STR R7,[SP, #+12] \ 0000004C 0040C7E5 STRB R4,[R7, #+0] \ 00000050 070088E0 ADD R0,R8,R7 \ 00000054 014040E5 STRB R4,[R0, #-1] \ 00000058 ........ LDR R0,??DataTable6 ;; HISTORY_TYPE \ 0000005C 000090E5 LDR R0,[R0, #+0] \ 00000060 00022DE9 PUSH {R9} \ 00000064 000050E3 CMP R0,#+0 \ 00000068 0800000A BEQ ??GetHistory_1 139 snprintf(fullname,127,"%s\\%u\\%u.txt", HIST_PATH, UIN, uin); \ 0000006C ........ LDR R0,??DataTable7 ;; UIN \ 00000070 2C2085E2 ADD R2,R5,#+44 \ 00000074 000090E5 LDR R0,[R0, #+0] \ 00000078 7F10A0E3 MOV R1,#+127 \ 0000007C 01002DE9 PUSH {R0} \ 00000080 18008DE2 ADD R0,SP,#+24 \ 00000084 1B0100EF SWI +283 \ 00000088 08D08DE2 ADD SP,SP,#+8 \ 0000008C 040000EA B ??GetHistory_2 140 else 141 snprintf(fullname,127,"%s\\%u.txt", HIST_PATH, uin); \ ??GetHistory_1: \ 00000090 102085E2 ADD R2,R5,#+16 \ 00000094 7F10A0E3 MOV R1,#+127 \ 00000098 14008DE2 ADD R0,SP,#+20 \ 0000009C 1B0100EF SWI +283 \ 000000A0 04D08DE2 ADD SP,SP,#+4 142 // Открываем файл на чтение 143 hFile = fopen(fullname,A_ReadOnly + A_BIN,P_READ, &io_error); \ ??GetHistory_2: \ 000000A4 08308DE2 ADD R3,SP,#+8 \ 000000A8 8020A0E3 MOV R2,#+128 \ 000000AC 801CA0E3 MOV R1,#+32768 \ 000000B0 10008DE2 ADD R0,SP,#+16 \ 000000B4 0A0000EF SWI +10 \ 000000B8 00008DE5 STR R0,[SP, #+0] \ 000000BC 00009DE5 LDR R0,[SP, #+0] \ 000000C0 010070E3 CMN R0,#+1 \ 000000C4 5C00000A BEQ ??GetHistory_3 144 if(hFile!=-1) 145 { 146 lseek(hFile, -(bufsize-1), S_END, &io_error, &io_error); \ 000000C8 08008DE2 ADD R0,SP,#+8 \ 000000CC 01002DE9 PUSH {R0} \ 000000D0 018048E2 SUB R8,R8,#+1 \ 000000D4 0C308DE2 ADD R3,SP,#+12 \ 000000D8 0220A0E3 MOV R2,#+2 \ 000000DC 04009DE5 LDR R0,[SP, #+4] \ 000000E0 001068E2 RSB R1,R8,#+0 \ 000000E4 0F0000EF SWI +15 147 i = fread(hFile, text, bufsize-1, &io_error); 148 text[i] = 0; \ 000000E8 04009DE5 LDR R0,[SP, #+4] \ 000000EC 0C308DE2 ADD R3,SP,#+12 \ 000000F0 0820A0E1 MOV R2,R8 \ 000000F4 0710A0E1 MOV R1,R7 \ 000000F8 0B0000EF SWI +11 \ 000000FC 0740C0E7 STRB R4,[R0, +R7] 149 fclose(hFile, &io_error); \ 00000100 04009DE5 LDR R0,[SP, #+4] \ 00000104 0C108DE2 ADD R1,SP,#+12 \ 00000108 0D0000EF SWI +13 150 s = strstr(text, delim); \ 0000010C 3C1085E2 ADD R1,R5,#+60 \ 00000110 0700A0E1 MOV R0,R7 \ 00000114 180100EF SWI +280 \ 00000118 0080A0E1 MOV R8,R0 \ 0000011C 4B0F8FE2 ADR R0,??GetHistory_4 ;; "" 151 152 head = NewLOGQ(""); \ 00000120 ........ _BLF NewLOGQ,??NewLOGQ??rA \ 00000124 08008DE5 STR R0,[SP, #+8] 153 head->next = 0; \ 00000128 004080E5 STR R4,[R0, #+0] \ 0000012C 04D08DE2 ADD SP,SP,#+4 \ 00000130 100000EA B ??GetHistory_5 154 155 while(s && text) 156 { 157 direction = (*(s+delimlen-3))-0x30; 158 text = s+delimlen; 159 s = strstr(text, delim); 160 e = !s?(text+strlen(text)):s; 161 162 str = malloc(e-text+1); 163 if(e-text > 0) memcpy(str, text, e-text); 164 str[e-text] = 0; 165 166 // 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); 167 b = strstr(str, "\r\n"); 168 169 170 // log = NewLOGQ(fullname); 171 if(b) 172 { 173 log = NewLOGQ(b+2); 174 if(b-str >= 0) memcpy(log->hdr, str, b-str); 175 log->hdr[b-str] = 0; 176 } 177 else 178 { 179 log = NewLOGQ(""); \ ??GetHistory_6: \ 00000134 450F8FE2 ADR R0,??GetHistory_4 ;; "" \ 00000138 ........ _BLF NewLOGQ,??NewLOGQ??rA \ 0000013C 00A0A0E1 MOV R10,R0 180 strcpy(log->hdr, str); \ 00000140 0910A0E1 MOV R1,R9 \ 00000144 10008AE2 ADD R0,R10,#+16 \ 00000148 1A0000EF SWI +26 181 } 182 183 log->type = direction|0x10; \ ??GetHistory_7: \ 0000014C 00009DE5 LDR R0,[SP, #+0] 184 log->acked = 0; 185 log->ID=0xFFFFFFFF; 186 187 AddLOGQ(&head, log); \ 00000150 0A10A0E1 MOV R1,R10 \ 00000154 100080E3 ORR R0,R0,#0x10 \ 00000158 0C008AE5 STR R0,[R10, #+12] \ 0000015C 04408AE5 STR R4,[R10, #+4] \ 00000160 0400E0E1 MVN R0,R4 \ 00000164 08008AE5 STR R0,[R10, #+8] \ 00000168 04008DE2 ADD R0,SP,#+4 \ 0000016C ........ _BLF AddLOGQ,??AddLOGQ??rA 188 189 //mfree(log); 190 mfree(str); \ 00000170 0900A0E1 MOV R0,R9 \ 00000174 150000EF SWI +21 \ ??GetHistory_5: \ 00000178 000058E3 CMP R8,#+0 \ 0000017C 00005713 CMPNE R7,#+0 \ 00000180 2700000A BEQ ??GetHistory_8 \ 00000184 081086E0 ADD R1,R6,R8 \ 00000188 031051E5 LDRB R1,[R1, #-3] \ 0000018C 087086E0 ADD R7,R6,R8 \ 00000190 0700A0E1 MOV R0,R7 \ 00000194 301041E2 SUB R1,R1,#+48 \ 00000198 00108DE5 STR R1,[SP, #+0] \ 0000019C 3C1085E2 ADD R1,R5,#+60 \ 000001A0 180100EF SWI +280 \ 000001A4 0080B0E1 MOVS R8,R0 \ 000001A8 0200001A BNE ??GetHistory_9 \ 000001AC 0700A0E1 MOV R0,R7 \ 000001B0 1B0000EF SWI +27 \ 000001B4 070080E0 ADD R0,R0,R7 \ ??GetHistory_9: \ 000001B8 07A040E0 SUB R10,R0,R7 \ 000001BC 01008AE2 ADD R0,R10,#+1 \ 000001C0 140000EF SWI +20 \ 000001C4 0090A0E1 MOV R9,R0 \ 000001C8 01005AE3 CMP R10,#+1 \ 000001CC 020000BA BLT ??GetHistory_10 \ 000001D0 0A20A0E1 MOV R2,R10 \ 000001D4 0710A0E1 MOV R1,R7 \ 000001D8 1E0100EF SWI +286 \ ??GetHistory_10: \ 000001DC 0940CAE7 STRB R4,[R10, +R9] \ 000001E0 1B1F8FE2 ADR R1,??GetHistory_4+0x4 ;; "\r\n" \ 000001E4 0900A0E1 MOV R0,R9 \ 000001E8 180100EF SWI +280 \ 000001EC 00B0B0E1 MOVS R11,R0 \ 000001F0 CFFFFF0A BEQ ??GetHistory_6 \ 000001F4 02008BE2 ADD R0,R11,#+2 \ 000001F8 ........ _BLF NewLOGQ,??NewLOGQ??rA \ 000001FC 00A0A0E1 MOV R10,R0 \ 00000200 09B05BE0 SUBS R11,R11,R9 \ 00000204 0300004A BMI ??GetHistory_11 \ 00000208 0B20A0E1 MOV R2,R11 \ 0000020C 0910A0E1 MOV R1,R9 \ 00000210 10008AE2 ADD R0,R10,#+16 \ 00000214 1E0100EF SWI +286 \ ??GetHistory_11: \ 00000218 0A008BE0 ADD R0,R11,R10 \ 0000021C 1040C0E5 STRB R4,[R0, #+16] \ 00000220 C9FFFFEA B ??GetHistory_7 191 } 192 AddFirstLOGQ(t, head->next); \ ??GetHistory_8: \ 00000224 04009DE5 LDR R0,[SP, #+4] \ 00000228 001090E5 LDR R1,[R0, #+0] \ 0000022C 90009DE5 LDR R0,[SP, #+144] \ 00000230 ........ BL AddFirstLOGQ 193 mfree(head); \ 00000234 04009DE5 LDR R0,[SP, #+4] \ 00000238 150000EF SWI +21 194 195 } 196 197 mfree(buf); \ ??GetHistory_3: \ 0000023C 0C009DE5 LDR R0,[SP, #+12] \ 00000240 150000EF SWI +21 198 return 0; \ ??GetHistory_0: \ 00000244 0000A0E3 MOV R0,#+0 \ 00000248 94D08DE2 ADD SP,SP,#+148 \ 0000024C F08FBDE8 POP {R4-R11,PC} ;; return \ ??GetHistory_4: \ 00000250 00000000 DC8 "",+0,+0,+0 \ 00000254 0D0A0000 DC8 "\r\n",+0 199 } 200 \ In segment CODE, align 4, keep-with-next 201 void GetStatusById(char *buffer, int id) 202 { 203 204 // ??? Тут надо разбираться со статусами 205 // Похоже, не все коды верные... 206 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 207 { 208 case 0: {strcpy(buffer,"Online");break;} \ ??GetStatusById_3: \ 00000028 0310A0E1 MOV R1,R3 \ 0000002C 030000EA B ??GetStatusById_4 209 case 1: {strcpy(buffer, "Invisible");break;} \ ??GetStatusById_5: \ 00000030 081083E2 ADD R1,R3,#+8 \ 00000034 1A0000EF SWI +26 \ 00000038 0080BDE8 POP {PC} 210 case 2: {strcpy(buffer, "Away");break;} \ ??GetStatusById_6: \ 0000003C 141083E2 ADD R1,R3,#+20 \ ??GetStatusById_4: \ 00000040 1A0000EF SWI +26 \ 00000044 0080BDE8 POP {PC} 211 case 3: {strcpy(buffer, "N/A");break;} \ ??GetStatusById_7: \ 00000048 0A1F8FE2 ADR R1,??GetStatusById_1 ;; "N/A" \ 0000004C FBFFFFEA B ??GetStatusById_4 212 case 4: {strcpy(buffer, "Occupied");break;} \ ??GetStatusById_8: \ 00000050 1C1083E2 ADD R1,R3,#+28 \ 00000054 F9FFFFEA B ??GetStatusById_4 213 case 5: {strcpy(buffer, "DND");break;} \ ??GetStatusById_9: \ 00000058 071F8FE2 ADR R1,??GetStatusById_1+0x4 ;; "DND" \ 0000005C F7FFFFEA B ??GetStatusById_4 214 case 6: {strcpy(buffer, "Online");break;} 215 case 7: {strcpy(buffer, "FFC");break;} \ ??GetStatusById_10: \ 00000060 061F8FE2 ADR R1,??GetStatusById_1+0x8 ;; "FFC" \ 00000064 F5FFFFEA B ??GetStatusById_4 216 default: {sprintf(buffer, "UNK: %d", id);} \ ??GetStatusById_2: \ 00000068 0120A0E1 MOV R2,R1 \ 0000006C 281083E2 ADD R1,R3,#+40 \ 00000070 160000EF SWI +22 217 } 218 } \ 00000074 0080BDE8 POP {PC} ;; return \ ??GetStatusById_1: \ 00000078 4E2F4100 DC8 "N/A" \ 0000007C 444E4400 DC8 "DND" \ 00000080 46464300 DC8 "FFC" \ 00000084 ........ DC32 `?` 219 \ In segment CODE, align 4, keep-with-next 220 void LogStatusChange(CLIST *CListEx) 221 { \ LogStatusChange: \ 00000000 F0402DE9 PUSH {R4-R7,LR} \ 00000004 0040A0E1 MOV R4,R0 222 extern const int LOG_STATCH; 223 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 224 if(CListEx->state>7){return;} \ 0000001C B405D4E1 LDRH R0,[R4, #+84] \ 00000020 080050E3 CMP R0,#+8 \ 00000024 2200002A BCS ??LogStatusChange_1 225 if(CListEx->log==NULL){return;} \ 00000028 680094E5 LDR R0,[R4, #+104] \ 0000002C 000050E3 CMP R0,#+0 \ 00000030 1F00000A BEQ ??LogStatusChange_1 226 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} 227 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 232 { 233 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 234 } 235 else 236 { 237 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 238 } 239 GetStatusById(status, CListEx->state); \ ??LogStatusChange_3: \ 00000080 B415D4E1 LDRH R1,[R4, #+84] \ 00000084 0D00A0E1 MOV R0,SP \ 00000088 ........ BL GetStatusById 240 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 241 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 242 } \ ??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 `?` \ 00000024 6C819FE5 LDR R8,??do_StatusChangeWrite_0+0x4 ;; TEMPLATES_PATH \ 00000028 04008DE2 ADD R0,SP,#+4 \ 0000002C B40000EF SWI +180 \ 00000030 64019FE5 LDR R0,??do_StatusChangeWrite_0+0x8 ;; current_session \ 00000034 001090E5 LDR R1,[R0, #+0] \ 00000038 000051E3 CMP R1,#+0 \ 0000003C 2300001A BNE ??do_StatusChangeWrite_1 266 { 267 current_session = 1; \ 00000040 0110A0E3 MOV R1,#+1 \ 00000044 001080E5 STR R1,[R0, #+0] 268 269 zeromem(s,sizeof(s)); \ 00000048 401FA0E3 MOV R1,#+256 \ 0000004C 14008DE2 ADD R0,SP,#+20 \ 00000050 1D0100EF SWI +285 270 sprintf(s,"%s\\statuschg",TEMPLATES_PATH); \ 00000054 0820A0E1 MOV R2,R8 \ 00000058 0710A0E1 MOV R1,R7 \ 0000005C 14008DE2 ADD R0,SP,#+20 \ 00000060 160000EF SWI +22 271 if(!isdir(s, &io_error)) mkdir(s, &io_error); \ 00000064 0D10A0E1 MOV R1,SP \ 00000068 14008DE2 ADD R0,SP,#+20 \ 0000006C 910000EF SWI +145 \ 00000070 000050E3 CMP R0,#+0 \ 00000074 0200001A BNE ??do_StatusChangeWrite_2 \ 00000078 0D10A0E1 MOV R1,SP \ 0000007C 14008DE2 ADD R0,SP,#+20 \ 00000080 100000EF SWI +16 272 273 zeromem(s,sizeof(s)); \ ??do_StatusChangeWrite_2: \ 00000084 401FA0E3 MOV R1,#+256 \ 00000088 14008DE2 ADD R0,SP,#+20 \ 0000008C 1D0100EF SWI +285 274 sprintf(s,"%s\\statuschg\\%02d_%04d",TEMPLATES_PATH, date.month, date.year); \ 00000090 04009DE5 LDR R0,[SP, #+4] \ 00000094 0820A0E1 MOV R2,R8 \ 00000098 01002DE9 PUSH {R0} \ 0000009C 0C30DDE5 LDRB R3,[SP, #+12] \ 000000A0 101087E2 ADD R1,R7,#+16 \ 000000A4 18008DE2 ADD R0,SP,#+24 \ 000000A8 160000EF SWI +22 275 if(!isdir(s, &io_error)) mkdir(s, &io_error); \ 000000AC 04108DE2 ADD R1,SP,#+4 \ 000000B0 18008DE2 ADD R0,SP,#+24 \ 000000B4 910000EF SWI +145 \ 000000B8 000050E3 CMP R0,#+0 \ 000000BC 04D08DE2 ADD SP,SP,#+4 \ 000000C0 0200001A BNE ??do_StatusChangeWrite_1 \ 000000C4 0D10A0E1 MOV R1,SP \ 000000C8 14008DE2 ADD R0,SP,#+20 \ 000000CC 100000EF SWI +16 276 277 } 278 279 zeromem(s,sizeof(s)); \ ??do_StatusChangeWrite_1: \ 000000D0 401FA0E3 MOV R1,#+256 \ 000000D4 14008DE2 ADD R0,SP,#+20 \ 000000D8 1D0100EF SWI +285 280 sprintf(s,"%s\\statuschg\\%02d_%04d\\%02d.log",TEMPLATES_PATH, 281 date.month, date.year, 282 date.day); \ 000000DC 0900DDE5 LDRB R0,[SP, #+9] \ 000000E0 0820A0E1 MOV R2,R8 \ 000000E4 281087E2 ADD R1,R7,#+40 \ 000000E8 01002DE9 PUSH {R0} \ 000000EC 08009DE5 LDR R0,[SP, #+8] \ 000000F0 01002DE9 PUSH {R0} \ 000000F4 1030DDE5 LDRB R3,[SP, #+16] \ 000000F8 1C008DE2 ADD R0,SP,#+28 \ 000000FC 160000EF SWI +22 283 284 hFile = fopen(s,A_ReadWrite + A_Create + A_Append,P_READ+P_WRITE, &io_error); \ 00000100 08308DE2 ADD R3,SP,#+8 \ 00000104 602FA0E3 MOV R2,#+384 \ 00000108 761042E2 SUB R1,R2,#+118 \ 0000010C 1C008DE2 ADD R0,SP,#+28 \ 00000110 0A0000EF SWI +10 \ 00000114 0080A0E1 MOV R8,R0 285 if(hFile!=-1) \ 00000118 010078E3 CMN R8,#+1 \ 0000011C 08D08DE2 ADD SP,SP,#+8 \ 00000120 1900000A BEQ ??do_StatusChangeWrite_3 286 { 287 zeromem(s,sizeof(s)); \ 00000124 401FA0E3 MOV R1,#+256 \ 00000128 14008DE2 ADD R0,SP,#+20 \ 0000012C 1D0100EF SWI +285 288 if(delitel) \ 00000130 000056E3 CMP R6,#+0 \ 00000134 0300000A BEQ ??do_StatusChangeWrite_4 289 sprintf(s,"--------------------\r\n"); \ 00000138 481087E2 ADD R1,R7,#+72 \ 0000013C 14008DE2 ADD R0,SP,#+20 \ 00000140 160000EF SWI +22 \ 00000144 060000EA B ??do_StatusChangeWrite_5 290 else 291 sprintf(s,"%s [%d], %s\r\n",t->name, t->uin,text); \ ??do_StatusChangeWrite_4: \ 00000148 10002DE9 PUSH {R4} \ 0000014C 0C3095E5 LDR R3,[R5, #+12] \ 00000150 142085E2 ADD R2,R5,#+20 \ 00000154 601087E2 ADD R1,R7,#+96 \ 00000158 18008DE2 ADD R0,SP,#+24 \ 0000015C 160000EF SWI +22 \ 00000160 04D08DE2 ADD SP,SP,#+4 292 293 fwrite(hFile, s, strlen(s), &io_error); \ ??do_StatusChangeWrite_5: \ 00000164 14008DE2 ADD R0,SP,#+20 \ 00000168 1B0000EF SWI +27 \ 0000016C 0D30A0E1 MOV R3,SP \ 00000170 0020A0E1 MOV R2,R0 \ 00000174 14108DE2 ADD R1,SP,#+20 \ 00000178 0800A0E1 MOV R0,R8 \ 0000017C 0C0000EF SWI +12 294 fclose(hFile, &io_error); \ 00000180 0D10A0E1 MOV R1,SP \ 00000184 0800A0E1 MOV R0,R8 \ 00000188 0D0000EF SWI +13 295 } 296 } \ ??do_StatusChangeWrite_3: \ 0000018C 45DF8DE2 ADD SP,SP,#+276 ;; stack cleaning \ 00000190 F081BDE8 POP {R4-R8,PC} ;; return \ ??do_StatusChangeWrite_0: \ 00000194 ........ DC32 `?` \ 00000198 ........ DC32 TEMPLATES_PATH \ 0000019C ........ DC32 current_session \ In segment CODE, align 4, keep-with-next \ ??DataTable4: \ 00000000 ........ 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 2573257500 DC8 "%s%u" \ 00000005 000000 DC8 0, 0, 0 \ 00000008 25735C257500 DC8 "%s\\%u" \ 0000000E 0000 DC8 0, 0 \ 00000010 25735C25752E DC8 "%s\\%u.txt" \ 74787400 \ 0000001A 0000 DC8 0, 0 \ 0000001C CEF8E8E1EAE0 DC8 "\316\370\350\341\352\340 I/O #%u" \ 20492F4F2020 \ 23257500 \ 0000002C 25735C25755C DC8 "%s\\%u\\%u.txt" \ 25752E747874 \ 00 \ 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 \ `?`: \ 00000000 25735C737461 DC8 "%s\\statuschg" \ 747573636867 \ 00 \ 0000000D 000000 DC8 0, 0, 0 \ 00000010 25735C737461 DC8 "%s\\statuschg\\%02d_%04d" \ 747573636867 \ 5C253032645F \ 2530346400 \ 00000027 00 DC8 0 \ 00000028 25735C737461 DC8 "%s\\statuschg\\%02d_%04d\\%02d.log" \ 747573636867 \ 5C253032645F \ 253034645C25 \ 3032642E6C6F \ 6700 \ 00000048 2D2D2D2D2D2D DC8 "--------------------\015\012" \ 2D2D2D2D2D2D \ 2D2D2D2D2D2D \ 2D2D0D0A00 \ 0000005F 00 DC8 0 \ 00000060 2573205B2564 DC8 "%s [%d], %s\015\012" \ 5D2C2025730D \ 0A00 \ 0000006E 0000 DC8 0, 0 297 Maximum stack usage in bytes: Function CSTACK -------- ------ ActivateLastX 0 Add2History 28 AddFirstLOGQ 4 CheckLOGQ 8 DeleteLOGQ 8 GetHistory 192 GetStatusById 4 LogStatusChange 252 do_StatusChangeWrite 308 do_logwrite 328 Segment part sizes: Function/Label Bytes -------------- ----- do_logwrite 336 Add2History 156 ActivateLastX 64 AddFirstLOGQ 64 DeleteLOGQ 40 CheckLOGQ 104 GetHistory 600 GetStatusById 136 LogStatusChange 204 current_session 4 do_StatusChangeWrite 416 ??DataTable4 4 ??DataTable5 4 ??DataTable6 4 ??DataTable7 4 ? 84 ? 3 ?-%0..."> 28 ? 1 ? 3 ? 48 ? 4 ? 4 ? 4 ? 20 ? 3 ? 112 Others 76 2 200 bytes in segment CODE 342 bytes in segment DATA_C 4 bytes in segment DATA_Z 12 bytes in segment INITTAB 2 136 bytes of CODE memory (+ 76 bytes shared) 342 bytes of CONST memory 4 bytes of DATA memory Errors: none Warnings: none