summaryrefslogtreecommitdiffstats
path: root/private/utils/mep/src/env.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/utils/mep/src/env.c')
-rw-r--r--private/utils/mep/src/env.c288
1 files changed, 288 insertions, 0 deletions
diff --git a/private/utils/mep/src/env.c b/private/utils/mep/src/env.c
new file mode 100644
index 000000000..c368647ee
--- /dev/null
+++ b/private/utils/mep/src/env.c
@@ -0,0 +1,288 @@
+/* env.c - manipulate editor environment
+ *
+ * Modifications:
+ *
+ * 26-Nov-1991 mz Strip off near/far
+ *
+ */
+
+#include "mep.h"
+
+/* environment - function to perform environment manipulation
+ *
+ * set environment
+ * display environment
+ * perform env substitution
+ *
+ * fn sets environment
+ * meta fn does env substitution
+ *
+ * noarg sets current line into env
+ * textarg sets text into env single ? displays env
+ * nullarg sets to eol into env
+ * linearg sets each line into env
+ * streamarg sets each fragment into env
+ * boxarg sets each fragment into env
+ *
+ * meta noarg maps current line
+ * meta textarg illegal
+ * meta nullarg maps to eol
+ * meta linearg maps each line
+ * meta streamarg maps each fragment
+ * meta boxarg maps each fragment
+ *
+ * argData keystroke
+ * pArg definition of arguments
+ * fMeta TRUE => meta was invoked
+ *
+ * Returns: TRUE if operation was successful
+ * FALSE otherwise
+ */
+
+static char *pmltl = "Mapped line %ld too long";
+
+
+
+flagType
+environment (
+ CMDDATA argData,
+ ARG * pArg,
+ flagType fMeta
+ ){
+
+ linebuf ebuf, ebuf1;
+ LINE l;
+ int ol;
+
+ if (!fMeta) {
+ /* Perform environment modifications
+ */
+ switch (pArg->argType) {
+
+ case NOARG:
+ GetLine (pArg->arg.noarg.y, ebuf, pFileHead);
+ return fSetEnv (ebuf);
+
+ case TEXTARG:
+ strcpy ((char *) ebuf, pArg->arg.textarg.pText);
+ return fSetEnv (ebuf);
+
+ case NULLARG:
+ fInsSpace (pArg->arg.nullarg.x, pArg->arg.nullarg.y, 0, pFileHead, ebuf);
+ return fSetEnv (&ebuf[pArg->arg.nullarg.x]);
+
+ case LINEARG:
+ for (l = pArg->arg.linearg.yStart; l <= pArg->arg.linearg.yEnd; l++) {
+ GetLine (l, ebuf, pFileHead);
+ if (!fSetEnv (ebuf)) {
+ docursor (0, l);
+ return FALSE;
+ }
+ }
+ return TRUE;
+
+ case BOXARG:
+ for (l = pArg->arg.boxarg.yTop; l <= pArg->arg.boxarg.yBottom; l++) {
+ fInsSpace (pArg->arg.boxarg.xRight, l, 0, pFileHead, ebuf);
+ ebuf[pArg->arg.boxarg.xRight+1] = 0;
+ if (!fSetEnv (&ebuf[pArg->arg.boxarg.xLeft])) {
+ docursor (pArg->arg.boxarg.xLeft, l);
+ return FALSE;
+ }
+ }
+ return TRUE;
+
+ }
+ } else {
+ /* Perform environment substitutions
+ */
+ switch (pArg->argType) {
+
+ case NOARG:
+ GetLine (pArg->arg.noarg.y, ebuf, pFileHead);
+ if (!fMapEnv (ebuf, ebuf, sizeof(ebuf))) {
+ printerror (pmltl, pArg->arg.noarg.y+1);
+ return FALSE;
+ }
+ PutLine (pArg->arg.noarg.y, ebuf, pFileHead);
+ return TRUE;
+
+ case TEXTARG:
+ return BadArg ();
+
+ case NULLARG:
+ fInsSpace (pArg->arg.nullarg.x, pArg->arg.nullarg.y, 0, pFileHead, ebuf);
+ if (!fMapEnv (&ebuf[pArg->arg.nullarg.x],
+ &ebuf[pArg->arg.nullarg.x],
+ sizeof(ebuf) - pArg->arg.nullarg.x)) {
+ printerror (pmltl, pArg->arg.nullarg.y+1);
+ return FALSE;
+ }
+ PutLine (pArg->arg.nullarg.y, ebuf, pFileHead);
+ return TRUE;
+
+ case LINEARG:
+ for (l = pArg->arg.linearg.yStart; l <= pArg->arg.linearg.yEnd; l++) {
+ GetLine (l, ebuf, pFileHead);
+ if (!fMapEnv (ebuf, ebuf, sizeof (ebuf))) {
+ printerror (pmltl, l+1);
+ docursor (0, l);
+ return FALSE;
+ }
+ PutLine (l, ebuf, pFileHead);
+ }
+ return TRUE;
+
+ case BOXARG:
+ for (l = pArg->arg.boxarg.yTop; l <= pArg->arg.boxarg.yBottom; l++) {
+ fInsSpace (pArg->arg.boxarg.xRight, l, 0, pFileHead, ebuf);
+ ol = pArg->arg.boxarg.xRight + 1 - pArg->arg.boxarg.xLeft;
+ memmove ( ebuf1, &ebuf[pArg->arg.boxarg.xLeft], ol);
+ ebuf1[ol] = 0;
+ if (!fMapEnv (ebuf1, ebuf1, sizeof (ebuf1)) ||
+ strlen (ebuf1) + strlen (ebuf) - ol >= sizeof (ebuf)) {
+ printerror (pmltl, l+1);
+ docursor (0, l);
+ return FALSE;
+ }
+ strcat (ebuf1, &ebuf[pArg->arg.boxarg.xRight + 1]);
+ strcpy (&ebuf[pArg->arg.boxarg.xLeft], ebuf1);
+ PutLine (l, ebuf, pFileHead);
+ }
+ return TRUE;
+
+ }
+ }
+ argData;
+}
+
+
+
+
+/* fMapEnv - perform environment substitutions
+ *
+ * pSrc character pointer to pattern string
+ * pDst character pointer to destination buffer
+ * cbDst amount of space in destination
+ *
+ * Returns TRUE if successful substitution
+ * FALSE if length overflow
+ */
+flagType
+fMapEnv (
+ char *pSrc,
+ char *pDst,
+ int cbDst
+ ) {
+
+ buffer tmp;
+ char *pTmp, *p, *pEnd, *pEnv;
+ int l;
+
+ /* when we find a $()-surrounded token, we'll null-terminate it using p
+ * and attempt to find it in the environment. If we find it, we replace
+ * it. If we don't find it, we drop it out.
+ */
+
+ pTmp = tmp;
+ pEnd = pTmp + cbDst;
+
+ while (*pSrc != 0) {
+ if (pSrc[0] == '$' && pSrc[1] == '(' && *(p = strbscan (pSrc + 2, ")")) != '\0') {
+ *p = '\0';
+ //pEnv = getenv(pSrc + 2);
+ pEnv = getenvOem(pSrc + 2);
+ *p = ')';
+ if (pEnv != NULL) {
+ if ((l = strlen (pEnv)) + pTmp > pEnd) {
+ free(pEnv);
+ return FALSE;
+ } else {
+ strcpy (pTmp, pEnv);
+ pTmp += l;
+ }
+ free(pEnv);
+ }
+ pSrc = p + 1;
+ continue;
+ }
+ if (pTmp > pEnd) {
+ return FALSE;
+ } else {
+ *pTmp++ = *pSrc++;
+ }
+ }
+ *pTmp = '\0';
+ strcpy (pDst, tmp);
+ return TRUE;
+}
+
+
+
+
+/* fSetEnv - take some text and set it in the environment
+ *
+ * We ignore leading/trailing blanks. "VAR=blah" is done with quotes removed.
+ *
+ * p character pointer to text
+ *
+ * returns TRUE if successfully set
+ * FALSE otherwise
+ */
+flagType
+fSetEnv (
+ char *p
+ ){
+ char *p1;
+
+ p = whiteskip (p);
+ RemoveTrailSpace (p);
+ /* Handle quoting
+ */
+ p1 = strend (p) - 1;
+
+ if (strlen (p) > 2 && *p == '"' && *p1 == '"') {
+ p++;
+ *p1 = 0;
+ }
+
+ if (!strcmp (p, "?")) {
+ AutoSave ();
+ return fChangeFile (FALSE, "<environment>");
+ }
+
+ if ((p = ZMakeStr (p)) == NULL) {
+ return FALSE;
+ }
+
+// if (putenv (p)) {
+ if (putenvOem (p)) {
+ FREE (p);
+ return FALSE;
+ }
+
+ FREE (p);
+ return TRUE;
+}
+
+
+
+
+/* showenv - dump the environment into a file
+ *
+ * pFile file where output goes
+ */
+void
+showenv (
+ PFILE pFile
+ ){
+
+ int i;
+
+ DelFile (pFile, FALSE);
+ for (i = 0; environ[i] != NULL; i++) {
+ AppFile (environ[i], pFile);
+ }
+ RSETFLAG (FLAGS(pFile), DIRTY);
+ SETFLAG (FLAGS(pFile), READONLY);
+}