BOOL CConvertMacro2::Convert(wstring macro, PLUGIN_RESERVE_INFO* info, EPG_EVENT_INFO* epgInfo, wstring& convert) { convert = L""; for( size_t pos = 0;; ){ size_t next = macro.find(L'$', pos); if( next == wstring::npos ){ convert.append(macro, pos, wstring::npos); break; } convert.append(macro, pos, next - pos); pos = next; next = macro.find(L'$', pos + 1); if( next == wstring::npos ){ convert.append(macro, pos, wstring::npos); break; } if( ExpandMacro(macro.substr(pos + 1, next - pos - 1), info, epgInfo, convert) == FALSE ){ convert += L'$'; pos++; }else{ pos = next + 1; } } Replace(convert, L"\r", L""); Replace(convert, L"\n", L""); return TRUE; }
inline string mhmakefileparser::ExpandExpression(const string &ExprIn) const { bool Recurse=true; string Ret(ExprIn); while (Recurse) { Recurse=false; string Expr(Ret); Ret.clear(); size_t i=0; size_t Length=Expr.size(); string ToAdd; while (i<Length) { char Char=Expr[i++]; if (Char=='$') { size_t inew=SkipMakeExpr(Expr,i); i++; if (inew>i) { ToAdd=ExpandMacro(Expr.substr(i,inew-i-1)); i=inew; } else { // This is a single character expression ToAdd=ExpandMacro(string(1,Expr[i-1])); } if (ToAdd.find('$')!=string::npos && ToAdd.length()!=1) { Recurse=true; } Ret+=ToAdd; } else { Ret+=Char; } } } return Ret; }
static void MacroReplacement (StrBuf* Source, StrBuf* Target) /* Perform macro replacement. */ { ident Ident; Macro* M; /* Remember the current input and switch to Source */ StrBuf* OldSource = InitLine (Source); /* Loop substituting macros */ while (CurC != '\0') { /* If we have an identifier, check if it's a macro */ if (IsSym (Ident)) { /* Check if it's a macro */ if ((M = FindMacro (Ident)) != 0 && !M->Expanding) { /* It's a macro, expand it */ ExpandMacro (Target, M); } else { /* An identifier, keep it */ SB_AppendStr (Target, Ident); } } else if (IsQuote (CurC)) { CopyQuotedString (Target); } else if (IsSpace (CurC)) { if (!IsSpace (SB_LookAtLast (Target))) { SB_AppendChar (Target, CurC); } NextChar (); } else { SB_AppendChar (Target, CurC); NextChar (); } } /* Switch back the input */ InitLine (OldSource); }
BOOL CCmdLineParser::_DoParser(LPCTSTR lpCmdLine, LPCTSTR lpCurDir, LPCTSTR lpEnvVars, LPCTSTR lpExtNames, LPCTSTR lpParentPath ) { BOOL bResult = FALSE; LPCTSTR lpCmdBegin = NULL; BOOL bQuotation = FALSE; m_szCmd[0] = 0; if (m_lpParam != NULL) { delete[] m_lpParam; m_lpParam = NULL; } if ( is_empty_str(lpCmdLine) ) return FALSE; if ( is_empty_str(lpParentPath) ) lpParentPath = NULL; if ( is_empty_str(lpCurDir) ) lpCurDir = NULL; if ( is_empty_str(lpEnvVars) ) lpEnvVars = NULL; if ( is_empty_str(lpExtNames) ) lpExtNames = NULL; /* 1、The directory from which the application loaded. 2、The current directory for the parent process. 3、The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. Windows Me/98/95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory. 4、The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System. 5、The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. 6、The directories that are listed in the PATH environment variable. Note that this function does not search the per-application path specified by the App Paths registry key. To include this per-application path in the search sequence, use the ShellExecute function. */ lpCmdBegin = lpCmdLine; if ( *lpCmdBegin == _T('\"') ) { lpCmdBegin = skip_quotation(lpCmdBegin); bQuotation = TRUE; } if ( (m_dwFlag & DEF_EXT_NAME) && lpExtNames == NULL ) { // 默认扩展名 lpExtNames = _T("bat;cmd;exe;pif"); } if ( _tcsnicmp(lpCmdBegin, _T("\\??\\"), 4) == 0 ) { lpCmdBegin += 4; } if ( _tcsnicmp(lpCmdBegin, _T("file://"), 7) == 0 ) { if ( lpCmdBegin[8] == _T(':') ) { lpCmdBegin += 7; } } /* 宏展开 */ if ( *lpCmdBegin == _T('%') ) { LPTSTR lpCmdBuff = ExpandMacro(lpCmdBegin); if ( lpCmdBuff != NULL ) { bResult = ExpandAbsolute(lpCmdBuff, lpExtNames, bQuotation); delete lpCmdBuff; lpCmdBuff = NULL; } goto _Exit; } /* 绝对路径展开 */ if ( is_absolute_path(lpCmdBegin) ) { bResult = ExpandAbsolute(lpCmdBegin, lpExtNames, bQuotation); goto _Exit; } /* 相对路径转换 */ if ( (lpCurDir != NULL) || (m_dwFlag & DEF_CUR_DIR) ) { LPTSTR lpCmdBuff = ExpandRelative(lpCmdBegin, lpCurDir, bQuotation); if ( lpCmdBuff != NULL ) { bResult = ExpandAbsolute(lpCmdBuff, lpExtNames, bQuotation); delete lpCmdBuff; lpCmdBuff = NULL; if ( bResult ) { goto _Exit; } } } /* 二次宏展开 */ if ( m_dwFlag & DEF_ENV_VAR ) { LPTSTR lpCmdBuff = ExpandMacro2(lpCmdBegin); if ( lpCmdBuff != NULL ) { bResult = ExpandAbsolute(lpCmdBuff, lpExtNames, bQuotation); delete lpCmdBuff; lpCmdBuff = NULL; if ( bResult ) { goto _Exit; } } } /* 在父程序目录下查找 */ if ( lpParentPath != NULL ) { if ( MyGetLongPathName(lpParentPath, m_szCmd, MAX_PATH) != 0 ) { LPTSTR lpFileName = (LPTSTR)get_file_name(m_szCmd); *lpFileName = 0; DWORD dwLen2 = (DWORD)_tcslen(m_szCmd); LPTSTR lpCmdBuff = new TCHAR[dwLen2 + _tcslen(lpCmdBegin) + 2]; if ( lpCmdBuff != NULL ) { _tcscpy(lpCmdBuff, m_szCmd); if ( lpCmdBuff[dwLen2 - 1] != _T('\\') ) { lpCmdBuff[dwLen2++] = _T('\\'); } _tcscpy(lpCmdBuff + dwLen2, lpCmdBegin); //MessageBox(0, lpCmdBuff, NULL, 0); bResult = ExpandAbsolute(lpCmdBuff, lpExtNames, bQuotation); delete lpCmdBuff; lpCmdBuff = NULL; if ( bResult ) { goto _Exit; } } } } /* 环境变量中查找 */ if ( lpEnvVars != NULL || (m_dwFlag & DEF_ENV_VAR) ) { LPCTSTR lpCmdEnd = NULL; if ( bQuotation ) { lpCmdEnd = _tcschr(lpCmdBegin, _T('\"')); if ( lpCmdEnd == NULL ) { goto _Exit; } } else { lpCmdEnd = skip_no_blank(lpCmdBegin); } if ( !fix_path_separator(m_szCmd, MAX_PATH, lpCmdBegin, lpCmdEnd - lpCmdBegin) ) { goto _Exit; } if ( !is_relative_path(m_szCmd) ) { bResult = ExpandEnvVars(m_szCmd, lpEnvVars, lpExtNames); if ( bResult ) { ExpandParam(lpCmdEnd); } } } _Exit: if ( !bResult ) { m_szCmd[0] = 0; } return bResult; }
void sendbuf(void) { extern int trxmode; extern int searchflg; extern char termbuf[]; extern char backgrnd_str[]; extern int cwkeyer; extern int digikeyer; extern int simulator; extern int simulator_mode; extern int sending_call; static char printlinebuffer[82] = ""; printlinebuffer[0] = '\0'; if ((trxmode == CWMODE && cwkeyer != NO_KEYER ) || (trxmode == DIGIMODE && digikeyer != NO_KEYER)) { ExpandMacro(); if ((strlen(buffer) + strlen(termbuf)) < 80) { if (simulator == 0) strcat(termbuf, buffer); // if (sending_call == 1) { // strcat (termbuf, " "); // sending_call = 0; // } } if (simulator == 0) strncat(printlinebuffer, termbuf, strlen(termbuf)); else strncat(printlinebuffer, termbuf, strlen(termbuf)); if (searchflg == 0 && simulator == 0) strncat(printlinebuffer, backgrnd_str, 80 - strlen(printlinebuffer)); else { int len = 40 - (int)strlen(printlinebuffer); if (len > 0) { strncat(printlinebuffer, backgrnd_str, len); } if (strlen(printlinebuffer) > 45) { printlinebuffer[42] = '.'; printlinebuffer[43] = '.'; printlinebuffer[44] = '.'; printlinebuffer[45] = '\0'; } } attron(COLOR_PAIR(C_LOG) | A_STANDOUT); if ((simulator_mode == 0)) { mvprintw(5, 0, printlinebuffer); refreshp(); } refreshp(); if (trxmode == DIGIMODE) { if (digikeyer == MFJ1278_KEYER) { int i = 0; for (i = 0; i < strlen(buffer); i++) if (buffer[i] == '\n') buffer[i] = 13; for (i = 0; i < strlen(buffer); i++) if (buffer[i] == 123) buffer[i] = 20; /* ctrl-t */ for (i = 0; i < strlen(buffer); i++) if (buffer[i] == 125) buffer[i] = 18; /* ctrl-r */ } keyer_append(buffer); } if (trxmode == CWMODE) { if (cwkeyer == MFJ1278_KEYER) { int i = 0; for (i = 0; i < strlen(buffer); i++) if (buffer[i] == '\n') buffer[i] = 13; } keyer_append(buffer); } if (simulator == 0) { if (sending_call == 0) displayit(); refreshp(); } buffer[0] = '\0'; } }
void sendbuf(void) { extern int trxmode; extern int searchflg; extern char termbuf[]; extern char backgrnd_str[]; extern char wkeyerbuffer[]; extern int data_ready; extern int keyerport; extern int simulator; extern int simulator_mode; extern int sending_call; static char printlinebuffer[82] = ""; printlinebuffer[0] = '\0'; if ((trxmode == CWMODE || trxmode == DIGIMODE) && (keyerport != NO_KEYER)) { ExpandMacro(); if ((strlen(buffer) + strlen(termbuf)) < 80) { if (simulator == 0) strcat(termbuf, buffer); // if (sending_call == 1) { // strcat (termbuf, " "); // sending_call = 0; // } } if (simulator == 0) strncat(printlinebuffer, termbuf, strlen(termbuf)); else strncat(printlinebuffer, termbuf, strlen(termbuf)); if (searchflg == 0 && simulator == 0) strncat(printlinebuffer, backgrnd_str, 80 - strlen(printlinebuffer)); else { int len = 40 - (int)strlen(printlinebuffer); if (len > 0) { strncat(printlinebuffer, backgrnd_str, len); } if (strlen(printlinebuffer) > 45) { printlinebuffer[42] = '.'; printlinebuffer[43] = '.'; printlinebuffer[44] = '.'; printlinebuffer[45] = '\0'; } } attron(COLOR_PAIR(C_LOG) | A_STANDOUT); if ((simulator_mode == 0)) { mvprintw(5, 0, printlinebuffer); refreshp(); } refreshp(); if (trxmode == DIGIMODE) { if (data_ready != 1) { if (keyerport == MFJ1278_KEYER) { int i = 0; for (i = 0; i < strlen(buffer); i++) if (buffer[i] == '\n') buffer[i] = 13; for (i = 0; i < strlen(buffer); i++) if (buffer[i] == 123) buffer[i] = 20; /* ctrl-t */ for (i = 0; i < strlen(buffer); i++) if (buffer[i] == 125) buffer[i] = 18; /* ctrl-r */ } strcat(wkeyerbuffer, buffer); buffer[0] = '\0'; data_ready = 1; } else buffer[0] = '\0'; } if (trxmode == CWMODE) { if (data_ready != 1) { if (keyerport == MFJ1278_KEYER) { int i = 0; for (i = 0; i < strlen(buffer); i++) if (buffer[i] == '\n') buffer[i] = 13; } strcat(wkeyerbuffer, buffer); if (keyerport == NET_KEYER) { netkeyer(K_MESSAGE, wkeyerbuffer); wkeyerbuffer[0] = '\0'; data_ready = 0; } else data_ready = 1; } else buffer[0] = '\0'; } if (simulator == 0) { if (sending_call == 0) displayit(); refreshp(); } buffer[0] = '\0'; } }
string mhmakefileparser::ExpandMacro(const string &Expr) const { const char *pTmp=Expr.c_str(); /* First remove leading spaces */ while (*pTmp==' ' || *pTmp=='\t') pTmp++; const char *pVar=pTmp; while (*pTmp && *pTmp!=' ' && *pTmp!='\t' && *pTmp!=':') { if (*pTmp=='$' && pTmp[1]) // We have a macro expansion inside a macro expansion, so recurse Do not consider isolated $ (This was a $$) { return ExpandMacro(ExpandExpression(Expr)); } pTmp++; } const char *pVarEnd=pTmp; char Type=*pTmp++; while (*pTmp && (*pTmp==' ' || *pTmp=='\t')) pTmp++; if (Type&&*pTmp) { // We have a match for the regular expression ^([^ \\t:]+)([: \\t])[ \\t]*(.+) if (Type==':') { #ifdef WIN32 bool IsFileName=false; if (pVarEnd-pVar == 1 && (*pVar=='<' || *pVar =='@')) IsFileName=true; #endif string ToSubst=ExpandExpression(ExpandVar(string(pVar,pVarEnd))); const char *pSrc=pTmp; const char *pStop=pSrc; while (*pStop!='=') pStop++; const char *pTo=pStop+1; string SrcStr(ExpandExpression(string(pSrc,pStop))); string ToStr(pTo); // Do not expand yet to be able to use % inside a macro #ifdef WIN32 if (IsFileName) { matchres Res; string FileName(UnquoteFileName(ToSubst)); if (PercentMatch(FileName,UnquoteFileName(SrcStr),&Res)) { FileName=ReplaceWithStem(UnquoteFileName(ToStr),Res.m_Stem); } return QuoteFileName(FileName); } #endif return Substitute(ToSubst,SrcStr,ToStr); } else if (Type==' ' || Type == '\t') { string Arg(pTmp); string Func(pVar,pVarEnd); function_f pFunc=m_Functions[Func]; #ifdef _DEBUG if (pFunc) { return (this->*pFunc)(Arg); } else { throw GetFileNameLineNo() + "Unknown function specified in macro: "+Func; } #else return (this->*pFunc)(Arg); #endif } else { #ifdef _DEBUG throw string("Fatal error in ExpandMacro (bug in mhmake ? ? ?)"); #else return g_EmptyString; #endif } } else { #ifdef _DEBUG if (Expr.find('$')!=string::npos && Expr.length()!=1) throw(string("Bug in mhmake: wasn't expecting a $ sign in: ")+Expr); #endif string Ret=ExpandVar(Expr); if (Ret.length()>1) return ExpandExpression(Ret); else return Ret; } }