t_printf_params *create_printf_params(char *str) { t_printf_params *params; int from; int i; char *tmp; params = xmalloc(sizeof(t_printf_params)); init(params, &from, &i); while (str[i] != '\0') if (str[i++] == '.') { tmp = my_substr(str, from, i - 2); params->width = my_getnbr(tmp); free(tmp); from = i; } tmp = my_substr(str, from, i - 1); if (params->width != 0 || str[0] == '.') params->prec = my_getnbr(tmp); else params->width = my_getnbr(tmp); free(tmp); free(str); return (params); }
SVFIP VirtualFAT::InsertItem(const char* Dir, SVFIP Item) { SVFIP D; SVFIP T; SVFIP I; char *p, *s; D = Root; p = my_strdup(Dir); char *fn = ExtractName(Dir); while (TRUE){ char * t = ExtractRoot(p); T = GetDir(D, t); if (!T) { I = (SVFIP)my_malloc(sizeof(SVFI)); I->FileName = my_strdup(t); I->Description = my_strdup("<dir>"); I->Plugin = my_strdup(""); I->IsDirectory = TRUE; I->Fmt = -1; I->IsExtension = FALSE; I->Offset = 0; I->LevelUp = D; I->PackedSize = 0; I->UnpackedSize = 0; I->UserData.Data = NULL; I->UserData.Size = 0; D = InsertItem(D, I); } else D = T; s = my_substr(p, lstrlen(t)+1, lstrlen(p)); if (lstrlen(s)==0){ my_free(t); my_free(p); my_free(s); my_free(fn); if (Item->Fmt == FMT_SPEC) return D; D = InsertItem(D, Item); return D; } my_free(p); my_free(t); p = s; } my_free(p); my_free(fn); return NULL; }
char *trim_quote(char *str) { int size; size = my_strlen(str) - 1; if ((str[0] == '\'' && str[size] == '\'') || (str[0] == '"' && str[size] == '"')) return (my_substr(str, 1, size - 1)); return (my_strdup(str)); }
char *get_label(char *line) { int index_start; int index_end; char *label; index_start = -1; index_end = get_nindex_of(line, ':', 1); label = my_substr(line, index_start, index_end); return (label); }
char *get_comment(char *line) { int index_start; int index_end; char *comment; line = epur_str(line); index_start = get_nindex_of(line, '"', 1); index_end = get_nindex_of(line, '"', 2); comment = my_substr(line, index_start, index_end); return (comment); }
char *get_name(char *line) { int index_start; int index_end; char *name; line = epur_str(line); index_start = get_nindex_of(line, '"', 1); index_end = get_nindex_of(line, '"', 2); name = my_substr(line, index_start, index_end); return (name); }
SVFIP VirtualFAT::GetPath(SVFIP Item, char* PathName) { SVFIP D; char *p, *s; if (!Item) D = Root; else D = Item; if (lstrlen(PathName)==0) return Root; p = my_strdup(PathName); char *fn = ExtractName(PathName); while (TRUE){ char * t = ExtractRoot(p); D = GetDir(D, t); if (!D) { my_free(t); my_free(p); my_free(fn); return NULL; } s = my_substr(p, lstrlen(t)+1, lstrlen(p)); if (lstrlen(s)==0) { my_free(t); my_free(p); my_free(s); my_free(fn); return D; } my_free(p); my_free(t); p = s; } my_free(p); my_free(fn); return NULL; }
int do_aff(char* str, int pct_i, int type_i, va_list ap) { int i; t_printf_params *params; int size; params = create_printf_params(my_substr(str, pct_i + 1, type_i - 1)); i = 0; size = -1; while (my_printf_funct[i].type != '\0' && size == -1) { if (my_printf_funct[i].type == str[type_i]) size = (my_printf_funct[i].funct)(ap, params); ++i; } free(params); if (my_printf_funct[i].type == '\0' && size == -1) { write(1, "%", 1); return (1); } return (size); }
int AlgebraicParser::operator()(const string &str, double *val){ // coding of arythmetical operations const int extOP_PLUS=1; const int extOP_MINUS=-1; const int extOP_MUL=2; const int extOP_DIV=-2; /* вначале разбиваем строку на подстроки, связанные + и -, поскольку эти операции обладают меньшим приоритетом. потом разбиваем подстроки, связанные * и /. Данная функция разбивает строку на две подстроки. Дальнейшее разбитие осуществляется с помощью рекурсивного вызова этой же функции. */ if (str.length()==0) return -2; int direct=0; // 1 - правое слагаемое есть число, 0 - правое слагаемое есть выражение //ищем с конца первый символ + или - вне скобок () int op=extOP_MINUS; // кодирует арифметическое действие (возможные значения перечислены в разделе define) int c1=find_symbol(str,'-'); int c2=find_symbol(str,'+'); if (c1<-1 || c2<-1) return -2; // скобки в строке расставлены некорректно if(c1<0 && c2<0){ // none of +/- found //ищем с конца первый символ * или / вне скобок () op=extOP_MUL; c1=find_symbol(str,'*'); c2=find_symbol(str,'/'); if (c1<-1 || c2<-1) return -2; // скобки в строке расставлены некорректно direct=1; // предполагаем, что правое слагаемое есть число } if(c2>c1){ // первой с конца встречается операция, противоположная изначально заданной (+ или / ) op=-op; c1=c2; } double val1=0, val2=0; // в эти переменные будут записаны значения для первого и второго слагаемого if (c1<0 && c2<0) { // ни одного символа + - * / в строке не встречено if(str[0]=='(' && str[str.length()-1]==')') { // строка есть выражение в скобках (...) string token1=SUBSTR(str, 1, (int)str.length()-2); // смотрим, что внутри скобок return operator()(token1, val); // считаем это и возвращаем } // строка есть просто число. в этом случае val1 будет единицей, val2 будет этим числом, // а действие будет умножением (в результате мы получим 1*val2=val2) val1=1; } else { string token1=SUBSTR(str, 0, c1); trim(token1); if(token1.length()==0){ // длина подстроки перед символом равна нулю if(op==extOP_MINUS)val1=0.; // унарный минус (например, -5) else return -1; // ошибка } else{ if(operator()(token1,&val1)<0) // считаем val1 return -1; } } // string token2=str.substr(c1+1, str.length()-(c1+1)); string token2=my_substr(str, c1+1, (int)str.length()-(c1+1)); if (token2.length()==0) return -1; // ошибка trim(token2); if(token2[0]=='(' && token2[token2.length()-1]==')'){ // правое слагаемое есть выражение в скобках, а не число direct=0; } if(direct){ // правое выражение есть непосредственно число if(atof_map(token2, &val2)<1)return -1; } else{ if(operator()(token2,&val2)<0) return -1; } // мы посчитали два слагаемых val1 и val2 и производим арифметическую операцию switch(op){ case extOP_PLUS: *val=val1+val2; break; case extOP_MINUS: *val=val1-val2; break; case extOP_DIV: *val=val1/val2; break; case extOP_MUL: *val=val1*val2; break; } return 1; }
long PackCheckSH(const char * FileName, PUCHAR BaseString, long readed, long &HeadOffset, long &SomeOffset, long &FileSize, long &FileOffset, struct RIP_FILE_INFO **finfo, long &FilesNumber, long WorkFileSize, struct RIP_SERVICE_FUNC *func, struct RIP_FLAGS *flags) { #pragma pack(1) struct SHInfo{ char FileName[24]; long FileOffset; long FileSize; }SH; #pragma pack(8) long rd, FOffset, nFiles, z; bool WasError = false; int errorfrom; RIP_FILE_INFO * fi; FOffset = WorkFileSize-8; rd = func->ReadFromFile(FileName, FOffset, &nFiles, 4); if (rd < 4) return -1; if (nFiles <= 0) return -1; FOffset += rd; rd = func->ReadFromFile(FileName, FOffset, &z, 4); if (rd < 4) return -1; if ((z>WorkFileSize)|| (z<=0)) return -1; FOffset = WorkFileSize-z; fi = (RIP_FILE_INFO*)my_malloc(sizeof(RIP_FILE_INFO)*nFiles); if (fi == NULL) return -1; *finfo = fi; FilesNumber = nFiles; for (int i = 0; i<FilesNumber; i++){ rd = func->ReadFromFile(FileName, FOffset, &SH, sizeof SH); if (rd < sizeof SH) { WasError = true; errorfrom = i; break; } FOffset += rd; memset(&fi[i], 0, sizeof(RIP_FILE_INFO)); fi[i].StartOffset = WorkFileSize-SH.FileOffset-z; fi[i].FileSize = SH.FileSize; if (fi[i].StartOffset+fi[i].FileSize>WorkFileSize) { WasError = true; errorfrom = i; break; } fi[i].FullFileName = my_substr(SH.FileName,0,24,1); fi[i].FullFileName[24]=0; fi[i].Description = my_strdup(""); } if (WasError){ for (int j=0; j<errorfrom; j++){ my_free(fi[j].FullFileName); my_free(fi[j].Description); } my_free(fi); fi = NULL; return -1; } FileOffset = 0; FileSize = WorkFileSize; return WorkFileSize; }
int MrRipper::GetFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int Move, char *DestPath, int OpMode) { TSaveScreen SS; DWORD StartTime=GetTickCount(); BOOL WaitMessage=FALSE; double Progress1, Progress2; long FullSize,CurSize, ProcessedBytes; int Owervrite = 0; char MyDestPath[MAX_PATH]; char MyDestFile[MAX_PATH]; if (!OpMode & OPM_SILENT){ if (!DestDirPrompt(DestPath)) return -2; } if ((strlen(DestPath)==3)&& (DestPath[1]==':')&& (DestPath[2]=='\\')) DestPath[2] = 0; GetCurrentDirectory(MAX_PATH, MyDestPath); if (!SetCurrentDirectory(DestPath)) return FALSE; SetCurrentDirectory(MyDestPath); FormatFinder FF(PluginPath); for (int i = 0; i<FF.GetFormatCount(); i++) for (int j = 0; j<FF.GetnKnownFormats(i); j++) FF.SetActiveOpt(i, j, GetRegKey(HKEY_CURRENT_USER,"",FF.GetRegPath(i, j), 1)); MakeCopyList(PanelItem, ItemsNumber); int f1, f2; int readed, pos, endpos, getret; if (!bPluginManager){ FullSize = 0; for (int I = 0; I < copyfiles.size(); I++) FullSize += copyfiles[I].FileSize; ProcessedBytes = 0; for (I = 0; I < copyfiles.size(); I++){ if (copyfiles[I].FileName[strlen(copyfiles[I].FileName)-1]=='\\'){ char *c = my_substr(copyfiles[I].FileName, 0, strlen(copyfiles[I].FileName)-1); FSF.sprintf(MyDestPath, "%s\\%s", DestPath, c); my_free(c); CreateDirectory(MyDestPath, NULL); } else { char *d = ExtractPath(copyfiles[I].FileName); if (strlen(d)>0) FSF.sprintf(MyDestPath, "%s\\%s", DestPath, d); else strcpy(MyDestPath, DestPath); my_free(d); d = ExtractName(copyfiles[I].FileName); FSF.sprintf(MyDestFile, "%s", d); my_free(d); char c[MAX_PATH]; FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile); f2 = _open(c, _O_RDONLY|_O_BINARY); if (f2!=-1) { _close(f2); if (Owervrite==3) continue; if (Owervrite == 0||Owervrite == 1) if (!OpMode & OPM_SILENT) Owervrite = OverwritePrompt(MyDestFile); if (Owervrite==-1) break; if (Owervrite==3||Owervrite==1) continue; } if (copyfiles[I].Fmt != FMT_DUMMY) if (FF.GetCanGetFile(copyfiles[I].Fmt, copyfiles[I].Plugin)&&ConvView){ getret = FF.GetFile(copyfiles[I].Plugin, copyfiles[I].Fmt, RipFileName, MyDestFile, MyDestPath, copyfiles[I].StartOffset, copyfiles[I].FileSize, copyfiles[I].UnpSize, OpMode & OPM_SILENT, copyfiles[I].UserData.Data); if (getret == 1){ ProcessedBytes += copyfiles[I].FileSize; WaitMessage=FALSE; if (!OpMode & OPM_SILENT){ if (GetTickCount()-StartTime>500){ if (CheckForKey(VK_ESCAPE)) break; Progress1 = 100.0; Progress2 = ProcessedBytes; Progress2 *= 100; Progress2 /= FullSize; char FileMsg[100], ProgressMsg1[100], ProgressMsg2[100]; FSF.sprintf(FileMsg,GetMsg(MExtracting), MyDestFile); FSF.sprintf(ProgressMsg1,GetMsg(MExtr1), Progress1); FSF.sprintf(ProgressMsg2,GetMsg(MExtr2), Progress2); const char *MsgItems[]={GetMsg(MExtraction),FileMsg, ProgressMsg1, ProgressMsg2}; Info.Message(Info.ModuleNumber,WaitMessage ? FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND:FMSG_LEFTALIGN,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),0); WaitMessage=TRUE; } } continue; } if (getret == 2){ if (CheckForKey(VK_ESCAPE)) break; continue; } } FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile); f1 = _open(RipFileName, _O_RDONLY|_O_BINARY); _lseek(f1,copyfiles[I].StartOffset,SEEK_SET); f2 = _open(c, _O_CREAT|_O_WRONLY|_O_BINARY); endpos = copyfiles[I].StartOffset+copyfiles[I].FileSize; CurSize = copyfiles[I].FileSize; pos = _tell(f1); while (pos<endpos){ if (!OpMode & OPM_SILENT){ if (GetTickCount()-StartTime>500){ if (CheckForKey(VK_ESCAPE)) break; Progress1 = (pos-copyfiles[I].StartOffset); Progress1 *= 100; Progress1 /= copyfiles[I].FileSize; Progress2 = ProcessedBytes; Progress2 *= 100; Progress2 /= FullSize; char FileMsg[100], ProgressMsg1[100], ProgressMsg2[100]; FSF.sprintf(FileMsg,GetMsg(MExtracting), MyDestFile); FSF.sprintf(ProgressMsg1,GetMsg(MExtr1), Progress1); FSF.sprintf(ProgressMsg2,GetMsg(MExtr2), Progress2); const char *MsgItems[]={GetMsg(MExtraction),FileMsg, ProgressMsg1, ProgressMsg2}; Info.Message(Info.ModuleNumber,WaitMessage ? FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND:FMSG_LEFTALIGN,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),0); WaitMessage=TRUE; } } readed = _read(f1, buf, BUF_SIZE); pos = _tell(f1); if (pos > endpos) readed = readed - (pos - endpos); _write(f2, buf, readed); ProcessedBytes += readed; pos = _tell(f1); WaitMessage=FALSE; } _close(f2); _close(f1); SetFileAttributes(c, FILE_ATTRIBUTE_ARCHIVE); if (!OpMode & OPM_SILENT) if (CheckForKey(VK_ESCAPE)) break; } } Free_copyfiles(); return TRUE; } else { //For plugin manager ADDPLUGININFO *PI; for (int I = 0; I < copyfiles.size(); I++){ if (copyfiles[I].FileName[strlen(copyfiles[I].FileName)-1]=='\\'){ char *c = my_substr(copyfiles[I].FileName, 0, strlen(copyfiles[I].FileName)-1); FSF.sprintf(MyDestPath, "%s\\%s", DestPath, c); my_free(c); CreateDirectory(MyDestPath, NULL); } else { char *d = ExtractPath(copyfiles[I].FileName); if (strlen(d)>0) FSF.sprintf(MyDestPath, "%s\\%s", DestPath, d); else strcpy(MyDestPath, DestPath); my_free(d); d = ExtractName(copyfiles[I].FileName); FSF.sprintf(MyDestFile, "%s", d); my_free(d); char c[MAX_PATH]; FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile); f2 = _open(c, _O_RDONLY|_O_BINARY); if (f2!=-1) { _close(f2); if (Owervrite==3) continue; if (Owervrite == 0||Owervrite == 1) if (!OpMode & OPM_SILENT) Owervrite = OverwritePrompt(MyDestFile); if (Owervrite==-1) break; if (Owervrite==3||Owervrite==1) continue; } FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile); f2 = _open(c, _O_CREAT|_O_WRONLY|_O_BINARY); PI = (ADDPLUGININFO*)copyfiles[I].UserData.Data; FSF.sprintf((char*)buf, GetMsg(MInfoOptString), copyfiles[I].FileName); _write(f2, buf, lstrlen((char*)buf)+1); _write(f2, "\xD\xA\xD\xA", 4); FSF.sprintf((char*)buf, GetMsg(MInfoVer), copyfiles[I].Description); _write(f2, buf, lstrlen((char*)buf)+1); _write(f2, "\xD\xA", 2); char v[30]; Ver2Char(PI->RipVer, v); FSF.sprintf((char*)buf, GetMsg(MInfoRipVer), v); _write(f2, buf, lstrlen((char*)buf)+1); _write(f2, "\xD\xA\xD\xA", 4); FSF.sprintf((char*)buf, GetMsg(MInfoCopyright), PI->Copy); _write(f2, buf, lstrlen((char*)buf)+1); _write(f2, "\xD\xA", 2); FSF.sprintf((char*)buf, GetMsg(MInfoPath), PI->FilePath); _write(f2, buf, lstrlen((char*)buf)+1); _write(f2, "\xD\xA", 2); char *types[8] = {GetMsg(MInfoTypeGraph), GetMsg(MInfoTypeVideo), GetMsg(MInfoTypeSound), GetMsg(MInfoTypePack), GetMsg(MInfoTypeOther), GetMsg(MInfoTypeMusic), GetMsg(MInfoTypeText), GetMsg(MInfoTypeExe)}; FSF.sprintf((char*)buf, GetMsg(MInfoType), types[PI->Type]); _write(f2, buf, lstrlen((char*)buf)+1); _close(f2); SetFileAttributes(c, FILE_ATTRIBUTE_ARCHIVE); if (!OpMode & OPM_SILENT) if (CheckForKey(VK_ESCAPE)) break; } } Free_copyfiles(); //This for refuse reset selection if (!OpMode&OPM_SILENT) return -1; else return TRUE; } Free_copyfiles(); return TRUE; }
int MrRipper::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int OpMode) { TSaveScreen SS; *pPanelItem=NULL; *pItemsNumber=0; if (bPluginManager) PluginManager(OpMode); else FileRipper(OpMode); PluginPanelItem *NewPanelItem=(PluginPanelItem *)my_malloc(sizeof(PluginPanelItem)*shownfiles.size()); *pPanelItem=NewPanelItem; if (NewPanelItem==NULL) return(FALSE); if (!bPluginManager){ int CurItemPos=0; for (int Z=0; Z < shownfiles.size(); Z++){ memset(&NewPanelItem[CurItemPos],0,sizeof(PluginPanelItem)); NewPanelItem[CurItemPos].CustomColumnData=(char**)my_malloc(sizeof(char*)); NewPanelItem[CurItemPos].CustomColumnNumber = 1; char deb[1000]; if (shownfiles[Z].IsDirectory){ NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; lstrcpy(NewPanelItem[CurItemPos].FindData.cFileName, shownfiles[Z].FileName); NewPanelItem[CurItemPos].PackSize = 0; NewPanelItem[CurItemPos].FindData.nFileSizeLow = 0; NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup("<dir>"); } else { NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE; FSF.sprintf(deb, "%X+%X=%X", shownfiles[Z].StartOffset, shownfiles[Z].FileSize, shownfiles[Z].StartOffset+shownfiles[Z].FileSize); NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup(deb); NewPanelItem[CurItemPos].PackSize = shownfiles[Z].StartOffset; NewPanelItem[CurItemPos].FindData.nFileSizeLow = shownfiles[Z].FileSize; lstrcpy(NewPanelItem[CurItemPos].FindData.cFileName,shownfiles[Z].FileName); if (shownfiles[Z].UserData.Size > 0){ NewPanelItem[CurItemPos].Flags |= PPIF_USERDATA; NewPanelItem[CurItemPos].UserData = (ULONG)&shownfiles[Z].UserData; } } NewPanelItem[CurItemPos].Description= my_strdup(shownfiles[Z].Description); NewPanelItem[CurItemPos].Owner = NULL; CurItemPos++; } } else { ADDPLUGININFO *PI; int CurItemPos=0; int u = Char2Ver(RIPVER); for (int Z=0; Z < shownfiles.size(); Z++){ memset(&NewPanelItem[CurItemPos],0,sizeof(PluginPanelItem)); NewPanelItem[CurItemPos].CustomColumnData=(char**)my_malloc(sizeof(char*)); NewPanelItem[CurItemPos].CustomColumnNumber = 1; char deb[1000]; if (shownfiles[Z].IsDirectory){ NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; char *c = my_substr(shownfiles[Z].FileName, 0, strlen(shownfiles[Z].FileName)-1); strcpy(NewPanelItem[CurItemPos].FindData.cFileName, c); my_free(c); NewPanelItem[CurItemPos].PackSize = 0; NewPanelItem[CurItemPos].FindData.nFileSizeLow = 0; NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup("<dir>"); } else { PI = (ADDPLUGININFO*)shownfiles[Z].UserData.Data; if (PI->RipVer <= u) NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE; else NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_HIDDEN; NewPanelItem[CurItemPos].Flags |= PPIF_USERDATA; NewPanelItem[CurItemPos].UserData = (ULONG)&shownfiles[Z].UserData; NewPanelItem[CurItemPos].PackSize = shownfiles[Z].StartOffset; FSF.sprintf(deb, "%X+%X=%X", shownfiles[Z].StartOffset, shownfiles[Z].FileSize, shownfiles[Z].StartOffset+shownfiles[Z].FileSize); NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup(deb); NewPanelItem[CurItemPos].FindData.nFileSizeLow = shownfiles[Z].FileSize; strcpy(NewPanelItem[CurItemPos].FindData.cFileName,shownfiles[Z].FileName); } NewPanelItem[CurItemPos].Description= my_strdup(shownfiles[Z].Description); NewPanelItem[CurItemPos].Owner = NULL; CurItemPos++; } } *pItemsNumber= shownfiles.size(); return(TRUE); }