16d528ed9Sopenharmony_ci// Copyright 2019 The Chromium Authors. All rights reserved. 26d528ed9Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 36d528ed9Sopenharmony_ci// found in the LICENSE file. 46d528ed9Sopenharmony_ci 56d528ed9Sopenharmony_ci#include <stdlib.h> 66d528ed9Sopenharmony_ci#include <iostream> 76d528ed9Sopenharmony_ci#include <string> 86d528ed9Sopenharmony_ci 96d528ed9Sopenharmony_cinamespace { 106d528ed9Sopenharmony_ci 116d528ed9Sopenharmony_ci// Returns the current user username. 126d528ed9Sopenharmony_cistd::string Username() { 136d528ed9Sopenharmony_ci const char* username = getenv("USER"); 146d528ed9Sopenharmony_ci return username ? std::string(username) : std::string(); 156d528ed9Sopenharmony_ci} 166d528ed9Sopenharmony_ci 176d528ed9Sopenharmony_ci// Writes |string| to |stream| while escaping all C escape sequences. 186d528ed9Sopenharmony_civoid EscapeString(std::ostream* stream, const std::string& string) { 196d528ed9Sopenharmony_ci for (char c : string) { 206d528ed9Sopenharmony_ci switch (c) { 216d528ed9Sopenharmony_ci case 0: 226d528ed9Sopenharmony_ci *stream << "\\0"; 236d528ed9Sopenharmony_ci break; 246d528ed9Sopenharmony_ci case '\a': 256d528ed9Sopenharmony_ci *stream << "\\a"; 266d528ed9Sopenharmony_ci break; 276d528ed9Sopenharmony_ci case '\b': 286d528ed9Sopenharmony_ci *stream << "\\b"; 296d528ed9Sopenharmony_ci break; 306d528ed9Sopenharmony_ci case '\e': 316d528ed9Sopenharmony_ci *stream << "\\e"; 326d528ed9Sopenharmony_ci break; 336d528ed9Sopenharmony_ci case '\f': 346d528ed9Sopenharmony_ci *stream << "\\f"; 356d528ed9Sopenharmony_ci break; 366d528ed9Sopenharmony_ci case '\n': 376d528ed9Sopenharmony_ci *stream << "\\n"; 386d528ed9Sopenharmony_ci break; 396d528ed9Sopenharmony_ci case '\r': 406d528ed9Sopenharmony_ci *stream << "\\r"; 416d528ed9Sopenharmony_ci break; 426d528ed9Sopenharmony_ci case '\t': 436d528ed9Sopenharmony_ci *stream << "\\t"; 446d528ed9Sopenharmony_ci break; 456d528ed9Sopenharmony_ci case '\v': 466d528ed9Sopenharmony_ci *stream << "\\v"; 476d528ed9Sopenharmony_ci break; 486d528ed9Sopenharmony_ci case '\\': 496d528ed9Sopenharmony_ci *stream << "\\\\"; 506d528ed9Sopenharmony_ci break; 516d528ed9Sopenharmony_ci case '\"': 526d528ed9Sopenharmony_ci *stream << "\\\""; 536d528ed9Sopenharmony_ci break; 546d528ed9Sopenharmony_ci default: 556d528ed9Sopenharmony_ci *stream << c; 566d528ed9Sopenharmony_ci break; 576d528ed9Sopenharmony_ci } 586d528ed9Sopenharmony_ci } 596d528ed9Sopenharmony_ci} 606d528ed9Sopenharmony_ci 616d528ed9Sopenharmony_ci} // namespace 626d528ed9Sopenharmony_ci 636d528ed9Sopenharmony_ciint main(int argc, char** argv) { 646d528ed9Sopenharmony_ci std::string username = Username(); 656d528ed9Sopenharmony_ci 666d528ed9Sopenharmony_ci std::cout << "{\"username\": \""; 676d528ed9Sopenharmony_ci EscapeString(&std::cout, username); 686d528ed9Sopenharmony_ci std::cout << "\"}" << std::endl; 696d528ed9Sopenharmony_ci 706d528ed9Sopenharmony_ci return 0; 716d528ed9Sopenharmony_ci} 72