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