/*++ Copyright (c) 1997 Microsoft Corporation Module Name: cue.c Abstract: Generates command prompt aliases Author: Jim Schmidt (jimschm) 13-Feb-1998 Revision History: --*/ #include "pch.h" HANDLE g_hHeap; HINSTANCE g_hInst; VOID HelpAndExit ( VOID ) { printf ("Command line syntax:\n\n" "cue [-c:cmd] [-a:alias] [root]\n" "\n" "-c Specifies command, default is cd /d %%d\\$1\n" "-a Specifies alias format string, default is %%n\n" "[root] Specifies root directory to scan\n" "\n" "The -c and -a options can have the following symbols:\n" "\n" " %%d Specifies full directory path\n" " %%n Specifies directory name\n" "\n" "The output can be copied to cue.pri in the razzle environment.\n" ); exit(0); } GROWLIST g_VarNames = GROWLIST_INIT; GROWBUFFER g_VarVals = GROWBUF_INIT; VOID pInitEnvVars ( VOID ) { PCSTR Env; PCSTR p; CHAR VarName[512]; PSTR VarVal; Env = GetEnvironmentStrings(); Env = GetEndOfStringA (Env) + 1; Env = GetEndOfStringA (Env) + 1; p = Env; while (*p) { _mbscpy (VarName, p); p = GetEndOfStringA (p) + 1; if (*VarName != '_') { continue; } VarVal = _mbschr (VarName, '='); if (VarVal) { *VarVal = 0; VarVal++; GrowListAppendString (&g_VarNames, VarName); MultiSzAppend (&g_VarVals, VarVal); } } } VOID pFreeEnvVars ( VOID ) { FreeGrowList (&g_VarNames); FreeGrowBuffer (&g_VarVals); } VOID pUseEnvVars ( IN OUT PSTR String ) { PSTR p; UINT u; UINT Best; UINT Length; UINT BestLength; PCSTR q; CHAR NewString[1024]; PSTR d; p = String; d = NewString; do { q = (PCSTR) g_VarVals.Buf; BestLength = 0; u = 0; Best = 0xffffffff; while (*q) { Length = _mbslen (q); if (Length > 3) { if (!_mbsnicmp (p, q, Length)) { if (Length > BestLength) { Best = u; BestLength = Length; } } } q = GetEndOfStringA (q) + 1; u++; } if (Best != 0xffffffff) { q = GrowListGetString (&g_VarNames, Best); *d++ = '%'; StringCopyA (d, q); d = GetEndOfStringA (d); *d++ = '%'; p += BestLength; } else { *d++ = *p++; } } while (*p); *d = 0; StringCopyA (String, NewString); } VOID pGenerateString ( IN PCSTR Format, OUT PSTR String, IN PCSTR Directory, IN PCSTR FullPath ) { PSTR p; PCSTR q; q = Format; p = String; while (*q) { if (*q == '%') { q++; switch (tolower (*q)) { case 'n': StringCopyA (p, Directory); p = GetEndOfStringA (p); break; case 'd': StringCopyA (p, FullPath); p = GetEndOfStringA (p); break; default: if (*q != 0) { *p++ = *q; } else { q--; } break; } q++; } else { *p++ = *q++; } } *p = 0; } VOID AddString ( PCSTR String ) { MemDbSetValue (String, 0); } BOOL FindString ( PCSTR String ) { return MemDbGetValue (String, NULL); } BOOL pIsAliasInUse ( IN PCSTR Alias, IN OUT PGROWLIST NewAliases ) { LONG rc; CHAR CmdLine[512]; UINT Size; UINT u; PCSTR p; UINT Len; PSTR DontCare; // // Scan new aliases first. Two or more identical aliases are ambiguous, // so we find them and delete them. // Size = GrowListGetSize (NewAliases); wsprintf (CmdLine, "%s ", Alias); Len = _mbslen (CmdLine); for (u = 0 ; u < Size ; u++) { p = GrowListGetString (NewAliases, u); if (!_mbsnicmp (p, CmdLine, Len)) { GrowListDeleteItem (NewAliases, u); return TRUE; } } // // Now see if the alias was already defined // if (FindString (Alias)) { return TRUE; } // // Finally verify the alias is not an EXE in the path // wsprintf (CmdLine, "%s.exe", Alias); if (SearchPath (NULL, CmdLine, NULL, 512, CmdLine, &DontCare)) { return TRUE; } wsprintf (CmdLine, "%s.bat", Alias); if (SearchPath (NULL, CmdLine, NULL, 512, CmdLine, &DontCare)) { return TRUE; } wsprintf (CmdLine, "%s.cmd", Alias); if (SearchPath (NULL, CmdLine, NULL, 512, CmdLine, &DontCare)) { return TRUE; } return FALSE; } VOID pAddAlias ( IN OUT PGROWLIST NewAliases, IN PCSTR AliasStr, IN PCSTR CommandStr ) { CHAR CmdLine[512]; AddString (AliasStr); wsprintf (CmdLine, "%s %s", AliasStr, CommandStr); GrowListAppendString (NewAliases, CmdLine); } VOID pProcessCueFile ( IN PCSTR Path, IN PCSTR FileName ) { HANDLE File; CHAR CmdLine[512]; PSTR p; PCSTR q; DWORD Read; DWORD Size; DWORD Pos; CHAR FullPath[MAX_PATH]; wsprintf (FullPath, "%s\\%s", Path, FileName); File = CreateFile ( FullPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (File != INVALID_HANDLE_VALUE) { Size = GetFileSize (File, NULL); for (Pos = 0 ; Pos < Size ; Pos += Read) { SetFilePointer (File, Pos, NULL, FILE_BEGIN); if (!ReadFile (File, CmdLine, 256, &Read, NULL)) { break; } // // Find end of line // CmdLine[Read] = 0; p = _mbschr (CmdLine, '\n'); if (p) { *p = 0; Read = p - CmdLine + 1; } else { p = _mbschr (CmdLine, '\r'); if (p) { *p = 0; Read = p - CmdLine + 1; } else { p = GetEndOfStringA (CmdLine); Read = p - CmdLine; } } // // Add alias // q = CmdLine; while (isspace (*q)) { q++; } p = (PSTR) q; while (*p && !isspace (*p)) { p++; } if (*p) { *p = 0; AddString (q); } } CloseHandle (File); } } BOOL MemDb_Entry ( HINSTANCE hInst, DWORD Reason, PVOID DontCare ); BOOL MigUtil_Entry ( HINSTANCE hInst, DWORD Reason, PVOID DontCare ); INT __cdecl main ( INT argc, CHAR *argv[] ) { TREE_ENUM e; GROWLIST NewAliases = GROWLIST_INIT; PCSTR RootPath; INT i; UINT u; UINT Size; PCSTR Alias = "%n"; PCSTR Command = "cd /d %d\\$1"; CHAR AliasStr[256]; CHAR CommandStr[256]; CHAR PubPath[MAX_PATH]; CHAR PriPath[MAX_PATH]; PSTR p; CHAR CurDir[MAX_PATH]; GetCurrentDirectory (MAX_PATH, CurDir); RootPath = NULL; g_hHeap = GetProcessHeap(); g_hInst = GetModuleHandle (NULL); MigUtil_Entry (g_hInst, DLL_PROCESS_ATTACH, NULL); MemDb_Entry (g_hInst, DLL_PROCESS_ATTACH, NULL); for (i = 1 ; i < argc ; i++) { if (argv[i][0] == '-' || argv[i][0] == '/') { switch (tolower (argv[i][1])) { case 'c': if (argv[i][2] != ':') { i++; if (i == argc) { HelpAndExit(); } Command = argv[i]; } else { Command = &argv[i][3]; } break; case 'a': if (argv[i][2] != ':') { i++; if (i == argc) { HelpAndExit(); } Alias = argv[i]; } else { Alias = &argv[i][3]; } break; default: HelpAndExit(); } } else if (RootPath) { HelpAndExit(); } else { RootPath = argv[i]; } } if (!RootPath) { RootPath = CurDir; } // // Parse the ntcue.pub, cue.pub and cue.pri files // if (!GetEnvironmentVariable ("INIT", PriPath, MAX_PATH)) { printf ("Must be in razzle environment to run this tool\n"); return -1; } StringCopyA (PubPath, PriPath); p = _mbsrchr (PubPath, '\\'); if (!p) { printf ("Must be in razzle environment to run this tool\n"); return -1; } *p = 0; pProcessCueFile (PubPath, "ntcue.pub"); pProcessCueFile (PubPath, "cue.pub"); pProcessCueFile (PriPath, "cue.pri"); // // Add commands // AddString ("cd"); AddString ("dir"); AddString ("copy"); AddString ("type"); AddString ("del"); AddString ("erase"); AddString ("color"); AddString ("md"); AddString ("chdir"); AddString ("mkdir"); AddString ("prompt"); AddString ("pushd"); AddString ("popd"); AddString ("set"); AddString ("setlocal"); AddString ("endlocal"); AddString ("if"); AddString ("for"); AddString ("call"); AddString ("shift"); AddString ("goto"); AddString ("start"); AddString ("assoc"); AddString ("ftype"); AddString ("exit"); AddString ("ren"); AddString ("rename"); AddString ("move"); pInitEnvVars(); // // Scan the specified directory // if (EnumFirstFileInTree (&e, RootPath, NULL, TRUE)) { do { if (!e.Directory) { continue; } pGenerateString (Alias, AliasStr, e.Name, e.FullPath); if (pIsAliasInUse (AliasStr, &NewAliases)) { continue; } pGenerateString (Command, CommandStr, e.Name, e.FullPath); pUseEnvVars (CommandStr); pAddAlias (&NewAliases, AliasStr, CommandStr); } while (EnumNextFileInTree (&e)); } Size = GrowListGetSize (&NewAliases); for (u = 0 ; u < Size ; u++) { p = (PSTR) GrowListGetString (&NewAliases, u); printf ("%s\n", p); } FreeGrowList (&NewAliases); pFreeEnvVars(); return 0; }