[C+Batch+DOS] export C-variabele naar dos-variabele

Pagina: 1
Acties:

  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Ik zit met een probleempje wat ik niet zo makkelijk op weet te lossen vandaar dat ik hier wat post :)

het is als volgt: Ik schrijf kleine programmatjes als bijdrage aan m'n batchprogrammatje omdat batch zo weinig functionaliteit heeft. (so far so good)

Had ik een programmatje geschreven van ruwweg 25 regels groot in C.
Maar dan ook echt 16bit dos based C want het moet zonder windows werken.

wach ff, dan post ik het :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <process.h>
#include <string.h>

#define MAXSTRING 300

int main( int argc, char *argv[] )
{
   char string[300];

   if( argc <= 2 )
   {
      printf("%s <Question> <BatchVariable>", argv[0]);
      return 254;
   }

   printf("%s",argv[1]);
   gets(string);

   execlp("set %s=%s",argv[2],string);
   printf("set %s=%s",argv[2],string); //controle


   return 0;
}


Maar als die execute klaar is en ik ga dan in dos om te controleren offie in de set variabele lijst staat dan staatie er niet bij. Hij is weer weg!
Iemand een idee hoe ik dit op moet lossen?

(Let op, er mogen geen extra bestanden aangemaakt worden, zoals tijdelijk wegschrijven in een batch-bestand want het programma wordt op een CD gebruikt)
TnX

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

cobratbq schreef op 18 augustus 2002 @ 22:06:
Maar als die execute klaar is en ik ga dan in dos om te controleren offie in de set variabele lijst staat dan staatie er niet bij. Hij is weer weg!
Iemand een idee hoe ik dit op moet lossen?

Zoals jij het nu doet wordt er voor het nieuwe proces een nieuwe environment aangemaakt. Dat betekent dat de variable in een nieuwe context wordt gezet, en die gaat verloren zodra het proces termineert.

Je kunt het oplossen als je een environment hebt waarin je het proces opstart. Kijk eens naar de exec varianten:

http://www.mkssoftware.com/docs/man3/execl.3.asp

Werkt het ook niet als je system() gebruik i.p.v. exec?

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Hé Exirion niet te actief hè
1 post is genoeg :)
edit:

ennuh bedankt he

Heb system() al geprobeerd, als eerste.
Heb trouwens net "command /c set test=test"
dan ben ik hem idd ook weer kwijt. Daar was ik al bang voor :(

[ Voor 0% gewijzigd door cobratbq op 18-08-2002 22:19 . Reden: vergeten te bedanken ]

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

environment variabelen zijn proces-specifiek... als je variabelen aanpast dan zijn de veranderingen alleen zichtbaar in het huidige proces en z'n child processen... zodra het proces afsluit gaan de veranderingen verloren

(dus de parent kan alleen de variabelen voor de child aanpassen, niet andersom)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

Kijk eens naar getenv(), setenv() en putenv().

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Iemand die een ander idee heeft hoe een .exe programmatje een variabele in de huidige dos-omgeving achter kan laten zonder hierbij een tijdelijk bestand te gebruiken?

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Er is wel een work-around voor het bovenstaande probleem. Ik weet dat veel memory-swappers deze functionaliteit hebben, Spawno (Ralf Brown) en Exec van Thomas Wagner hadden dat iirc.
http://pascal.sources.ru/memory/exec33.htm
voor Exec.

Afhankelijk van wat je wil vragen, zou je eventueel ook een errorlevel kunnen teruggeven gebaseerd op de input, dat is iig mooier imho.

  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

elk programma krijgt van dos een stukje geheugen waarin de huidige omgevingsvariabelen en nog wat gekopieerd wordt. psp heet dat geheugen daggik.
je kunt dan de psp opvragen van het programma wat jouw programma heeft opgestart en dankzij geen beveiligingen in dos kun je dat geheugen wijzigen en dus ook de omgevingsvariabelen, zodat zodra jouw programma afgelopen is die variabelen beschikbaar zijn.

edit:
tis lang geleed

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

in de program segment prefix (psp) staat idd de segment van de environment... op offset 0x2c (2 bytes)
Op offset 0x16 (2 bytes) staat de psp van het ouder-proces (waarschijnlijk ook segment, maar dat kan ik hieruit (oud dos boek) niet snel opmaken)

even kijken wat Ralf Brown erover zegt :)

.edit: is idd het segment

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

.oisyn schreef op 18 augustus 2002 @ 22:43:
in de program segment prefix (psp) staat idd de segment van de environment... op offset 0x2c (2 bytes)
Op offset 0x16 (2 bytes) staat de psp van het ouder-proces (waarschijnlijk ook segment, maar dat kan ik hieruit (oud dos boek) niet snel opmaken)

even kijken wat Ralf Brown erover zegt :)

Voordat we allerlei omwegen gaan verzinnen: zoals ik net zei kun je met setenv() en putenv() gewoon environment variabelen instellen zonder dat je exec..() of system() nodig hebt ;)

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Exirion schreef op 18 augustus 2002 @ 22:53:
[nohtml]
[...]
[/nohtml]
Voordat we allerlei omwegen gaan verzinnen: zoals ik net zei kun je met setenv() en putenv() gewoon environment variabelen instellen zonder dat je exec..() of system() nodig hebt ;)
.oisyn schreef op 18 augustus 2002 @ 22:25:
environment variabelen zijn proces-specifiek... als je variabelen aanpast dan zijn de veranderingen alleen zichtbaar in het huidige proces en z'n child processen... zodra het proces afsluit gaan de veranderingen verloren

(dus de parent kan alleen de variabelen voor de child aanpassen, niet andersom)
:Y)
(putenv en setenv zijn overigens niet ANSI C of POSIX, wel POSIX :))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

.oisyn schreef op 18 augustus 2002 @ 22:54:
(putenv is overigens niet ANSI C, en over setenv kan ik helemaal niets vinden)

Geen ANSI C, maar wel POSIX. Het zit ook in de GNU libraries voor Linux.
En aangezien ik het vroeger zelf wel eens gebruikt heb weet ik zeker dat het in Turbo C en Borland C++ zit.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

zie mijn edit :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik zat idd ook in de DJGPP docs te kijken: http://www.delorie.com/djgpp/doc/libc-2.02/libc_543.html

is dus verouderd :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Sorry Exirion, maar ik moet je teleurstellen. Ook putenv() en getenv() leveren geen oplossing want dan ben ik nog steeds m'n variabele kwijt nadat het programma afgesloten is. Zelfs in een pure dosmodus (van diskette gestart).

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

cobratbq schreef op 18 augustus 2002 @ 23:03:
Sorry Exirion, maar ik moet je teleurstellen. Ook putenv() en getenv() leveren geen oplossing want dan ben ik nog steeds m'n variabele kwijt nadat het programma afgesloten is. Zelfs in een pure dosmodus (van diskette gestart).

Wat is de returncode van putenv()? Het moet nul zijn voor succes.

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Exirion: doet er niet toe, zoals ik al 2x heb gezegd kun je daarmee niet de environment aanpassen van het parent proces. Het hele environment is gebaseerd op het feit dat een child de variabelen van z'n parent kopieert, en aanpassingen worden niet bij z'n parent doorgevoerd (omdat het slechts een kopie is). Bij afsluiting van het huidige proces gaan dus alle aanpassingen verloren.

Start maar eens een command window, en in die command window run je command.com. Als je dan een set doet, en vervolgens een exit, dan is die set verdwenen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

.oisyn schreef op 18 augustus 2002 @ 23:09:
Exirion: doet er niet toe, zoals ik al 2x heb gezegd kun je daarmee niet de environment aanpassen van het parent proces.

Ik zie nu inderdaad dat de wijzigingen alleen voor het huidige proces effectief zijn.

Maar wel een oplossing gevonden:
This series of routines are designed to Locate, Retrieve, Update, and
Remove "Variables" from the MASTER copy of the DOS Environment table.
The routines have been written in a manner that avoids linking any
EXTERNAL routines for string manipulation, and thus should be independent
of memory model being used.

Be careful that changes made to the Environment with these routines
ONLY OCCUR IN THE MASTER COPY, and that if COMMAND.COM is spawned
from a routine that has changed the environment, NO CHANGES WILL BE
SEEN IN THE ENVIRONMENT. This is most apparent when this program is run
in the INTEGRATED environment: changes made by this technique will
not appear if the "OS Shell" is invoked, and will only appear on exit
from TC.
Link: http://www.snippets.org/snippets/dos/GLBL_ENV+C.php3

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Kheb net een mooie oplossing gevonden, die naar mijn idee, ook niet helemaal goed werkt. Maar dat zal wel aan mij liggen want het is iets moeilijker dan verwacht. Mensen die interesse hebben moeten dit stukkie echt eens lezen. Dan zul je zien hoe onverwacht moeilijk m'n vraag was:
http://groups.google.com/...atlas.uniserve.com&rnum=6

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is dus wat Pipodeclown al aangaf en waar ik op in ging... Ik weet niet waarom ze zo 'moeilijk' doen om de master te vinden, want in principe kun je gewoon uit je huidige psp die van de parent halen, enz.

Maar dat zal wel komen omdat de parent psp (1) ongedocumenteerd is, en (2) iets anders kan zijn dan een segment bij gebruik van dos extenders (gezien jouw situatie maakt dit dus niets uit)

.edit: in jouw geval is het niet eens nodig om de MASTER te zoeken, alleen die van de parent is voldoende

in pseudo-code:

code:
1
2
3
4
5
6
7
8
int main ()
{
    psp = getpsp ();
    parentpsp = getparentpsp (psp);
    envsegment = getenvsegment (parentpsp);
    addvar (envsegment, "test=blaat");
    return 0;
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
tot en met regel 3 ging het goed, maar ik heb de functie getparentpsp(?); niet
en getenvsegment(?); heb ik ook niet :(
en addvar(?,?) ook niet

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

het was pseudo-code, om aan te geven hoe je proggie in elkaar moet zitten
die functies heb ik gewoon uit mijn duim gezogen :Y)

.edit: maar getpsp () heb je dus wel? grappig :)

kun je eens een beschrijving van die functie posten?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
oh, maar hoe moet ik dat doen, want zo handig ben ik nog niet hoor!

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

oh ik heb de beschrijving van de functie getpsp () al gevonden (google heerst :Y))
even een proggie typen... ik post m zo wel (ik moet je wel waarschuwen dat 16 bit c-code voor mij lang geleden is :))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

.oisyn schreef op 18 augustus 2002 @ 23:40:
oh ik heb de beschrijving van de functie getpsp () al gevonden (google heerst :Y))

Die kun je met int 21h, functie 51h doen (heb even m'n MS-DOS interrupt service overzicht weer opgegraven :Y) )

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
hehe, iig alvast bedankt

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 04:03

Exirion

Gadgetfetisjist

DOS services functies kun je overigens in borland c uitvoeren met intdos() en intdosx().

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Exirion schreef op 18 augustus 2002 @ 23:41:
[nohtml]
[...]
[/nohtml]
Die kun je met int 21h, functie 51h doen (heb even m'n MS-DOS interrupt service overzicht weer opgegraven :Y) )


waarom zou je gebruik maken van interrupts als er al een functie is die het voor je doet :)

anyway, hier de code om bij de environment van je parent te komen:
code:
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <dos.h>

int main ()
{
    int psp = getpsp ();
    int parentpsp = *(int far *)MK_FP (psp, 0x16);
    int envseg = *(int far *)MK_FP (parentpsp, 0x2c);

    char far * env = (char far *)MK_FP (envseg, 0);
}


env wijst nu naar een buffer waar allemaal ASCIIZ strings staan, afgesloten met een extra '\0'
zoiets zeg maar:
code:
1
var1=blaat\0var2=woei\0var3=aars\0\0


als je een variabele wil toevoegen moet ie dus aan het eind van de lijst. Probleempje krijg je echter als de variabele in kwestie al in de lijst staat: dan moet je die eruit halen, alles opschuiven, en m vervolgens aan het eind weer toevoegen

De implementatie van die functie laat ik aan jou over (je moet tenslotte toch iets zelf doen :Y))

.edit: kut react replacet html in codetags niet |:(

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
misschien een stomme vraag, maar ja het is al laat, hoe kan ik die stringlijst laten zien?
Gewoon met printf("%s",env); ???
of moet dat op een speciale manier?

edit:
Die lijst wijzigen moet niet zo'n probleem worden ;)

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

nou je kunt m idd wel gewoon behandelen als een gewone string, alleen dan krijg je alleen de eerste variabele te zien ("var1=blaat")

je kunt er in principe doorheen lopen door steeds de lengte van de huidige op te vragen.
Je begint bij env.
var1 = env
var2 = var1 + strlen (var1) + 1;
var3 = var2 + strlen (var2) + 1;

enzovoorts
op een gegeven moment krijg je er een met lengte 0 terug: dan ben je aan het eind

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
.oisyn schreef op 19 augustus 2002 @ 00:05:
nou je kunt m idd wel gewoon behandelen als een gewone string, alleen dan krijg je alleen de eerste variabele te zien ("var1=blaat")

je kunt er in principe doorheen lopen door steeds de lengte van de huidige op te vragen.
Je begint bij env.
var1 = env
var2 = var1 + strlen (var1) + 1;
var3 = var2 + strlen (var2) + 1;

enzovoorts
op een gegeven moment krijg je er een met lengte 0 terug: dan ben je aan het eind
Ik krijg alleen (NULL) terug ???
en ik heb zeker te weten variabelen. Kzit in Windows als je begrijpt wat ik bedoel. ;)

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmm wazig... print de waarden van psp, parentpsp en envseg eens?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
met functie: printf("%d, %d, %d\n", psp, parentpsp, env);

waarden: 4475, 4210, 4373

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Tot nu toe alvast bedankt, m'n vraag was veel moeilijker dan ik had verwacht. Maar het begint nu toch echt laat te worden en m'n ouders liggen al te pitten. Ik ga ook. Mzzl
CobraTBQ Signing off ....

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmmwacht, ik bedenk me ineens... accepteert printf wel FAR pointers naar strings? Anders is het wel logisch dat ie (NULL) geeft; de offset is namelijk 0

compile eens met het large memory model

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Iedereen bedankt die me met dit probleem geholpen heeft.
Ik heb het programma gecompiled met een Large/Huge memory modem en dan werkt het inderdaad. Ik ben nu nog even de code aan het ontwikkelen die een bestaande variabelen wijzigt. Ik zal later nog wel even de volledige source-code posten.

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Zoals beloofd!
(Ja ik weet het, wel een beetje laat)
Hier de source code zoals ik hem geschreven heb.

Hierbij wil ik wel zeggen dat de code niks voorstelt op het gedeelte na waar de environment van het parent programma opgevraagd wordt. Dat is de moeilijkste code. Tenminste naar mijn idee. Hiervoor bedank ik hierbij iedereen die me hierbij heeft geholpen.

De code is een beetje rommelig.
Om het iets of wat op te schonen heb ik de code voor het zoeken naar een bestaande variabelen en het wijzigen van een variabelen in aparte functie gezet.

Oh ja, ik ben heel slecht met het voorkomen van errors :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <ctype.h>

#define MAXSTRING 300

int envexist( char *envvar, char* myvar );
int envchange( char *envvar, char *myvar, char *myvalue );

int verbose = 0;

int main( int argc, char *argv[] )
{
    char string[MAXSTRING];
    char *final;
    int i = 0;

    int psp, parentpsp, envseg;
    char *var1;
    char far *env;

    if( argc <= 2 )
    {
        printf("%s <Question> <Env.Variable>", argv[0]);
        return 254;
    }

    if( argc == 4 && strcmp( argv[3], "-verbose") == 0 )
        verbose = 1;


    printf("%s",argv[1]);
    gets(string);

    if((final = (char *) malloc(strlen(string) + strlen(argv[2]) + 2)) == NULL)
        return 254;

    for( i = 0; i < strlen(argv[2]); i++ )
        argv[2][i] = toupper(argv[2][i]);
    strcpy( final, argv[2]);
    strcat( final, "=");
    strcat( final, string);

    psp = getpsp ();
    parentpsp = *(int far *)MK_FP (psp, 0x16);
    envseg = *(int far *)MK_FP (parentpsp, 0x2c);
    env = (char far *)MK_FP (envseg, 0);

    if(verbose == 1)
        printf("\npsp = %d\nparentpsp = %d\nenvseg = %d\n", psp, parentpsp, envseg );

    var1 = (char*) env;
    while( ( var1 = var1 + strlen(var1) + 1) != NULL )
    {
        if( envexist( var1, argv[2]) == 1 )
        {
            if( verbose == 1 )
                printf("------------- Found variable with same name -----------------\n");
            envchange(var1,argv[2],string);
            break;
        }

        if( strcmp( var1, "\0" ) == 0 )
        {
            if( verbose == 1 )
                printf("------------- Adding new variable ---------------------------\n");
            strcpy(var1, final);
            var1 = var1 + strlen(var1);
            strcpy(var1,"\0");
            var1 = var1 + 1;
            strcpy(var1,"\0");
            var1 = var1 + strlen(var1);
            strcpy(var1,"\0");
            break;
        }
    }

    free(final);

    return 0;
}

int envexist( char *envvar, char *myvar )
{
    char *temp;
    int i;

    if( ( temp = (char *) malloc(strlen(envvar)+1)) == NULL )
        return -1;

    for( i = 0; i < strlen( envvar ); i++ )
    {
        if( envvar[i] == '=' )
        {
            temp[i] = NULL;
            break;
        }
        temp[i] = toupper(envvar[i]);
    }

    if( strcmp( temp, myvar ) == 0 )
    {
        free(temp);
        return 1;
    }
    else
    {
        free(temp);
        return 0;
    }
}

int envchange( char *envvar, char *myvar, char *myvalue )
{
    char *envvar2 = envvar + strlen(envvar) + 1;
    char *temp = (char *) malloc(strlen(myvar) + strlen(myvalue) + 1);

    if( verbose == 1 )
        printf("------------- Moving variables --------------\n");

    while( strcmp( envvar2, "\0" ) != 0 )
    {
        if( verbose == 1 )
            printf("%s <- %s\n",envvar, envvar2);

        strcpy( envvar, envvar2 );
        envvar = envvar + strlen( envvar );
        strcpy( envvar, "\0");
        envvar = envvar + 1;
        envvar2 = envvar + strlen( envvar ) + 1;
    }

    strcpy( temp, myvar);
    strcat( temp, "=");
    strcat( temp, myvalue);

    strcpy( envvar, temp);
    if( verbose == 1 )
        printf("%s\n", temp);

    envvar = envvar + strlen( envvar );
    strcpy( envvar, "\0" );
    envvar = envvar + 1;
    strcpy( envvar, "\0" );
    envvar = envvar + 1;
    strcpy( envvar, "\0" );
    envvar = envvar + 1;
    strcpy( envvar, "\0" );

    free(temp);

    return 0;
}


Let wel op:
Deze code werkt alleen in pure dosmodus omdat het 16bit code is.

edit:
Dit is afgehandeld, er mag een slotje op

[ Voor 0% gewijzigd door cobratbq op 22-08-2002 22:38 . Reden: Sluiten van de topic ]

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

dus je kunt nu gewoon een env var setten die blijft bestaan als je proggie is afgesloten? koel :) ik had er eerlijk gezegd weinig hoop in (omdat je undocumented features gebruikt is het namelijk niet gegarandeerd dat het overal werkt, of dat het al werkt :))
Dit is afgehandeld, er mag een slotje op
das niet handig, want dan kunnen mensen geen vragen stellen en je kunt zelf ook niets meer toevoegen mocht je dat ooit willen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
.oisyn schreef op 22 augustus 2002 @ 23:50:
das niet handig, want dan kunnen mensen geen vragen stellen en je kunt zelf ook niets meer toevoegen mocht je dat ooit willen :)
Damn, die is slim
Misschien toch maar geen slot erop.

En ja, het is nu dus gelukt.
De reden waarom ik dit moest hebben.
Dan kan ik in een batch menutje om een string input vragen,
en die haal ik dan na de input terug uit een variabele.

En dat lukt dus prima nu ;)

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

haxor detection alarmz!

;)

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.

Pagina: 1