+ TCHAR *string = 0;\r
+ TCHAR *unformatted = 0;\r
+ unsigned long envlen;\r
+ unsigned long newlen = 0;\r
+ int op = 0;\r
+ if (value && value->string && value->string[0]) {\r
+ string = value->string;\r
+ switch (string[0]) {\r
+ case _T('+'): op = 1; break;\r
+ case _T('-'): op = -1; break;\r
+ case _T(':'): string++; break;\r
+ }\r
+ }\r
+\r
+ if (op) {\r
+ string++;\r
+ TCHAR *env = 0;\r
+ if (get_environment((TCHAR *) service_name, key, (TCHAR *) name, &env, &envlen)) return -1;\r
+ if (env) {\r
+ int ret;\r
+ if (op > 0) ret = append_to_environment_block(env, envlen, string, &unformatted, &newlen);\r
+ else ret = remove_from_environment_block(env, envlen, string, &unformatted, &newlen);\r
+ if (envlen) HeapFree(GetProcessHeap(), 0, env);\r
+ if (ret) return -1;\r
+\r
+ string = unformatted;\r
+ }\r
+ else {\r
+ /*\r
+ No existing environment.\r
+ We can't remove from an empty environment so just treat an add\r
+ operation as setting a new string.\r
+ */\r
+ if (op < 0) return 0;\r
+ op = 0;\r
+ }\r
+ }\r
+\r
+ if (! string || ! string[0]) {\r