/* Asn - Perform logical device and environment var assigns from a list file. Original effort by Fabio Rossetti. (c) 1989 by Fabio Rossetti To compile under Lattice C v5.0x use: lc -O -v -cus asn blink lib:cres.o asn.o to asn lib lib:a.lib lib:lc.lib sd nd */ #include #include #include #include #include #include #include #include /* assign list file buffer */ #define BUFSIZE 4096 #define DEFAULT_FILE "DEVS:AssignList" /* flag values */ #define SPLIT_COMMENT 3 #define SPLIT_NAME 2 #define OKAY 1 #define ASSIGNEM 1 #define DONTASSIGNEM 0 /* token identifiers */ #define NAME 0 #define VALUE 1 struct ArpBase *ArpBase; BPTR fh,FH; struct Process *Pr; TEXT Token[2][256]; /* buffers to hold token names (devices, var names & values) */ TEXT Env[108] = "ENV:"; /* buffer to hold filename of 1.3 ENV: variable */ /* Trick to keep code down to size */ VOID MemCleanup() { } /* as above */ VOID _main(Line) STRPTR Line; { STRPTR argv; LONG retcod; REGISTER TEXT *Fil,*Buf,*i,*EndOfBuf; REGISTER LONG count,Pos=0; struct { unsigned StOfBuf : 2; unsigned Do : 1; unsigned TokenType : 1; } St; St.StOfBuf=OKAY; Pr = (struct Process*)FindTask(NULL); if(!(ArpBase = (struct ArpBase*)OpenLibrary(ArpName,ArpVersion))){ Pr->pr_Result2=ERROR_INVALID_RESIDENT_LIBRARY; exit(RETURN_FAIL); } /* parse command line */ argv = NULL; while(*Line > ' ') ++Line; /* don't need argc */ (VOID)GADS(++Line, strlen(Line), "Usage: Asn [AssignListFile]", &argv, "FILE"); /* use default file if no argument's given */ Fil = (argv == NULL) ? DEFAULT_FILE : argv; if (!(fh=ArpOpen(Fil,MODE_OLDFILE))) { retcod=IoErr(); Printf("Error: Couldn't open %s\n",Fil); CloseLibrary((struct Library*)ArpBase); Pr->pr_Result2=retcod; exit(RETURN_ERROR); } if (!(Buf=(TEXT *)ArpAllocMem(BUFSIZE,MEMF_PUBLIC | MEMF_CLEAR))) { Puts("No memory!"); CloseLibrary((struct Library*)ArpBase); Pr->pr_Result2=ERROR_NO_FREE_STORE; exit(RETURN_FAIL); } while (count = Read(fh,Buf,BUFSIZE)) { /* point end of actually read data */ EndOfBuf = (TEXT *) Buf+count; /* scan file buffer */ for (i=Buf;i < EndOfBuf; i++) { /* Check for ^C */ if (SetSignal(0,0) & SIGBREAKF_CTRL_C) { Puts("***BREAK"); CloseLibrary((struct Library*)ArpBase); exit(RETURN_WARN); } /* skip comments */ if (((*i == '/') && (*(i+1) == '*')) || St.StOfBuf == SPLIT_COMMENT) { while(!((i >= EndOfBuf) || ((*i == '*') && (*(i+1) == '/')))) i++; if (i >= EndOfBuf) St.StOfBuf = SPLIT_COMMENT; if ((*i == '*') && (*(i+1) == '/')) { St.StOfBuf = OKAY; i+=2; } } St.Do = DONTASSIGNEM; if (((*i >=33) && (*i <=126)) || (St.StOfBuf == SPLIT_NAME)) { while(!((i>=EndOfBuf) || (*i <33) || (*i >126))) Token[St.TokenType][Pos++] = *i++; if (i>=EndOfBuf) St.StOfBuf = SPLIT_NAME; else { St.StOfBuf = OKAY; if ((*i <33) || (*i >126)) { Token[St.TokenType][Pos] = '\0'; if (St.TokenType==NAME) { St.TokenType = VALUE; St.Do = DONTASSIGNEM; } else { St.TokenType = NAME; St.Do = ASSIGNEM; } Pos = 0; } } } /* do device-var assignment */ if (St.Do == ASSIGNEM) { /* ARP/MANX var */ if ((Toupper(Token[NAME][0]) == 'M') && (Token[NAME][1] == '_') && (Token[NAME][2] != '\0')) {if ((!(Setenv(&(Token[NAME][2]),Token[VALUE])))) Printf("Error: Unable to set ARP/MANX var %s as %s\n", &(Token[NAME][2]), Token[VALUE]); } /* 1.3 environment var */ else if ((Toupper(Token[NAME][0]) == 'E') && (Token[NAME][1] == '_') && (Token[NAME][2] != '\0') ) { strcat(Env,&(Token[NAME][2])); if (!(FH = ArpOpen(Env,MODE_NEWFILE)) || !(Write(FH,Token[VALUE], strlen(Token[VALUE])))) Printf("Error: Unable to set environment var %s as %s\n", &(Token[NAME][2]), Token[VALUE]); /* reset var filename buffer */ Env[4] = '\0'; } /* logical device assign */ else { /* strip colon in logical device name */ Token[NAME][strlen(Token[NAME])-1] = '\0'; if (!(Assign( Token[NAME], Token[VALUE]) == ASSIGN_OK)){ Printf ("Error: Unable to assign %s: to %s\n", Token[NAME], Token[VALUE]); } } } } } CloseLibrary((struct Library*)ArpBase); }